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

正文內(nèi)容

基于單片機的嵌入式實時os平臺的研究與實現(xiàn)畢業(yè)論文(編輯修改稿)

2025-06-19 21:48 本頁面
 

【文章內(nèi)容簡介】 代碼組成,主要是與處理器相關(guān)的代碼、與應(yīng)用程序有關(guān)的代碼、與移植相關(guān)的代碼,如圖 : 15 圖 μ C/OSⅡ源文件結(jié)構(gòu) 與處理器無關(guān)代碼 與處理器無關(guān)的代碼主要是 、 、 、 、 、 、 、 、 、 。這些代碼大致分為一下幾個部分:內(nèi)核結(jié)構(gòu)部分、任務(wù)管理部分、時間控制塊、時間管理部分、信號管理部分、信號量管理、互斥信號量管理、時間標(biāo)志組管理、消息郵箱管理以及消息隊列管理。 與應(yīng)用相關(guān)代碼 與應(yīng)用相關(guān)的代碼主要是兩個文件 :、 。 ① 文件主要功能是實現(xiàn)操作系統(tǒng)的裁剪功能。包含了許多 μ C/OSⅡ的初始化配置選項。在 μ C/OSⅡ中每個函數(shù)只有當(dāng)通過文件 “置 1”,才刻意使用該函數(shù),該函數(shù)是否使用是通過條件編譯實現(xiàn)的。 16 ② 文件是一個主頭文件,它出現(xiàn)在每個 .C 文件的第一行。使用 的好處是所有的 .C 文件都只包含一個頭文件,程序簡潔,可讀性強。缺點是 .C 文件可能會包含一些它并不需要的頭文件,額外的增加 編譯時間。用戶刻意改寫 文件,增加自己的頭文件,但必須加在文件末尾。 與處理器相關(guān)代碼 這是移植中最關(guān)鍵的部分,內(nèi)核將應(yīng)用系統(tǒng)和底層硬件有機的結(jié)合成一個實時系統(tǒng),要使同一個內(nèi)核能適用于不同的硬件體系,就需要在內(nèi)核和硬件之間有一個中間層,這就是與處理器相關(guān)的代碼。處理器不同,這部分代碼也不同。與處理器相關(guān)的代碼是 、 。 ① 包括了用 defines 定義的與處理器相關(guān)的常量,宏和 類型定義。因為不同的處理器有不同的字長,所以 μ C/OSⅡ的移植包括了一系列的類型定義以確保其可移植性。 ② 文件中共定義了 10個函數(shù)在該文件中。但是最重要的是 OSTaskStkInit()。其他 9個函數(shù)必須聲明,但都是對系統(tǒng)內(nèi)核的擴展時用的。 OSTaskStkInit()是在用戶建立任務(wù)時被函數(shù)OSTaskCreate()和 OSTaskCreateExt()調(diào)用,是系統(tǒng)內(nèi)部自己調(diào)用的,用來對用戶任務(wù)的堆棧進行初始化,并使用建立好的進入就緒態(tài)任務(wù)的堆棧 與系統(tǒng)發(fā)生中斷并且將環(huán)境變量保存完畢時的棧結(jié)構(gòu)一致。這樣就可以用中斷返回指令使就緒的任務(wù)運行起來。 ③ 文 件里 包含了 4 個簡單 的匯 編函數(shù) 。 17 OSStartHighRdy() 、 OSCtxSw() 、 OSIntCtxSw() 、 OSTickISR() 。OSStartHighRdy()函數(shù)在多任務(wù)系統(tǒng)啟動函數(shù) OSStart()中調(diào)用。OSCtxSw()函數(shù)實在任務(wù)級切換函數(shù)中調(diào)用的。 OSIntCtxSw()在退出中斷服務(wù)函數(shù) OSIntExit()中調(diào)用,實現(xiàn)中斷級任務(wù)切 換。 OSTickISR()系統(tǒng)時鐘節(jié)拍中斷服務(wù)函數(shù),這是一個周期性中斷,為內(nèi)核提供時鐘節(jié)拍,頻率越高系統(tǒng)負荷越重。 與移植相關(guān)代碼的修改 的修改 修改后的 : /******* 文件名: ********/ ifndef __OS_CPU_H define __OS_CPU_H ifdef OS_CPU_GLOBALS define OS_CPU_EXT else define OS_CPU_EXT extern endif /******* 數(shù)據(jù)類型 *********/ /******* (編譯器相關(guān) ) **********/ typedef unsigned char BOOLEAN。 typedef unsigned char INT8U。 18 typedef signed char INT8S。 typedef unsigned int INT16U。 typedef signed int INT16S。 typedef unsigned long INT32U。 typedef signed long INT32S。 typedef float FP32。 typedef double FP64。 typedef unsigned char OS_STK。 typedef unsigned char OS_CPU_SR。 /********* 處理器相關(guān)代碼 ***********/ define OS_CRITICAL_METHOD 1 if OS_CRITICAL_METHOD == 1 define OS_ENTER_CRITICAL() EA=0 define OS_EXIT_CRITICAL() EA=1 endif define OS_STK_GROWTH 0 define OS_TASK_SW() OSCtxSw() define OS_ISR_PROTO_EXT 1 void OSCtxSw(void)。 19 void InitHardware(void) reentrant。 /*********************************************/ endif 首先,文件先定義了整型數(shù)據(jù)類型。舉例來說, INT16U 數(shù)據(jù)類型總是代表 16位的無符號整型數(shù)。為了方便起見,雖然 μ C/OSⅡ中并不使用浮點數(shù),但還是定義了浮點數(shù)據(jù)類型 。同時,將任務(wù)堆棧的寬度定義為 8 位。 其次, OS_CRITICAL_METHOD 的值意味著 OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()兩個宏調(diào)用的實現(xiàn)方法。在此 中,將 OS_CRITICAL_METHOD 的值宏定義為 1,即 OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()兩個宏調(diào)用的實現(xiàn)方法為最簡單的方法:調(diào)用相應(yīng)處理器指令關(guān)中斷和開中斷( EA=0 和 EA=1)。 最后,文件還通過宏定義指定了 OS_STK_GROWTH 的值為 0。這表明堆棧 從下(低地址)往上(高地址)遞增。而聲明函數(shù) OSCtxSw(),是用子程序調(diào)用來代替中斷調(diào)用;聲明 InitHardware(),該函數(shù)用來實現(xiàn)初始化硬件時鐘中斷等系統(tǒng)初始化工作。 的修改 在 文件中,最重要的是 OSTaskStkInit()函數(shù),OSTaskStkInit()是在用戶建立任務(wù)時被函數(shù) OSTaskCreate()和OSTaskCreateExt()調(diào)用,是系統(tǒng)內(nèi)部自己調(diào)用的,用來對用戶任務(wù)的堆棧進行初始化,并使用建立好的進入就緒態(tài)任務(wù)的堆棧與系 統(tǒng)發(fā)生中斷并且將環(huán)境變量保存完畢時的棧結(jié)構(gòu)一致。這樣就可以用中斷 20 返回指令使就緒的任務(wù)運行起來。其代碼如下: OS_STK *OSTaskStkInit (void (*task)(void *pd) reentrant, void *ppdata, OS_STK *ptos, INT16U opt) reentrant { OS_STK *stk。 ppdata = ppdata。 opt = opt。 stk = ptos。 //用戶堆棧最低有效地址 *stk++ = 15。 //用戶堆棧長度 *stk++ = (INT16U)task amp。 0xFF。 //任務(wù)地址低 8位 *stk++ = (INT16U)task 8。 //任務(wù)地址高 8位 *stk++ = 0x0A。 //ACC *stk++ = 0x0B。 //B *stk++ = 0x00。 //DPH *stk++ = 0x00。 //DPL *stk++ = 0x00。 //PSW *stk++ = 0x00。 //R0 *stk++ = (INT16U)ppdata amp。 0xFF。 //R1 *stk++ = (INT16U)ppdata 8。 //R2 *stk++ = 0x01。 //R3 *stk++ = 0x04。 //R4 *stk++ = 0x05。 //R5 21 *stk++ = 0x06。 //R6 *stk++ = 0x07。 //R7 *stk++ = (INT16U) (ptos+MaxStkSize) 8。 *stk++ = (INT16U) (ptos+MaxStkSize) amp。 0xFF。 return ((void *)ptos)。 } 的修改 移植工作的難點是在 文件上,這里用戶需要編寫4 個匯編語言函數(shù): OSStartHighRdy()、 OSCtxSw()、 OSIntCtxSw()和 OSTickISR()。其中, OSTickISR()在 中已經(jīng)用 C 語言實現(xiàn),即用定時器中斷處理了程序來代替它。因此,只需要寫 3 個匯編語言函數(shù)。 部分代碼如下 : EXTRN DATA (?C_XBP) EXTRN IDATA (OSTCBCur) EXTRN IDATA (OSTCBHighRdy) EXTRN IDATA (OSRunning) EXTRN IDATA (OSPrioCur) EXTRN IDATA (OSPrioHighRdy) EXTRN CODE (_?OSTaskSwHook) EXTRN CODE (_?OSIntEnter) EXTRN CODE (_?OSIntExit) EXTRN CODE (_?OSTimeTick) 22 在 的首部,聲明了引用的全局變量和外部子程序。接著是 3 個匯編函數(shù) OSStartHighRdy()、 OSCtxSw()、 OSIntCtxSw(): ① 調(diào)用運行優(yōu)先級最高的就緒任務(wù) 函數(shù) OSStartHighRdy()。 該函數(shù)是在操作系統(tǒng)初始化并建立了至少一個任務(wù)之后被調(diào)用的,它首先找到當(dāng)前就緒的最高優(yōu)先級任務(wù),并從該任務(wù)控制塊OS_TCB中取出堆棧指針,然后從堆棧中彈出全部寄存器 ,并 RET返回。 ② 任務(wù)切換函數(shù) OSCtxSw()。 該函數(shù)是由于執(zhí)行進入任務(wù)切換宏 OS_TASK_SW 而進入的,它是一個任務(wù)級的切換函數(shù),它的主要任務(wù)是保存當(dāng)前任務(wù)的 CPU現(xiàn)場并恢復(fù)最高優(yōu)先級任務(wù)的 CPU 現(xiàn)場。 ③ 中斷任務(wù)切換函數(shù) OSIntCtxSw()。 該函數(shù)的工作是在中斷處理程序退出時進行任務(wù)切換。OSIntCtxSw()的代碼大部分都與 OSCtxSw()相同,僅僅在以下兩點有所區(qū)別 :由于中斷已經(jīng)發(fā)生,此處不需要再保存寄存器; OSIntCtxSw()需要調(diào)整堆棧指針,去掉堆棧中一些不需要的內(nèi)容,以使堆棧中止包含任務(wù)的運行環(huán)境。 μ C/OSⅡ在 STC89C52 上的移植 Keil C51 編譯器簡介 大部分的 μ C/OSⅡ代碼是用 C 語言寫的。因此,移植 μ C/OSⅡ需要一個 C 編譯器,此處選擇 Keil C51 作為開發(fā)平臺。 Keil C51 是美國 Keil Software 公司出品的基于 80C51 內(nèi)核的微處理器軟件開發(fā)平臺,內(nèi)嵌多種符合當(dāng)前工業(yè)標(biāo)準(zhǔn)的開發(fā)工具,可 23 以完成從工程的建立、管理、軟件編譯、鏈接,到目標(biāo)代碼的生成、軟件方針和硬件方針等完整的開發(fā)流程。尤其 C編譯工具在產(chǎn)生代碼的準(zhǔn)確性和效率方面達到了較高的水平,而且刻意附加靈活的控制選項,在開發(fā)大型項目時非常理想。 原則上我們不用修改與處理器無關(guān)的代碼,但是由于 Keil C51編譯器的特殊性,這些代碼仍要多出改動。因為 Keil C51 在缺省情況下,編譯的代碼不可重入,而多任務(wù)系統(tǒng)要求并發(fā)操作導(dǎo)致重入,所以要在每個 C函數(shù)及其聲明后標(biāo)注 reentrant 關(guān)鍵字。 本論文采用的是 Keil C51 V8 版本作為開發(fā)平臺。 移植測試程序 為了證明 μ C/OSⅡ能在 STC89C52上成功的移植,可以編寫一個測試程序來證明。本測試程序主要測試 μ C/OSⅡ內(nèi)核在 STC89C52運行的正確性。測試程序?qū)釉?I/O口的
點擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1