版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、uC/OS-II操作系統(tǒng)uC/OS-II操作系統(tǒng)簡介及開發(fā)過程內(nèi) 容一、 uCOS-II操作系統(tǒng)簡介二、 uCOS-II操作系統(tǒng)內(nèi)核結(jié)構(gòu)三、 uCOS-II操作系統(tǒng)任務(wù)管理四、 uCOS-II操作系統(tǒng)內(nèi)存管理五、 uCOS-II操作系統(tǒng)時間管理六、 uCOS-II操作系統(tǒng)任務(wù)間的通訊七、 uCOS-II操作系統(tǒng)移植八、 uCOS-II操作系統(tǒng)實驗一、 uCOS-II操作系統(tǒng)簡介1.1 uC/OS-II簡介1.2 uC/OS-II特點1.3 C/OS-II應(yīng)用1.1 uC/OS-II簡介1、uC/OS-II是一個簡單、高效的嵌入式實時操作系統(tǒng)內(nèi)核2、支持 x86、ARM、PowerPC、MIPS
2、 等眾多體系結(jié)構(gòu)3、可從網(wǎng)站上獲得全部源碼及其在各種體系結(jié)構(gòu)平臺上的移植范例。1.2 uC/OS-II特點1、uC/OS-II內(nèi)核具有很強(qiáng)的可移植性。2、具有可搶占的實時多任務(wù)調(diào)度功能。3、提供了許多系統(tǒng)服務(wù),如信號量、消息隊列、郵箱、內(nèi)存管理、時間函數(shù)等4、這些功能可以根據(jù)不同的需求進(jìn)行裁減。1.3 C/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:醫(yī)療器械移動電話路由器工業(yè)控制GPS 導(dǎo)航系統(tǒng)智能儀器更多二、 uCOS-II操作系統(tǒng)內(nèi)核結(jié)構(gòu)2.1 臨界段2.2 任務(wù)2.3 任務(wù)狀態(tài)2.4 任務(wù)控制塊2.5 任務(wù)就緒表2.6 任務(wù)調(diào)度2.7 中斷處理2.8 時鐘節(jié)拍 2.9 C/OS-初
3、始化2.10 C/OS-啟動 目的:為了實現(xiàn)資源共享。實現(xiàn)方法:進(jìn)入臨界段時關(guān)中斷,退出臨界段時開中斷。這使得C/OS-能夠在臨界段代碼時避免被其它任務(wù)或中斷服務(wù)所中斷。 C/OS-定義兩個宏(macros)來開關(guān)中斷。分別是:進(jìn)入臨界段:OS_ENTER_CRITICAL()退出臨界段:OS_EXIT_CRITICAL()。這兩個宏的定義取決于所用的微處理器,每種微處理器都有自己的OS_CPU.H文件。 2.1 臨界段(Critical Sections)2.2 任務(wù)(task)一個任務(wù)通常是一個無限的循環(huán):void mytask(void *pdata) do init while (1)
4、 do something; waiting; do something; 任務(wù)(task)C/OS-可以管理多達(dá)64個任務(wù)。優(yōu)先級為0-63 優(yōu)先級號越低,任務(wù)的優(yōu)先級越高。每個任務(wù)的優(yōu)先級不能相同。保留優(yōu)先級:高優(yōu)先級:0、1、2、3低優(yōu)先級:OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0用戶可以有多達(dá)56個應(yīng)用任務(wù)。2.3 任務(wù)狀態(tài)就緒休眠等待或掛起運行中斷服務(wù)刪除任務(wù)刪除任務(wù)刪除任務(wù)中斷中斷結(jié)束創(chuàng)建任務(wù)任務(wù)調(diào)度任務(wù)被搶占等待消息掛起收到消息掛起時間到任務(wù)狀態(tài)休眠態(tài) - OSTaskCreate()或O
5、STaskCreateExt() - 就緒態(tài)等待態(tài),就緒態(tài),運行態(tài) - OSTaskDel() - 休眠態(tài)就緒態(tài) - OSStart() - 運行態(tài)運行態(tài) - OSTimeDly()或OSTimeDlyHMSM() , OSSemPend(),OSMboxPend(),或OSQPend() - 等待態(tài)等待態(tài) - OSTimeTick() -就緒態(tài)空閑任務(wù) - OSTaskIdle() 2.4 任務(wù)控制塊(TCB)任務(wù)控制塊 OS_TCB 是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針,狀態(tài),優(yōu)先級,任務(wù)表位置,和任務(wù)鏈表指針等。一旦任務(wù)建立了,任務(wù)控制塊OS_TCBs將被賦值。所有的任
6、務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。任務(wù)控制塊結(jié)構(gòu)的主要成員OS_STK *OSTCBStkPtr; /*當(dāng)前任務(wù)棧頂?shù)闹羔?/struct os_tcb *OSTCBNext; /*任務(wù)控制塊的雙重鏈接指針*/struct os_tcb *OSTCBPrev; /*任務(wù)控制塊的雙重鏈接指針*/void *OSTCBExtPtr; /*用戶定義的任務(wù)控制塊擴(kuò)展*/OS_EVENT *OSTCBEventPtr; /*事件控制塊的指針*/void *OSTCBMsg; /*消息的指針*/INT16U OSTCBDly; /*任務(wù)延時*/INT8U OSTCBStat; /*任務(wù)的狀態(tài)字*/
7、INT8U OSTCBPrio; /*任務(wù)優(yōu)先級*/INT8U OSTCBX; /*用于加速進(jìn)入就緒態(tài)的過程*/ INT8U OSTCBY; /*用于加速進(jìn)入就緒態(tài)的過程*/ INT8U OSTCBBitX; /*用于加速進(jìn)入就緒態(tài)的過程*/ INT8U OSTCBBitY; /*用于加速進(jìn)入就緒態(tài)的過程*/BOOLEAN OSTCBDelReq; /*用于表示該任務(wù)是否要刪除*/2.5 任務(wù)就緒表(Ready List) 每個任務(wù)的就緒態(tài)標(biāo)志都放入就緒表中的,就緒表中有兩個變量OSRdyGrp和OSRdyTbl。 在OSRdyGrp中,任務(wù)按優(yōu)先級分組,8個任務(wù)為一組。OSRdyGrp中的每
8、一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒態(tài)的任務(wù)。任務(wù)進(jìn)入就緒態(tài)時,就緒表OSRdyTbl中的相應(yīng)元素的相應(yīng)位也置位。任務(wù)就緒表(Ready List) 根據(jù)就緒表確定最高優(yōu)先級通過OSRdyGrp值確定高3位,假設(shè)OSRdyGrp0 x08,對應(yīng)OSRdyTbl3,查表(OSUnMapTbl)得到3(八進(jìn)制,二進(jìn)制011);通過OSRdyTbl3的值來確定低3位,假設(shè)OSRdyTbl30 x3a,查表得優(yōu)先級為1;則最高優(yōu)先級的任務(wù)為3*8+1=252.6 任務(wù)調(diào)度C/OS是搶占式實時多任務(wù)內(nèi)核,優(yōu)先級最高的任務(wù)一旦準(zhǔn)備就緒,則擁有CPU的所有權(quán)開始投入運行。C/OS中不支持時間片輪轉(zhuǎn)法,每
9、個任務(wù)的優(yōu)先級要求不一樣且是唯一的,所以任務(wù)調(diào)度的工作就是:查找準(zhǔn)備就緒的最高優(yōu)先級的任務(wù)并進(jìn)行上下文切換。C/OS任務(wù)調(diào)度所花的時間為常數(shù),與應(yīng)用程序中建立的任務(wù)數(shù)無關(guān)。任務(wù)調(diào)度C/OS-總是運行進(jìn)入就緒態(tài)任務(wù)中優(yōu)先級最高的那一個。確定哪個任務(wù)優(yōu)先級最高,下面該哪個任務(wù)運行了的工作是由調(diào)度器(Scheduler)完成的。 任務(wù)級的調(diào)度是由函數(shù)OSSched()完成的。中斷級的調(diào)度是由另一個函數(shù)OSIntExt()完成的,這個函數(shù)將在以后描述。 2.7 中斷處理 用戶中斷服務(wù)子程序流程: 1、保存全部CPU寄存器; 2、調(diào)用OSIntEnter或OSIntNesting直接加1;3、執(zhí)行用戶代
10、碼做中斷服務(wù); 4、調(diào)用OSIntExit();5、恢復(fù)所有CPU寄存器;6、執(zhí)行中斷返回指令;OSIntEnter() void OSIntEnter (void) OS_ENTER_CRITICAL(); OSIntNesting+; OS_EXIT_CRITICAL();OSIntExit()OS_ENTER_CRITICAL();if (-OSIntNesting | OSLockNesting) = 0) OSIntExitY = OSUnMapTblOSRdyGrp;OSPrioHighRdy = (INT8U)(OSIntExitY 3) + OSUnMapTblOSRdyTbl
11、OSIntExitY); if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OSIntCtxSw(); OS_EXIT_CRITICAL();中斷與時鐘節(jié)拍當(dāng)發(fā)生中斷時,首先應(yīng)保護(hù)現(xiàn)場,將CPU寄存器入棧,再處理中斷函數(shù),然后恢復(fù)現(xiàn)場,將CPU寄存器出棧,最后執(zhí)行中斷返回。uC/OS中提供了OSIntEnter()和OSIntExit()告訴內(nèi)核進(jìn)入了中斷狀態(tài)。時鐘節(jié)拍是一種特殊的中斷,是操作系統(tǒng)的心臟??梢詫θ蝿?wù)列表進(jìn)行掃描,判斷是否有延時任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進(jìn)行
12、上下文切換。2.8 時鐘節(jié)拍 C/OS需要用戶提供周期性信號源,用于實現(xiàn)時間延時和確認(rèn)超時。節(jié)拍率應(yīng)在每秒10次到100次之間,或者說10到100Hz。時鐘節(jié)拍率越高,系統(tǒng)的額外負(fù)荷就越重。時鐘節(jié)拍的實際頻率取決于用戶應(yīng)用程序的精度。時鐘節(jié)拍源可以是專門的硬件定時器,也可以是來自50/60Hz交流電源的信號。 用戶必須在多任務(wù)系統(tǒng)啟動以后再開啟時鐘節(jié)拍器,也就是在調(diào)用OSStart()之后。時鐘節(jié)拍中斷服務(wù)子程 (OSTickISR)void OSTickISR(void) 保存處理器寄存器的值; 調(diào)用OSIntEnter()或是將OSIntNesting加1; 調(diào)用OSTimeTick();
13、 調(diào)用OSIntExit(); 恢復(fù)處理器寄存器的值; 執(zhí)行中斷返回指令;2.9 C/OS-初始化 在調(diào)用C/OS-的任何其它服務(wù)之前,C/OS-要求用戶首先調(diào)用系統(tǒng)初始化函數(shù)OSInit()。OSInit()建立空閑任務(wù)idle task,這個任務(wù)總是處于就緒態(tài)的??臻e任務(wù)OSTaskIdle()的優(yōu)先級總是設(shè)成最低,即OS_LOWEST_PRIO。 C/OS-還初始化了4個空數(shù)據(jù)結(jié)構(gòu)緩沖區(qū)。C/OS-初始化后的一些數(shù)據(jù)結(jié)構(gòu)C/OS-初始化后的空緩沖區(qū) 2.10 C/OS-的啟動 多任務(wù)的啟動是用戶通過調(diào)用OSStart()實現(xiàn)的。然而,啟動C/OS-之前,用戶至少要建立一個應(yīng)用任務(wù)。 OS
14、Init(); /* 初始化uC/OS-II*/ 調(diào)用OSTaskCreate()或OSTaskCreateExt(),創(chuàng)建至少一個任務(wù) ; OSStart(); /*開始多任務(wù)調(diào)度!永不返回 */OSStartif (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3;OSRdyTblprio3 |=OSMapTblprio & 0 x07;假設(shè)優(yōu)先級為12 00 001 100 b (1,4)OSRdyGrp |=0 x02;(0000 0010 b)
15、OSRdyTbl1 |=0 x10; (0001 0000 b)使任務(wù)脫離就緒態(tài)將任務(wù)就緒表OSRdyTblprio3相應(yīng)元素的相應(yīng)位清零,而且當(dāng)OSRdyTblprio3中的所有位都為零時,即全組任務(wù)中沒有一個進(jìn)入就緒態(tài)時,OSRdyGrp的相應(yīng)位才為零。if(OSRdyTblprio3&= OSMapTblprio & 0 x07)=0)OSRdyGrp&=OSMapTblprio3;3.2 任務(wù)刪除OSTaskDel() 刪除任務(wù),是說任務(wù)將返回并處于休眠狀態(tài),并不是說任務(wù)的代碼被刪除了 .OSTaskDel()一開始應(yīng)確保用戶所要刪除的任務(wù)并非是空閑任務(wù).用戶可以刪除statistic
16、任務(wù) .確保用戶不是在ISR例程中去試圖刪除一個任務(wù) 3.3 任務(wù)調(diào)度器 void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OS_TASK_SW
17、(); OS_EXIT_CRITICAL();3.4 任務(wù)切換 (OS_TASK_SW)任務(wù)切換由以下兩步完成 :將被掛起任務(wù)的微處理器寄存器推入堆棧 。將較高優(yōu)先級的任務(wù)的寄存器值從棧中恢復(fù)到寄存器中 。OSSched()的所有代碼都屬臨界段代碼。在尋找進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)過程中,為防止中斷服務(wù)子程序把一個或幾個任務(wù)的就緒位置位,中斷是被關(guān)掉的。 任務(wù)級的任務(wù)切換OS_TASK_SW()通過系統(tǒng)調(diào)用指令完成保護(hù)當(dāng)前任務(wù)的現(xiàn)場恢復(fù)新任務(wù)的現(xiàn)場執(zhí)行中斷返回指令開始執(zhí)行新的任務(wù)調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級任務(wù) OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆
18、棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務(wù) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)保存當(dāng)前CPU寄存器的值低優(yōu)先級任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務(wù) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)重新裝入要運行的任務(wù)低優(yōu)先級任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存
19、貯器高地址高優(yōu)先級任務(wù) OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)任務(wù)切換OSCtxSw()的代碼Void OSCtxSw(void) 將R1,R2,R3及R4推入當(dāng)前堆棧; OSTCBCurOSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; SP = OSTCBHighRdy OSTCBSTKPtr; 將R4,R3,R2及R1從新堆棧中彈出; 執(zhí)行中斷返回指令;四、 uCOS-II操作系統(tǒng)內(nèi)存管理4.1 內(nèi)存管理概述4.2 內(nèi)存控制塊4.3
20、內(nèi)存管理初始化4.4 建立內(nèi)存分區(qū)4.5 分配內(nèi)存塊4.6 釋放內(nèi)存塊4.1 內(nèi)存管理概述在ANSI C中可以用malloc()和free()兩個函數(shù)動態(tài)地分配內(nèi)存和釋放內(nèi)存。在嵌入式實時操作系統(tǒng)中,容易產(chǎn)生內(nèi)存碎片。 C/OS-II中,操作系統(tǒng)把連續(xù)的大塊內(nèi)存按分區(qū)來管理。每個分區(qū)中包含有整數(shù)個大小相同的內(nèi)存塊。在一個系統(tǒng)中可以有多個內(nèi)存分區(qū)。這樣,用戶的應(yīng)用程序就可以從不同的內(nèi)存分區(qū)中得到不同大小的內(nèi)存塊。但是,特定的內(nèi)存塊在釋放時必須重新放回它以前所屬于的內(nèi)存分區(qū)。內(nèi)存分區(qū)示意圖4.2 內(nèi)存控制塊 為了便于內(nèi)存的管理,在C/OS-II中使用內(nèi)存控制塊(memory control blo
21、cks)的數(shù)據(jù)結(jié)構(gòu)來跟蹤每一個內(nèi)存分區(qū),系統(tǒng)中的每個內(nèi)存分區(qū)都有它自己的內(nèi)存控制塊。 typedef struct void *OSMemAddr; /*分區(qū)起始地址*/ void *OSMemFreeList;/*下一個空閑內(nèi)存塊*/ INT32U OSMemBlkSize;/*內(nèi)存塊的大小*/ INT32U OSMemNBlks;/*內(nèi)存塊數(shù)量*/ INT32U OSMemNFree;/*空閑內(nèi)存塊數(shù)量 */ OS_MEM;4.3 內(nèi)存管理初始化如果要在C/OS-II中使用內(nèi)存管理,需要在OS_CFG.H文件中將開關(guān)量OS_MEM_EN設(shè)置為1。這樣C/OS-II 在啟動時就會對內(nèi)存管理器
22、進(jìn)行初始化。(由OSInit調(diào)用OSMemInit實現(xiàn) )該初始化主要建立一個內(nèi)存控制塊鏈表,(如下圖)其中的常數(shù)OS_MAX_MEM_PART(見OS_CFG.H)定義了最大的內(nèi)存分區(qū)數(shù),該常數(shù)值至少應(yīng)為2。空閑內(nèi)存控制塊鏈表 4.4 建立內(nèi)存分區(qū)OSMemCreate() 在使用一個內(nèi)存分區(qū)之前,必須使用OSMemCreate()先建立該內(nèi)存分區(qū)。該函數(shù)共有4個參數(shù):內(nèi)存分區(qū)的起始地址、分區(qū)內(nèi)的內(nèi)存塊總塊數(shù)、每個內(nèi)存塊的字節(jié)數(shù)和一個指向錯誤信息代碼的指針。 每個內(nèi)存分區(qū)必須含有至少兩個內(nèi)存塊,每個內(nèi)存塊至少為一個指針的大小 。OS_MEM *CommTxBuf;INT8U CommTxPa
23、rt10032;CommTxBuf = OSMemCreate(CommTxPart, 100, 32, &err); 4.5 分配內(nèi)存塊OSMemGet() 應(yīng)用程序可以調(diào)用OSMemGet()函數(shù)從已經(jīng)建立的內(nèi)存分區(qū)中申請一個內(nèi)存塊。該函數(shù)的唯一參數(shù)是指向特定內(nèi)存分區(qū)的指針,該指針在建立內(nèi)存分區(qū)時,由OSMemCreate()函數(shù)返回。注意的是,用戶可以在中斷服務(wù)子程序中調(diào)用OSMemGet(),因為在暫時沒有內(nèi)存塊可用的情況下,OSMemGet()不會等待,而是馬上返回NULL指針。 4.6 釋放內(nèi)存塊OSMemPut()應(yīng)用程序不再使用一個內(nèi)存塊時,必須及時地把它釋放并放回到相應(yīng)的內(nèi)存
24、分區(qū)中。這個操作由OSMemPut()函數(shù)完成。 必須注意的是,OSMemPut()并不知道一個內(nèi)存塊是屬于哪個內(nèi)存分區(qū)的。 釋放內(nèi)存塊時必須將它釋放到正確的分區(qū)。五、 uCOS-II操作系統(tǒng)時間管理C/OS-(其它內(nèi)核也一樣)要求用戶提供定時中斷來實現(xiàn)延時與超時控制等功能。這個定時中斷叫做時鐘節(jié)拍,它應(yīng)該每秒發(fā)生10至100次。時鐘節(jié)拍的頻率越高,系統(tǒng)的負(fù)荷就越重。 與時鐘管理相關(guān)的系統(tǒng)服務(wù)有:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()六、 uCOS-II操作系統(tǒng)任務(wù)間的通訊6.1 任務(wù)間通信手段6.2
25、事件控制塊 ECB6.3 信號量 semaphore6.4 郵箱 OSMbox6.1 任務(wù)間通信手段C/OS中,采用多種方法保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL來對臨界資源進(jìn)行保護(hù)利用函數(shù)OSSchedLock()和OSSchekUnlock()對任務(wù)調(diào)度函數(shù)上鎖和開鎖來實現(xiàn)數(shù)據(jù)共享 。提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號量、郵箱、消息隊列,事件標(biāo)志。 6.2 事件控制塊ECB所有的通信信號都被看成是事件(event), 一個稱為事件控制塊(ECB, Event Control Block)的數(shù)據(jù)結(jié)構(gòu)來表征每一個
26、具體事件,ECB的結(jié)構(gòu)如下:typedef struct void *OSEventPtr; /*指向消息或消息隊列的指針*/ INT8U OSEventTblOS_EVENT_TBL_SIZE; /*等待任務(wù)列表*/ INT8U OSEventGrp; /*等待任務(wù)組*/ INT16U OSEventCnt; /*計數(shù)器(事件是信號量時)*/ INT8U OSEventType; /*事件類型:信號量、郵箱等*/ OS_EVENT;與TCB類似的結(jié)構(gòu),使用兩個鏈表,空閑鏈表與使用鏈表6.3 信號量 semaphore信號量在多任務(wù)系統(tǒng)中用于:控制共享資源的使用權(quán)、標(biāo)志事件的發(fā)生、使兩個任務(wù)的
27、行為同步。uC/OS中信號量由兩部分組成:信號量的計數(shù)值和等待該信號任務(wù)的等待任務(wù)表。信號量的計數(shù)值可以為二進(jìn)制, 也可以是其他整數(shù)。系統(tǒng)通過OSSemPend( )和OSSemPost( )來支持信號量的兩種原子操作P()和V()。P()操作減少信號量的值,如果新的信號量的值不大于0,則操作阻塞;V()操作增加信號量的值。 6.4 郵箱 OSMbox 郵箱是C/OS-II中另一種通訊機(jī)制,它可以使一個任務(wù)或者中斷服務(wù)子程序向另一個任務(wù)發(fā)送一個指針型的變量。該指針指向一個包含了特定“消息”的數(shù)據(jù)結(jié)構(gòu)。 通過調(diào)用OSMboxCreate()函數(shù)來建立郵箱,并且要指定指針的初始值。一般情況下,這個
28、初始值是NULL,但也可以初始化一個郵箱,使其在最開始就包含一條消息。 OSMboxPend() 等待一個郵箱中的消息。OSMboxPost() 發(fā)送一個消息到郵箱中。七、 uCOS-II操作系統(tǒng)移植7.1 COS-II移植簡介7.2 移植COS-II滿足的條件7.3 C/OS-II在S3C2410上的移植7.1 COS-II移植簡介所謂移植,是指使一個實時操作系統(tǒng)能夠在某個微處理器平臺上運行。COS-II的主要代碼都是由標(biāo)準(zhǔn)的C語言寫成的,移植方便。7.2 移植COS-II滿足的條件 處理器的C編譯器能產(chǎn)生可重入代碼 在程序中可以打開或者關(guān)閉中斷 處理器支持中斷,并且能產(chǎn)生定時中斷(通常在1
29、01000Hz之間) 處理器支承能夠容納一定量數(shù)據(jù)的硬件堆棧 處理器有將堆棧指針和其他CPU寄存器存儲和讀出到堆棧(或者內(nèi)存)的指令 打開/關(guān)閉中斷 在COS-II中,可以通過:OS_ENTER_CRITICAL () OS_EXIT_CRITICAL()宏來控制系統(tǒng)關(guān)閉或者打開中斷。這需要處理器的支持。在ARM9處理器上,可以設(shè)置相應(yīng)的寄存器來關(guān)閉或者打開系統(tǒng)的所有中斷。 處理器支持中斷并且能產(chǎn)生定時中斷 COS-II是通過處理器產(chǎn)生的定時器的中斷來實現(xiàn)多任務(wù)之間的調(diào)度的。ARM9處理器上可以產(chǎn)生定時器中斷。本系統(tǒng)工作在60MHz的主頻下,定時器的中斷的頻率為100Hz。也就是系統(tǒng)的響應(yīng)時間
30、為10ms。處理器支持硬件堆棧 COS-II進(jìn)行任務(wù)調(diào)度的時候,會把當(dāng)前任務(wù)的CPU寄存器存放到此任務(wù)的堆棧中,然后,再從另一個任務(wù)的堆棧中恢復(fù)原來的工作寄存器,繼續(xù)運行另一個任務(wù)。所以,寄存器的入棧和出棧是COS-II多任務(wù)調(diào)度的基礎(chǔ)。 ARM9處理器中有專門的指令處理堆棧,可以靈活的使用堆棧。7.3 C/OS-II在S3C2410上的移植 設(shè)置OS_CPU.H中與處理器和編譯器相關(guān)的代碼 用C語言編寫六個操作系統(tǒng)相關(guān)的函數(shù)(OS_CPU_C.C) 用匯編語言編寫四個與處理器相關(guān)的函數(shù)(OS_CPU.ASM) 設(shè)置與處理器和編譯器相關(guān)的代碼OS_CPU.H中定義了與編譯器相關(guān)的數(shù)據(jù)類型。比如
31、:INT8U、INT16U等。與 ARM處理器相關(guān)的代碼,使用OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 宏開啟關(guān)閉中斷設(shè)置堆棧的增長方向 :堆棧由高地址向低地址增長 #define OS_STK_GROWTH 1 (1=向下, 0=向上 )用C語言編寫六個操作系統(tǒng)相關(guān)的函數(shù) void *OSTaskStkInit (void (*task)(void *pd),void *pdata, void *ptos, INT16U opt) void OSTaskCreateHook (OS_TCB *ptcb) void OSTaskDelHook (OS_TC
32、B *ptcb)void OSTaskSwHook (void)void OSTaskStatHook (void)void OSTimeTickHook (void)后5個函數(shù)為鉤子函數(shù),可以不加代碼用匯編語言編寫四個與處理器相關(guān)的函數(shù) OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()關(guān)于移植相對于其他的嵌入式操作系統(tǒng),uCOS-II的移植雖然是一個很簡單的過程,但是,對于不熟悉uCOS-II的開發(fā)者,移植還是有一定難度的。移植工作除了要熟悉C/OS-的原理外,還要對處理器和C編譯器的技術(shù)細(xì)節(jié)有一定程度的理解。移植要點定義函數(shù)OS_ENTER_
33、CRITICAL和OS_ENTER_CRITICAL。定義函數(shù)OS_TASK_SW執(zhí)行任務(wù)切換。 定義函數(shù)OSCtxSw實現(xiàn)用戶級上下文切換,用純匯編實現(xiàn)。 定義函數(shù)OSIntCtxSw實現(xiàn)中斷級任務(wù)切換,用純匯編實現(xiàn)。 定義函數(shù)OSTickISR。 定義OSTaskStkInit來初始化任務(wù)的堆棧。 uC/OS的改進(jìn)固定的基于優(yōu)先級的調(diào)度,不支持時間片,使用起來不方便。一個任務(wù)的基礎(chǔ)上增加一個基于時間片的微型調(diào)度核在對臨界資源的訪問上使用關(guān)閉中斷實現(xiàn),沒有使用CPU提供的硬件指令,例如測試并置位。系統(tǒng)時鐘中斷,沒有提供用戶使用定時器,可以借鑒linux的定時器加以修改可以加上文件系統(tǒng)和TCP
34、/IP協(xié)議棧八、 uCOS-II操作系統(tǒng)實驗8.1 實驗準(zhǔn)備8.2 uC/OS-II多任務(wù)應(yīng)用程序?qū)嶒?.3 uC/OS-II任務(wù)間同步實驗8.4 uC/OS-II任務(wù)間通訊實驗8.5 uC/OS-II鍵盤驅(qū)動實驗8.1 實驗準(zhǔn)備硬件連接將實驗箱配套電源線連接到220V交流插座,并將其與實驗箱連接。關(guān)閉實驗箱電源開關(guān)(在實驗箱左側(cè))。將實驗箱配套串口線連接到計算機(jī)串口和實驗箱的UART0之間將實驗箱配套的并口延長線一頭連接到計算機(jī),另外一頭連接到實驗箱,有兩種連接方式:連接到上方的并口插座(實為簡易JTAG插座,USB插座邊上),此時請檢查其下方的SIMPLE JTAG跳線,必須用跳線帽短接連
35、接到ADT1000A仿真器,仿真器接上配套電源,并用配套的20Pin軟線連接到上方的JTAG接口,此時請檢查其下方的SIMPLE JTAG跳線,跳線帽必須斷開硬件連接注意事項上述操作必須在實驗箱斷電狀態(tài)進(jìn)行,否則,容易將實驗箱或者計算機(jī)的并口芯片燒壞如果SIMPLE JTAG跳線短接此時使用實驗箱內(nèi)部的簡易JTAG接口(ARM9Simple)如果SIMPLE JTAG跳線斷開此時使用外置高級仿真器(ARM9Lpt)連接正確后將實驗箱上電,觀察LCD,等待程序啟動到如下界面(LCD顯示為綠色底白色字的界面)時開始后面的操作JX2410 #8.2 uC/OS-II多任務(wù)應(yīng)用程序?qū)嶒瀸嶒災(zāi)康模赫莆誹
36、C/OS-II下基本多任務(wù)應(yīng)用程序的編寫。實驗內(nèi)容:實現(xiàn)跑馬燈和數(shù)碼管顯示的功能。實驗方法:1、調(diào)用函數(shù)ARMTargetInit初始化ARM處理器; 2、調(diào)用OSInit進(jìn)行操作系統(tǒng)初始化; 3、調(diào)用OSTaskCreate創(chuàng)建任務(wù) TaskLED和TaskSEG; 4、調(diào)用ARMTargetStart函數(shù)啟動時鐘節(jié)拍中斷; 5、調(diào)用OSStart啟動系統(tǒng)任務(wù)調(diào)度。 實驗步驟1、創(chuàng)建好的模板工程Eg1,并修改相應(yīng)的設(shè)置。2、新建一個文件Eg1.c,并將其添加到Eg1工程的App文件夾中。3、添加兩個任務(wù),TaskLED和TaskSEG。在TaskLED函數(shù)中每隔200個時鐘節(jié)拍使所有的跑馬燈
37、閃爍一次;在TaskSEG函數(shù)中每隔100個時鐘節(jié)拍切換一次數(shù)碼管顯示。(循環(huán)從“1”到“F”顯示)4、編譯工程,下載調(diào)試并運行。實驗效果如果實驗運行正確,實驗箱上最右邊的數(shù)碼管將依次從0到F顯示數(shù)據(jù),同時四個跑馬燈由亮變暗或者由暗變亮跑馬燈閃爍和數(shù)碼管顯示分別在兩個不同的任務(wù)中進(jìn)行在DNW中有相應(yīng)的顯示8.3 uC/OS-II任務(wù)間同步實驗實驗?zāi)康模赫莆誹C/OS-II操作系統(tǒng)下使用信號量解決任務(wù)之間的同步問題。實驗內(nèi)容:使用信號量實現(xiàn)任務(wù)間同步。實驗方法:1、建立兩個信號量Sem1 (初始化為0,代表禁用的); Sem2 (初始化為1,代表可用的); 2、通過調(diào)用OSSemPost()發(fā)送一個信號量,通過調(diào)用OSSemPend()等待一個信號量;3、約定TaskLED(TaskSEG)必須等待Sem2(Sem1)可用才能夠繼續(xù)往下運行,而Sem2(Sem1)在TaskSEG( TaskLED )中發(fā)送。實驗步驟1、創(chuàng)建好的模板工程Eg2,并修改相應(yīng)的設(shè)置。2、新建一個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 臥室地面找平施工方案
- 第二章資產(chǎn)評估基本原理
- -記上海第二醫(yī)科大學(xué)病理生理學(xué)教研室主任陳國強(qiáng)知識講解
- 會計學(xué)第九章財產(chǎn)清查
- 2024年浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 一年級道德與法治上冊第一單元我是小學(xué)生啦1開開心心上學(xué)去課件新人教版
- 2024年浙江醫(yī)藥高等??茖W(xué)校高職單招語文歷年參考題庫含答案解析
- 產(chǎn)品宣傳冊設(shè)計合同8篇
- 2024年陸軍五十七醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024年陽泉市城區(qū)人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 新高考3+1+2模式選科指導(dǎo)(超全版)主題班會課件
- YY/T 1705-2020外科植入物髖關(guān)節(jié)假體陶瓷股骨頭抗沖擊性能測定方法
- GB/T 6730.22-2016鐵礦石鈦含量的測定二安替吡啉甲烷分光光度法
- GB/T 22898-2008紙和紙板抗張強(qiáng)度的測定恒速拉伸法(100 mm/min)
- 華東師大版數(shù)學(xué)七年級上冊1數(shù)軸課件
- DB33-T 2267-2020養(yǎng)老機(jī)構(gòu)護(hù)理分級與服務(wù)規(guī)范
- 2022國慶節(jié)復(fù)工第一課
- PE電容焊接工藝評定修訂稿
- 患者跌倒不良事件分析
- 無菌GMP 操作指南:無菌醫(yī)療器械生產(chǎn)過程確認(rèn)
- TCDHA 503-2021 供熱規(guī)劃標(biāo)準(zhǔn)
評論
0/150
提交評論