freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于stm32的嵌入式操作系統(tǒng)程序設(shè)計(jì)及實(shí)現(xiàn)本科畢業(yè)論文(編輯修改稿)

2024-07-23 09:50 本頁面
 

【文章內(nèi)容簡介】 中,主要聲明了一些與微處理器相關(guān)的常量、宏和typedef。 定義與處理器無關(guān)的數(shù)據(jù)類型 typede f unsigned char BOOLEAN。 typedef unsigned char INT8U。 typedef signed char NT8S。 typedef unsigned short INT16U。 typedef signed short INT16S。 typedef unsigned int INT32U。 typedef signed int NT32S。 typedef float FP32。 typedef double FP64。 typedef unsigned int OS_STK。 typedef unsigned int OS_CPU_SR。 在STM32處理器及 keil MDK 或者IAR 編譯環(huán)境中可以通過查手冊得知short類型是16位而int類型是32位,這對于CortexM3 內(nèi)核是一致的。故這部分代碼無需修改。盡管181。C/OSII定義了float 類型和double 類型,但為了方便移植它們在181。C/OSII源代碼中并未使用。為了方便使用堆棧, 181。C/OSII定義了一個(gè)堆棧數(shù)據(jù)類型。在CortexM3 中寄存器為32位,故定義堆棧的長度也為32位。武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙8CortexM3 狀態(tài)寄存器為32位,定義OS_CPU_SR主要是為了在進(jìn)出臨界代碼段保存狀態(tài)寄存器。 (2)臨界代碼段 181。C/OSII為了保證某段代碼的完整執(zhí)行,需要臨時(shí)的關(guān)閉中斷,在這段代碼執(zhí)行完成之后再打開中斷。這樣的代碼段稱作臨界代碼段。181。C/OSII 通過定義兩個(gè)宏OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 來分別實(shí)現(xiàn)中斷的關(guān)閉和打開。一般來說,采用方法3來實(shí)現(xiàn)這兩個(gè)宏。這兩個(gè)宏分別定義如下: define OS_CRITICAL_METHOD 3 define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save()。} define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr)。} 函數(shù)OS_CPU_SR_Save()和OS_CPU_SR_Restore(cpu_sr)中定義。同時(shí)得注意,在使用這兩個(gè)宏之前,必須定義OS_CPU_SR cpu_sr。否則編譯時(shí)將出錯(cuò)。 (3)棧的增長方向 盡管181。C/OSII支持兩種方向生長的棧,但對于以CortexM3為內(nèi)核的STM32 微處理器來說,它支持向下增長的滿棧,故需要定義棧增長方向宏為1。即定義成如下形式 define OS_STK_GROWTH 1 (4)任務(wù)級任務(wù)切換 任務(wù)級任務(wù)切換調(diào)用宏OS_TASK_SW()來實(shí)現(xiàn)。因?yàn)檫@個(gè)宏也是與處理器相關(guān)的, 中描述。 (5)其他函數(shù)聲明 在OS_ ,還聲明了以下幾個(gè)函數(shù),這幾個(gè)函數(shù)均在。 void OSCtxSw(void)。 void OSIntCtxSw(void)。 void OSStartHighRdy(void)。 void OS_CPU_PendSVHandler(void)。 (6)與處理器相關(guān)的匯編代碼()在OS_CP 。 OS_CPU_SR_Save()。 OS_CPU_SR_Restore()。 OSStartHighRdy()。 OSCtxSw()。 OSIntCtxSw()。 函數(shù)實(shí)現(xiàn) 武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙9(1)關(guān)中斷函數(shù)(OS_CPU_SR_Save()) 即先保存當(dāng)前的狀態(tài)寄存器然后關(guān)中斷。故關(guān)中斷實(shí)現(xiàn)代碼如下 OS_CPU_SR_Save MRS R0, PRIMASK; CPSID I BX LR 這也是宏OS_ENTER_CRITICAL() 的最終實(shí)現(xiàn)。 (2)恢復(fù)中斷函數(shù)(OS_CPU_SR_Restore() ) 這是宏OS_EXIT_CRITICAL() 的最終實(shí)現(xiàn)。也就是將狀態(tài)寄存器的內(nèi)容從R0中恢復(fù),然后跳轉(zhuǎn)回去。此函數(shù)完成的將中斷狀態(tài)恢復(fù)到關(guān)中斷前的狀態(tài)。其代碼如下: OS_CPU_SR_Restore MSR PRIMASK, R0 BX LR CortexM3處理器有單獨(dú)的指令來打開或者關(guān)閉中斷,所以這兩個(gè)函數(shù)實(shí)現(xiàn)起來很簡單。 (3)啟動(dòng)最高優(yōu)先級任務(wù)運(yùn)行(OSStartHighRdy()) OSStart()調(diào)用OSStartHighRdy()來啟動(dòng)最高優(yōu)先級任務(wù)的運(yùn)行,從而啟動(dòng)整個(gè)系統(tǒng)。OSStartHighRdy()主要完成以下幾項(xiàng)工作: ① 為任務(wù)切換設(shè)置PendSV的優(yōu)先級;② 為第一次任務(wù)切換設(shè)置棧指針為0;③ 設(shè)置OSRunning = TRUE,以表明系統(tǒng)正在運(yùn)行;④ 觸發(fā)一次 PendSV,打開中斷等待第一次任務(wù)的切換。 (4)任務(wù)級和中斷級任務(wù)切換 因?yàn)镃ortexM3 進(jìn)入異常自動(dòng)保存寄存器 R3R0,R12,LR ,PC和xPSR這種的特殊機(jī)制,這兩個(gè)函數(shù)都是觸發(fā)一次PendSV來實(shí)現(xiàn)任務(wù)的切換。首先是微處理器自動(dòng)保存上面提到的寄存器,然后把當(dāng)前的堆棧指針保存到任務(wù)的棧中,將要切換的任務(wù)的優(yōu)先級和任務(wù)控制塊的指針賦值給運(yùn)行時(shí)的最高優(yōu)先級指針和運(yùn)行時(shí)的任務(wù)控制塊指針,最后再把要運(yùn)行的任務(wù)的堆棧指針賦值給微處理器的堆棧指針,這樣就可以退出中斷服務(wù)程序了。中斷服務(wù)程序退出的時(shí)候?qū)⒆詣?dòng)出棧R3R0 ,R12 ,LR ,PC 和xPSR 。具體的PendSV服務(wù)程序的偽代碼如下: OS_CPU_PendSVHandler : // 進(jìn)入異常,處理器自動(dòng)保存R3R0,R12,LR,PC 和xPSR if (PSP != NULL) //判斷不是開始第一次任務(wù) { 武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙10保存R4R11到任務(wù)的堆棧; OSTCBCurOSTCBStkPtr = SP。 //保存堆棧的指針到任務(wù)控制塊 } OSTaskSwHook()。 //實(shí)現(xiàn)用戶擴(kuò)展功能而定義的鉤子 OSPrioCur = OSPrioHighRdy。 //設(shè)置運(yùn)行任務(wù)為最高優(yōu)先級就緒任務(wù) OSTCBCur = OSTCBHighRdy。 // 設(shè)置運(yùn)行的任務(wù)控制塊為最高 //就緒任控制塊務(wù) PSP = OSTCBHighRdyOSTCBStkPtr。//將要切換的任務(wù)堆棧指 // 針賦給微處理器的堆棧指 // 針從而實(shí)現(xiàn)切換 從堆棧中恢復(fù) R4R11。 從異常中返回; // 退出異常,處理器自動(dòng)恢復(fù)R3R0,R12,LR,PC 和xPSR 這樣很容易寫出PendSV中斷服務(wù)程序的代碼了。 (5)與CPU 相關(guān)的C 函數(shù)和鉤子函數(shù)( ) 這個(gè)文件中包含10個(gè)函數(shù),具體如下: OSInitHookBegin ()。 OSInitHookEnd ()。 OSTaskCreateHook ()。 OSTaskDelHook ()。 OSTaskIdleHook ()。 OSTaskStatHook ()。 OSTaskStkInit ()。 OSTaskSwHook ()。 OSTCBInitHook ()。 OSTimeTickHook ()。 這10個(gè)函數(shù)有9個(gè)是為了擴(kuò)展用戶功能而定義的鉤子函數(shù),這些鉤子函數(shù)可以都為空函數(shù),也可以加上一些用戶需要的擴(kuò)展功能。另外一個(gè)不是鉤子函數(shù),它是OSTaskStkInit()。這個(gè)函數(shù)的功能是當(dāng)一個(gè)任務(wù)被創(chuàng)建時(shí),它完成這個(gè)任務(wù)堆棧的初始化。這個(gè)函數(shù)首先將用戶為任務(wù)分配的堆棧頂?shù)刂焚x值給一個(gè)棧指針變量,然后再通過這個(gè)棧指針向任務(wù)的??臻g寫入初值。這個(gè)初值無關(guān)緊要,為0就可以了。這個(gè)函數(shù)的代碼時(shí)下如下: OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt) { OS_STK *stk。 (void)opt。 //防止編譯器報(bào)錯(cuò) stk = ptos。 // 將棧頂?shù)刂焚x值給棧指針變量 武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙11 // 以進(jìn)入異常的順序來給棧賦初值 *(stk) = (INT32U)0x00000000L。 //xPSR *(stk) = (INT32U)task。 //Entry Point *(stk) = (INT32U)0x00000000L。 // R14 (LR) *(stk) = (INT32U)0x00000000L。 //R12 *(stk) = (INT32U)0x00000000L。 //R3 *(stk) = (INT32U)0x00000000L。 // R2 *(stk) = (INT32U)0x00000000L。 // R1 *(stk) = (INT32U)p_arg。 //R0 : 傳遞的參數(shù) // 剩下的寄存器初始化 *(stk) = (INT32U)0x00000000L。 // R11 *(stk) = (INT32U)0x00000000L。 //R10 *(stk) = (INT32U)0x00000000L。 // R9 *(stk) = (INT32U)0x00000000L。 //R8 *(stk) = (INT32U)0x00000000L。 //R7 *(stk) = (INT32U)0x00000000L。 // R6 *(stk) = (INT32U)0x00000000L。 // R5 *(stk) = (INT32U)0x00000000L。 // R4 return (stk)。 } 其他的鉤子函數(shù)都為空函數(shù)。這樣,整個(gè)移植的代碼就介紹完了。整個(gè)移植的過程非常容易。剩下的工作就是編寫用戶任務(wù),并在開發(fā)板上驗(yàn)證,以此來驗(yàn)證該移植方案是可行的和成功的。武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙123 LCD 屏程序設(shè)計(jì)及調(diào)試 工具概述RVMDK 源自德國的 KEIL 公司,是 RealView MDK 的簡稱。RealView MDK 集成了業(yè)內(nèi)最領(lǐng)先的技術(shù),支持 ARMARM9 和 CortexM3 核處理器,自動(dòng)配置啟動(dòng)代碼,集成 Flash 燒寫模塊,強(qiáng)大的 Simulation 設(shè)備模塊,性能分析等功能。 keil4 工程建立以及仿真方法(1)新建工程。打開 MDK 軟件,選擇 Project→New uVision Project 菜單項(xiàng),新建一個(gè)文件夾名為“畢業(yè)設(shè)計(jì) ”,保存,則彈出器件選擇對話框,這里選擇 STM32F103RB。單擊“OK” 按鈕,則彈出一個(gè)對話框加載啟動(dòng)文件到工程中。打開“畢業(yè)設(shè)計(jì) ”文件夾,在里面添加子文件夾(2)添加系統(tǒng)文件與工程管理?;氐健爱厴I(yè)設(shè)計(jì) ”文件夾中,把系統(tǒng) SYSTEM 文件夾(delay,sys,usart 文件夾)復(fù)制過來,再建立 main 和 hardware 文件夾用于主函數(shù)和各外設(shè)資源函數(shù)。回到工程中,點(diǎn)擊 man
點(diǎn)擊復(fù)制文檔內(nèi)容
外語相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1