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

正文內(nèi)容

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

2024-07-23 09:50 本頁面
 

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