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

正文內(nèi)容

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

2025-06-19 21:48 本頁(yè)面
 

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