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

正文內(nèi)容

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

2024-10-01 15:11 本頁面
 

【文章內(nèi)容簡介】 包括創(chuàng)建任務(wù),刪除任務(wù),改變?nèi)蝿?wù)的優(yōu)先級,任務(wù)掛起和恢復(fù)等。系統(tǒng)初始化時(shí)會(huì)自動(dòng)產(chǎn)生兩個(gè)任務(wù):一個(gè)是空閑任務(wù),它的優(yōu)先級最低,該任務(wù)僅給一個(gè)整型變量做累加運(yùn)算;另一個(gè)是統(tǒng)計(jì)任務(wù),它的優(yōu)先級為次低,該任務(wù)負(fù)責(zé)統(tǒng)計(jì)當(dāng)前 CPU的利用率。 181。C/OSII 任務(wù)間通信方式 ( 1) 信號量 信號量由兩部 分組成:一部分是 16位的無符號整型信號量的計(jì)數(shù)值;另一部分是由等待該信號量的任務(wù)組成的等待任務(wù)表 。 信號量用于對共享資源的訪問,用鑰匙符號,符號旁數(shù)字代表可用資源數(shù),對于二值信號量該值為 1。 信號量還可用于表示某事件的發(fā)生,用旗幟符號表示,符號旁數(shù)字代表事件已經(jīng)發(fā)生的次數(shù) 。 互斥型信號量用于處理共享資源 。 武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙 7 ( 2) 消息郵箱 一種通信機(jī)制,可以使一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送一個(gè)指針型的變量,通常該指針指向一個(gè)包含了消息的特定數(shù)據(jù)結(jié)構(gòu)。 ( 3) 消息隊(duì)列 另一種通信機(jī)制,允許一個(gè)任務(wù)或者中斷服務(wù)子程序向另一 個(gè)任務(wù)發(fā)送以指針方式定義的變量或其它任務(wù),因具體應(yīng)用不同,每個(gè)指針指向的包含了消息的數(shù)據(jù)結(jié)構(gòu)的變量類型也有所不同。 STM32 上移植方法 平臺需求 181。C/OSII的正常運(yùn)行需要處理器平臺滿足以下要求: ( 1) 處理器的 C編譯器 能產(chǎn)生可重入代碼。 ( 2) 用 C語言就可以打開和關(guān)閉中斷。 ( 3) 處理器支持中斷,并且能產(chǎn)生定時(shí)中斷 (通常在 10至 100Hz之間 )。 ( 4) 處理器支持能夠容納一定量數(shù)據(jù) (可能是幾千字節(jié) )的硬件堆棧。 ( 5) 處理器有將堆棧指針和其它 CPU寄存器讀出和存儲(chǔ)到堆?;騼?nèi)存中的指令。 移植方法 ( 1) 內(nèi)核頭文件( ) 在 OS_CP 中,主要聲明了一些與微處理器相關(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位。CortexM3 狀態(tài)寄存器為 32位,定義 OS_CPU_SR主要是為了在進(jìn)出臨界代碼 段武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙 8 保存狀態(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)的,因此這個(gè)宏在 。 ( 5) 其他函數(shù)聲明 在 OS_ ,還聲明了以下幾個(gè)函數(shù),這幾個(gè)函數(shù)均在 中實(shí)現(xiàn)。 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) ( 1) 關(guān)中斷函數(shù)( OS_CPU_SR_Save()) 即先保存當(dāng)前的狀態(tài)寄存器然后關(guān)中斷。故關(guān)中斷實(shí)現(xiàn)代碼如下 武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙 9 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)?CortexM3進(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ù) { 保存 R4R11到任務(wù)的堆棧; OSTCBCurOSTCBStkPtr = SP。 //保存堆棧的指針到任務(wù)控制塊 } 武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙 10 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ù)分配的堆棧頂 地址賦值給一個(gè)棧指針變量,然后再通過這個(gè)棧指針向任務(wù)的棧空間寫入初值。這個(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值給棧指針變量 // 以進(jìn)入異常的順序來給棧賦初值 *(stk) = (INT32U)0x00000000L。 //xPSR *(stk) = (INT32U)task。 //Entry Point 武昌工學(xué)院畢業(yè)論文(設(shè)計(jì))專用稿紙 11 *(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ì))專用稿紙 12 3 LCD 屏程序設(shè)計(jì)及調(diào)試 工 具概述 RVMDK 源自德國的 KEIL 公司,是 RealView MDK 的簡稱。 RealView MDK集成了業(yè)內(nèi)最領(lǐng)先的技術(shù),支持 ARM ARM9 和 CortexM3 核處理器,自動(dòng)配置啟動(dòng)代碼,集成 Flash 燒寫模塊,強(qiáng)大的 Simulation 設(shè)備模塊,性能分析等功能。 keil4 工程建立以及仿真方法 ( 1) 新建工程 。
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1