版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、uC/OS-II概述uC/OS-II在特定處理器上的移植工作絕大部分集中在多任務(wù)切換的實(shí)現(xiàn)上,因?yàn)檫@部分代碼主要是用來保存和恢復(fù)處理器現(xiàn)場,許多操作如讀寫寄存器操作不能用C語言,只能使用特定的處理器的匯編語言來完成。將uC/OS-II移植到ARM處理器上,需要完成的工作非常簡單,大部分的修改工作集中在三個(gè)和體系結(jié)構(gòu)相關(guān)的文件中,代碼量大約是500行。這三個(gè)文件是OS_CPU_C.c、OS_CPU_C.H以及OS_CPU_A.S。1C/OS-II的文件結(jié)構(gòu)2OS_CPU.H的移植數(shù)據(jù)類型定義typedef unsigned char BOOLEAN;typedef unsigned char I
2、NT8U; /* Unsigned 8 bit quantity */typedef signed char INT8S; /* Signed 8 bit quantity */typedef unsigned int INT16U; /* Unsigned 16 bit quantity */typedef signed int INT16S; /* Signed 16 bit quantity */typedef unsigned long INT32U; /* Unsigned 32 bit quantity */typedef signed long INT32S; /* Signed
3、 32 bit quantity */typedef float FP32; /* Single precision floating point */typedef double FP64; /* Double precision floating point */* Define data types for backward compatibility . */#define BYTE INT8S /* . to uC/OS V1.xx. Not actually needed for . */#define UBYTE INT8U /* . uC/OS-II. */#define WO
4、RD INT16S #define UWORD INT16U#define LONG INT32S#define ULONG INT32U堆棧單位定義typedef unsigned int OS_STK; /* Each stack entry is 16-bit wide */3OS_CPU.H的移植ARM處理器相關(guān)宏定義#defineOS_ENTER_CRITICAL()ARMDisableInt()#defineOS_EXIT_CRITICAL()ARMEnableInt()堆棧增長方向堆棧由高地址向低地址增長,這個(gè)也是和編譯器有關(guān)的,當(dāng)進(jìn)行函數(shù)調(diào)用時(shí),入口參數(shù)和返回地址一般都會(huì)保存在
5、當(dāng)前任務(wù)的堆棧中,編譯器的編譯選項(xiàng)和由此生成的堆棧指令就會(huì)決定堆棧的增長方向。#define OS_STK_GROWTH 14OS_CPU.c的移植任務(wù)堆棧初始化該函數(shù)由OSTaskCreate()或OSTaskCreateExt()調(diào)用,用來初始化任務(wù)的堆棧并返回新的堆棧指針stk。初始狀態(tài)的堆棧模擬發(fā)生一次中斷后的堆棧結(jié)構(gòu)。在ARM體系結(jié)構(gòu)下,任務(wù)堆棧空間由高至低依次將保存著pc、lr、r12、r11、r10、 r1、r0、CPSR、SPSR,下圖說明了OSTaskStkInit()初始化后的也是新創(chuàng)建任務(wù)的堆棧內(nèi)容。堆棧初始化工作結(jié)束后,OSTaskStkInit()返回新的堆棧棧頂指針
6、,OSTaskCreate()或 OSTaskCreateExt()將指針保存在任務(wù)的OS_TCB中。5OS_CPU.c的移植系統(tǒng)HOOK函數(shù):在這個(gè)文件里面還需要實(shí)現(xiàn)幾個(gè)操作系統(tǒng)規(guī)定的hook函數(shù),這些函數(shù)為用戶定義函數(shù),它將在相應(yīng)的操作系統(tǒng)調(diào)用后執(zhí)行由用戶定義的這些hook函數(shù),執(zhí)行特定的用戶操作,如果沒有特殊需求,則只需要簡單地將它們都實(shí)現(xiàn)為空函數(shù)就可以。這些函數(shù)包括:OSSTaskCreateHook( )OSTaskDelHook( )OSTaskSwHook( )OSTaskStatHook( )OSTimeTickHook( )6OS_CPU.c的移植中斷級任務(wù)切換函數(shù)該函數(shù)由O
7、SIntExit()和OSExIntExit()調(diào)用。它是在時(shí)鐘中斷服務(wù)例程中發(fā)現(xiàn)有高優(yōu)先級任務(wù)等待的時(shí)鐘信號到來,則需要在中斷退出后并不返回被中斷任務(wù),而是直接調(diào)度就緒的高優(yōu)先級任務(wù)執(zhí)行。這樣做的目的主要是能夠盡快地讓高優(yōu)先級的任務(wù)得到響應(yīng),保證系統(tǒng)的實(shí)時(shí)性能。該函數(shù)通過設(shè)置一個(gè)全局變量need_to_swap_context標(biāo)志以表示在中斷服務(wù)程序中進(jìn)行任務(wù)切換,并在OSTickISR()中判斷該變量以進(jìn)行正確的動(dòng)作。其函數(shù)如下:void OSIntCtxSw(void)need_to_swap_context = 1;7OS_CPU.S的移植 時(shí)鐘節(jié)拍中斷服務(wù)函數(shù)時(shí)鐘節(jié)拍是特定的周期性中
8、斷。這個(gè)中斷可以看作是系統(tǒng)心臟的脈動(dòng)。時(shí)鐘的節(jié)拍式中斷使得內(nèi)核可以將任務(wù)延時(shí)若干個(gè)整數(shù)時(shí)鐘節(jié)拍,及當(dāng)任務(wù)等待事件發(fā)生時(shí),提供等待超時(shí)的依據(jù)。時(shí)鐘節(jié)拍率越快,系統(tǒng)的額外開銷就越大。中斷之間的時(shí)間間隔取決于不同的應(yīng)用,本系統(tǒng)使用S3C44B0的timer 0作為時(shí)鐘節(jié)拍源,產(chǎn)生間隔10mS的時(shí)鐘節(jié)拍。OSTickISR()就是時(shí)鐘節(jié)拍中斷服務(wù)函數(shù),也就是S3C44B0的timer 0的中斷處理函數(shù)。8OS_CPU.S的移植 OSTickISROSTickISR()首先在被中斷任務(wù)堆棧中保存CPU寄存器的值,然后調(diào)用OSIntEnter()。隨后調(diào)用OSTimeTick(),檢查所有處于延時(shí)等待狀態(tài)
9、的任務(wù),判斷是否有延時(shí)結(jié)束就緒的任務(wù)。最后調(diào)用OSIntExit(),如果在中斷中(或其他嵌套的中斷)有更高優(yōu)先級的任務(wù)就緒,并且當(dāng)前中斷為中斷嵌套的最后一層。OSIntExit()將進(jìn)行任務(wù)調(diào)度。如果進(jìn)行了任務(wù)調(diào)度,OSIntExit()將不再返回調(diào)用者,而是用新任務(wù)的堆棧中的寄存器數(shù)值恢復(fù)CPU現(xiàn)場,然后實(shí)現(xiàn)任務(wù)切換。如果當(dāng)前中斷不是中斷嵌套的最后一層,或中斷中沒有改變?nèi)蝿?wù)的就緒狀態(tài),OSIntExit()將返回調(diào)用者OSTickISR(),最后OSTickISR()返回被中斷的任務(wù)。9OS_CPU.S的移植 OSTickISROSTickISR()先關(guān)閉中斷,然后清除timer 0中斷標(biāo)
10、記。接著將調(diào)用IrqStart(),uC/OS-II要求在中斷服務(wù)程序開頭將記錄中斷嵌套層數(shù)的全局變量OSIntNesting加1。隨后OSTickISR()調(diào)用OSTimeTick(),檢查所有處于延時(shí)等待狀態(tài)的任務(wù),判斷是否有延時(shí)結(jié)束就緒的任務(wù)。然后調(diào)用IrqFinish()函數(shù),IrqFinish()將調(diào)用OSIntExit()函數(shù),如果在中斷中(或其他嵌套的中斷)有更高優(yōu)先級的任務(wù)就緒,并且當(dāng)前中斷為中斷嵌套的最后一層,OSIntExit()將進(jìn)行任務(wù)調(diào)度,并在OSIntCtxSw()函數(shù)中設(shè)置need_to_swap_context標(biāo)記為1。接下來OSTickISR()判斷need_
11、to_swap_context標(biāo)記是否為1,如果為1則進(jìn)行任務(wù)調(diào)度,將不再返回被中斷的任務(wù),而是用新任務(wù)的堆棧中的寄存器數(shù)值恢復(fù)CPU現(xiàn)場,然后實(shí)現(xiàn)任務(wù)切換。如果當(dāng)前中斷不是中斷嵌套的最后一層,或中斷中沒有改變?nèi)蝿?wù)的就緒狀態(tài),OSTickISR()將返回被中斷的任務(wù)。10OS_CPU.S的移植 退出臨界區(qū)和進(jìn)入臨界區(qū)函數(shù)進(jìn)入臨界區(qū):關(guān)閉中斷.GLOBALARMDisableIntARMDisableInt:STMDBsp!, r0MRSr0, CPSRORRr0, r0, #NoIntMSRCPSR_cxsf, r0LDMIAsp!, r0MOVpc, lr退出臨界區(qū)的時(shí)候恢復(fù)原來的中斷狀態(tài).
12、GLOBALARMEnableIntARMEnableInt:STMDBsp!, r0MRSr0, CPSRBICr0, r0, #NoIntMSRCPSR_cxsf, r0LDMIAsp!, r0MOVpc, lr11OS_CPU.S的移植 任務(wù)級上下文切換函數(shù)OS_TASK_SW(),當(dāng)任務(wù)因?yàn)楸蛔枞鲃?dòng)請求cpu調(diào)度時(shí)被執(zhí)行,由于此時(shí)的任務(wù)切換都是在非異常模式下進(jìn)行的,因此區(qū)別于中斷級別的任務(wù)切換。它的工作是先將當(dāng)前任務(wù)的cpu現(xiàn)場保存到該任務(wù)堆棧中,然后獲得最高優(yōu)先級任務(wù)的堆棧指針,從該堆棧中恢復(fù)此任務(wù)的cpu現(xiàn)場,使之繼續(xù)執(zhí)行。這樣就完成了一次任務(wù)切換。12OS_CPU.S的移植
13、OSStartHighRdOSStartHighRd()函數(shù)是在OSStart()多任務(wù)啟動(dòng)之后,從最高優(yōu)先級任務(wù)的TCB控制塊中獲得該任務(wù)的堆棧指針sp,通過sp依次將cpu現(xiàn)場恢復(fù),這時(shí)系統(tǒng)就將控制權(quán)交給用戶創(chuàng)建的該任務(wù)進(jìn)程,直到該任務(wù)被阻塞或者被其他更高優(yōu)先級的任務(wù)搶占cpu。該函數(shù)僅僅在多任務(wù)啟動(dòng)時(shí)被執(zhí)行一次,用來啟動(dòng)第一個(gè),也就是最高優(yōu)先級的任務(wù)執(zhí)行。.GLOBALOSStartHighRdyOSStartHighRdy:LDRr4, addr_OSTCBCur Get current task TCB addressLDRr5, addr_OSTCBHighRdy Get highest priority task TCB addressLDRr5, r5 get stack pointerLDRsp, r5 switch to the new stackSTRr5, r4 set new current task TCB addressLDMFDsp!, r4MSRSPSR_cxsf, r4LDMFDsp!, r4 get new state from top of the stackMSRCPSR_cxsf, r4 CPS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《情侶戀愛生活2025年度情感責(zé)任協(xié)議書35條規(guī)定》2篇
- 二零二五年光伏發(fā)電站10千伏電力接入施工合同2篇
- 空間技術(shù)職保資產(chǎn)管理辦法
- 國際社會(huì)服務(wù)機(jī)構(gòu)辦公區(qū)租賃合同
- 物業(yè)管理仲裁補(bǔ)充協(xié)議書
- 公司員工勞動(dòng)合同(2篇)
- 家庭豬舍租賃合同
- 公積金貸款合同范本(2篇)
- 陵園墓地招投標(biāo)廉潔合同模
- 2025版空放借款合同范本:簡易模板全面解析借款風(fēng)險(xiǎn)3篇
- 農(nóng)耕研學(xué)基地可行性方案
- 2024年國投信托有限公司招聘筆試參考題庫含答案解析
- 自身免疫性肝炎的護(hù)理查房
- 《卜算子-黃州定慧院寓居作》理解性默寫(含答案)
- 少先隊(duì)大隊(duì)輔導(dǎo)員勝任力模型研究
- 人才隊(duì)伍建設(shè)實(shí)施方案
- 德欽縣云嶺鄉(xiāng)、佛山鄉(xiāng)部分村落生活垃圾處置工程環(huán)評報(bào)告
- 毒理學(xué)基礎(chǔ)期末考試試題整理大全附答案
- 瑞幸咖啡案例分析
- 寒假安全教育主題班會(huì)PPT-
- 學(xué)生資助手冊
評論
0/150
提交評論