版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、uC/OS-II操作系統(tǒng)uC/OS-II操作系統(tǒng)簡(jiǎn)介及開發(fā)過程內(nèi) 容一、 uCOS-II操作系統(tǒng)簡(jiǎn)介二、 uCOS-II操作系統(tǒng)內(nèi)核結(jié)構(gòu)三、 uCOS-II操作系統(tǒng)任務(wù)管理四、 uCOS-II操作系統(tǒng)內(nèi)存管理五、 uCOS-II操作系統(tǒng)時(shí)間管理六、 uCOS-II操作系統(tǒng)任務(wù)間的通訊七、 uCOS-II操作系統(tǒng)移植八、 uCOS-II操作系統(tǒng)實(shí)驗(yàn)一、 uCOS-II操作系統(tǒng)簡(jiǎn)介1.1 uC/OS-II簡(jiǎn)介1.2 uC/OS-II特點(diǎn)1.3 C/OS-II應(yīng)用1.1 uC/OS-II簡(jiǎn)介1、uC/OS-II是一個(gè)簡(jiǎn)單、高效的嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核2、支持 x86、ARM、PowerPC、MIPS
2、 等眾多體系結(jié)構(gòu)3、可從網(wǎng)站上獲得全部源碼及其在各種體系結(jié)構(gòu)平臺(tái)上的移植范例。1.2 uC/OS-II特點(diǎn)1、uC/OS-II內(nèi)核具有很強(qiáng)的可移植性。2、具有可搶占的實(shí)時(shí)多任務(wù)調(diào)度功能。3、提供了許多系統(tǒng)服務(wù),如信號(hào)量、消息隊(duì)列、郵箱、內(nèi)存管理、時(shí)間函數(shù)等4、這些功能可以根據(jù)不同的需求進(jìn)行裁減。1.3 C/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:醫(yī)療器械移動(dòng)電話路由器工業(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 時(shí)鐘節(jié)拍 2.9 C/OS-初
3、始化2.10 C/OS-啟動(dòng) 目的:為了實(shí)現(xiàn)資源共享。實(shí)現(xiàn)方法:進(jìn)入臨界段時(shí)關(guān)中斷,退出臨界段時(shí)開中斷。這使得C/OS-能夠在臨界段代碼時(shí)避免被其它任務(wù)或中斷服務(wù)所中斷。 C/OS-定義兩個(gè)宏(macros)來開關(guān)中斷。分別是:進(jìn)入臨界段:OS_ENTER_CRITICAL()退出臨界段:OS_EXIT_CRITICAL()。這兩個(gè)宏的定義取決于所用的微處理器,每種微處理器都有自己的OS_CPU.H文件。 2.1 臨界段(Critical Sections)2.2 任務(wù)(task)一個(gè)任務(wù)通常是一個(gè)無限的循環(huán):void mytask(void *pdata) do init while (1)
4、 do something; waiting; do something; 任務(wù)(task)C/OS-可以管理多達(dá)64個(gè)任務(wù)。優(yōu)先級(jí)為0-63 優(yōu)先級(jí)號(hào)越低,任務(wù)的優(yōu)先級(jí)越高。每個(gè)任務(wù)的優(yōu)先級(jí)不能相同。保留優(yōu)先級(jí):高優(yōu)先級(jí):0、1、2、3低優(yōu)先級(jí):OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0用戶可以有多達(dá)56個(gè)應(yīng)用任務(wù)。2.3 任務(wù)狀態(tài)就緒休眠等待或掛起運(yùn)行中斷服務(wù)刪除任務(wù)刪除任務(wù)刪除任務(wù)中斷中斷結(jié)束創(chuàng)建任務(wù)任務(wù)調(diào)度任務(wù)被搶占等待消息掛起收到消息掛起時(shí)間到任務(wù)狀態(tài)休眠態(tài) - OSTaskCreate()或O
5、STaskCreateExt() - 就緒態(tài)等待態(tài),就緒態(tài),運(yùn)行態(tài) - OSTaskDel() - 休眠態(tài)就緒態(tài) - OSStart() - 運(yùn)行態(tài)運(yùn)行態(tài) - OSTimeDly()或OSTimeDlyHMSM() , OSSemPend(),OSMboxPend(),或OSQPend() - 等待態(tài)等待態(tài) - OSTimeTick() -就緒態(tài)空閑任務(wù) - OSTaskIdle() 2.4 任務(wù)控制塊(TCB)任務(wù)控制塊 OS_TCB 是一個(gè)數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針,狀態(tài),優(yōu)先級(jí),任務(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ù)延時(shí)*/INT8U OSTCBStat; /*任務(wù)的狀態(tài)字*/
7、INT8U OSTCBPrio; /*任務(wù)優(yōu)先級(jí)*/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ù)是否要?jiǎng)h除*/2.5 任務(wù)就緒表(Ready List) 每個(gè)任務(wù)的就緒態(tài)標(biāo)志都放入就緒表中的,就緒表中有兩個(gè)變量OSRdyGrp和OSRdyTbl。 在OSRdyGrp中,任務(wù)按優(yōu)先級(jí)分組,8個(gè)任務(wù)為一組。OSRdyGrp中的每
8、一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒態(tài)的任務(wù)。任務(wù)進(jìn)入就緒態(tài)時(shí),就緒表OSRdyTbl中的相應(yīng)元素的相應(yīng)位也置位。任務(wù)就緒表(Ready List) 根據(jù)就緒表確定最高優(yōu)先級(jí)通過OSRdyGrp值確定高3位,假設(shè)OSRdyGrp0 x08,對(duì)應(yīng)OSRdyTbl3,查表(OSUnMapTbl)得到3(八進(jìn)制,二進(jìn)制011);通過OSRdyTbl3的值來確定低3位,假設(shè)OSRdyTbl30 x3a,查表得優(yōu)先級(jí)為1;則最高優(yōu)先級(jí)的任務(wù)為3*8+1=252.6 任務(wù)調(diào)度C/OS是搶占式實(shí)時(shí)多任務(wù)內(nèi)核,優(yōu)先級(jí)最高的任務(wù)一旦準(zhǔn)備就緒,則擁有CPU的所有權(quán)開始投入運(yùn)行。C/OS中不支持時(shí)間片輪轉(zhuǎn)法,每
9、個(gè)任務(wù)的優(yōu)先級(jí)要求不一樣且是唯一的,所以任務(wù)調(diào)度的工作就是:查找準(zhǔn)備就緒的最高優(yōu)先級(jí)的任務(wù)并進(jìn)行上下文切換。C/OS任務(wù)調(diào)度所花的時(shí)間為常數(shù),與應(yīng)用程序中建立的任務(wù)數(shù)無關(guān)。任務(wù)調(diào)度C/OS-總是運(yùn)行進(jìn)入就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的那一個(gè)。確定哪個(gè)任務(wù)優(yōu)先級(jí)最高,下面該哪個(gè)任務(wù)運(yùn)行了的工作是由調(diào)度器(Scheduler)完成的。 任務(wù)級(jí)的調(diào)度是由函數(shù)OSSched()完成的。中斷級(jí)的調(diào)度是由另一個(gè)函數(shù)OSIntExt()完成的,這個(gè)函數(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();中斷與時(shí)鐘節(jié)拍當(dāng)發(fā)生中斷時(shí),首先應(yīng)保護(hù)現(xiàn)場(chǎng),將CPU寄存器入棧,再處理中斷函數(shù),然后恢復(fù)現(xiàn)場(chǎng),將CPU寄存器出棧,最后執(zhí)行中斷返回。uC/OS中提供了OSIntEnter()和OSIntExit()告訴內(nèi)核進(jìn)入了中斷狀態(tài)。時(shí)鐘節(jié)拍是一種特殊的中斷,是操作系統(tǒng)的心臟??梢詫?duì)任務(wù)列表進(jìn)行掃描,判斷是否有延時(shí)任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進(jìn)行
12、上下文切換。2.8 時(shí)鐘節(jié)拍 C/OS需要用戶提供周期性信號(hào)源,用于實(shí)現(xiàn)時(shí)間延時(shí)和確認(rèn)超時(shí)。節(jié)拍率應(yīng)在每秒10次到100次之間,或者說10到100Hz。時(shí)鐘節(jié)拍率越高,系統(tǒng)的額外負(fù)荷就越重。時(shí)鐘節(jié)拍的實(shí)際頻率取決于用戶應(yīng)用程序的精度。時(shí)鐘節(jié)拍源可以是專門的硬件定時(shí)器,也可以是來自50/60Hz交流電源的信號(hào)。 用戶必須在多任務(wù)系統(tǒng)啟動(dòng)以后再開啟時(shí)鐘節(jié)拍器,也就是在調(diào)用OSStart()之后。時(shí)鐘節(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,這個(gè)任務(wù)總是處于就緒態(tài)的。空閑任務(wù)OSTaskIdle()的優(yōu)先級(jí)總是設(shè)成最低,即OS_LOWEST_PRIO。 C/OS-還初始化了4個(gè)空數(shù)據(jù)結(jié)構(gòu)緩沖區(qū)。C/OS-初始化后的一些數(shù)據(jù)結(jié)構(gòu)C/OS-初始化后的空緩沖區(qū) 2.10 C/OS-的啟動(dòng) 多任務(wù)的啟動(dòng)是用戶通過調(diào)用OSStart()實(shí)現(xiàn)的。然而,啟動(dòng)C/OS-之前,用戶至少要建立一個(gè)應(yīng)用任務(wù)。 OS
14、Init(); /* 初始化uC/OS-II*/ 調(diào)用OSTaskCreate()或OSTaskCreateExt(),創(chuàng)建至少一個(gè)任務(wù) ; OSStart(); /*開始多任務(wù)調(diào)度!永不返回 */OSStartif (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3;OSRdyTblprio3 |=OSMapTblprio & 0 x07;假設(shè)優(yōu)先級(jí)為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中的所有位都為零時(shí),即全組任務(wù)中沒有一個(gè)進(jìn)入就緒態(tài)時(shí),OSRdyGrp的相應(yīng)位才為零。if(OSRdyTblprio3&= OSMapTblprio & 0 x07)=0)OSRdyGrp&=OSMapTblprio3;3.2 任務(wù)刪除OSTaskDel() 刪除任務(wù),是說任務(wù)將返回并處于休眠狀態(tài),并不是說任務(wù)的代碼被刪除了 .OSTaskDel()一開始應(yīng)確保用戶所要?jiǎng)h除的任務(wù)并非是空閑任務(wù).用戶可以刪除statistic
16、任務(wù) .確保用戶不是在ISR例程中去試圖刪除一個(gè)任務(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)先級(jí)的任務(wù)的寄存器值從棧中恢復(fù)到寄存器中 。OSSched()的所有代碼都屬臨界段代碼。在尋找進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)過程中,為防止中斷服務(wù)子程序把一個(gè)或幾個(gè)任務(wù)的就緒位置位,中斷是被關(guān)掉的。 任務(wù)級(jí)的任務(wù)切換OS_TASK_SW()通過系統(tǒng)調(diào)用指令完成保護(hù)當(dāng)前任務(wù)的現(xiàn)場(chǎng)恢復(fù)新任務(wù)的現(xiàn)場(chǎng)執(zhí)行中斷返回指令開始執(zhí)行新的任務(wù)調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆
18、棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級(jí)任務(wù) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)保存當(dāng)前CPU寄存器的值低優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級(jí)任務(wù) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)重新裝入要運(yùn)行的任務(wù)低優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存
19、貯器高地址高優(yōu)先級(jí)任務(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()兩個(gè)函數(shù)動(dòng)態(tài)地分配內(nèi)存和釋放內(nèi)存。在嵌入式實(shí)時(shí)操作系統(tǒng)中,容易產(chǎn)生內(nèi)存碎片。 C/OS-II中,操作系統(tǒng)把連續(xù)的大塊內(nèi)存按分區(qū)來管理。每個(gè)分區(qū)中包含有整數(shù)個(gè)大小相同的內(nèi)存塊。在一個(gè)系統(tǒng)中可以有多個(gè)內(nèi)存分區(qū)。這樣,用戶的應(yīng)用程序就可以從不同的內(nèi)存分區(qū)中得到不同大小的內(nèi)存塊。但是,特定的內(nèi)存塊在釋放時(shí)必須重新放回它以前所屬于的內(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)來跟蹤每一個(gè)內(nèi)存分區(qū),系統(tǒng)中的每個(gè)內(nèi)存分區(qū)都有它自己的內(nèi)存控制塊。 typedef struct void *OSMemAddr; /*分區(qū)起始地址*/ void *OSMemFreeList;/*下一個(gè)空閑內(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 在啟動(dòng)時(shí)就會(huì)對(duì)內(nèi)存管理器
22、進(jìn)行初始化。(由OSInit調(diào)用OSMemInit實(shí)現(xiàn) )該初始化主要建立一個(gè)內(nèi)存控制塊鏈表,(如下圖)其中的常數(shù)OS_MAX_MEM_PART(見OS_CFG.H)定義了最大的內(nèi)存分區(qū)數(shù),該常數(shù)值至少應(yīng)為2??臻e內(nèi)存控制塊鏈表 4.4 建立內(nèi)存分區(qū)OSMemCreate() 在使用一個(gè)內(nèi)存分區(qū)之前,必須使用OSMemCreate()先建立該內(nèi)存分區(qū)。該函數(shù)共有4個(gè)參數(shù):內(nèi)存分區(qū)的起始地址、分區(qū)內(nèi)的內(nèi)存塊總塊數(shù)、每個(gè)內(nèi)存塊的字節(jié)數(shù)和一個(gè)指向錯(cuò)誤信息代碼的指針。 每個(gè)內(nèi)存分區(qū)必須含有至少兩個(gè)內(nèi)存塊,每個(gè)內(nèi)存塊至少為一個(gè)指針的大小 。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ū)中申請(qǐng)一個(gè)內(nèi)存塊。該函數(shù)的唯一參數(shù)是指向特定內(nèi)存分區(qū)的指針,該指針在建立內(nèi)存分區(qū)時(shí),由OSMemCreate()函數(shù)返回。注意的是,用戶可以在中斷服務(wù)子程序中調(diào)用OSMemGet(),因?yàn)樵跁簳r(shí)沒有內(nèi)存塊可用的情況下,OSMemGet()不會(huì)等待,而是馬上返回NULL指針。 4.6 釋放內(nèi)存塊OSMemPut()應(yīng)用程序不再使用一個(gè)內(nèi)存塊時(shí),必須及時(shí)地把它釋放并放回到相應(yīng)的內(nèi)存
24、分區(qū)中。這個(gè)操作由OSMemPut()函數(shù)完成。 必須注意的是,OSMemPut()并不知道一個(gè)內(nèi)存塊是屬于哪個(gè)內(nèi)存分區(qū)的。 釋放內(nèi)存塊時(shí)必須將它釋放到正確的分區(qū)。五、 uCOS-II操作系統(tǒng)時(shí)間管理C/OS-(其它內(nèi)核也一樣)要求用戶提供定時(shí)中斷來實(shí)現(xiàn)延時(shí)與超時(shí)控制等功能。這個(gè)定時(shí)中斷叫做時(shí)鐘節(jié)拍,它應(yīng)該每秒發(fā)生10至100次。時(shí)鐘節(jié)拍的頻率越高,系統(tǒng)的負(fù)荷就越重。 與時(shí)鐘管理相關(guān)的系統(tǒng)服務(wù)有:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()六、 uCOS-II操作系統(tǒng)任務(wù)間的通訊6.1 任務(wù)間通信手段6.2
25、事件控制塊 ECB6.3 信號(hào)量 semaphore6.4 郵箱 OSMbox6.1 任務(wù)間通信手段C/OS中,采用多種方法保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL來對(duì)臨界資源進(jìn)行保護(hù)利用函數(shù)OSSchedLock()和OSSchekUnlock()對(duì)任務(wù)調(diào)度函數(shù)上鎖和開鎖來實(shí)現(xiàn)數(shù)據(jù)共享 。提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號(hào)量、郵箱、消息隊(duì)列,事件標(biāo)志。 6.2 事件控制塊ECB所有的通信信號(hào)都被看成是事件(event), 一個(gè)稱為事件控制塊(ECB, Event Control Block)的數(shù)據(jù)結(jié)構(gòu)來表征每一個(gè)
26、具體事件,ECB的結(jié)構(gòu)如下:typedef struct void *OSEventPtr; /*指向消息或消息隊(duì)列的指針*/ INT8U OSEventTblOS_EVENT_TBL_SIZE; /*等待任務(wù)列表*/ INT8U OSEventGrp; /*等待任務(wù)組*/ INT16U OSEventCnt; /*計(jì)數(shù)器(事件是信號(hào)量時(shí))*/ INT8U OSEventType; /*事件類型:信號(hào)量、郵箱等*/ OS_EVENT;與TCB類似的結(jié)構(gòu),使用兩個(gè)鏈表,空閑鏈表與使用鏈表6.3 信號(hào)量 semaphore信號(hào)量在多任務(wù)系統(tǒng)中用于:控制共享資源的使用權(quán)、標(biāo)志事件的發(fā)生、使兩個(gè)任務(wù)的
27、行為同步。uC/OS中信號(hào)量由兩部分組成:信號(hào)量的計(jì)數(shù)值和等待該信號(hào)任務(wù)的等待任務(wù)表。信號(hào)量的計(jì)數(shù)值可以為二進(jìn)制, 也可以是其他整數(shù)。系統(tǒng)通過OSSemPend( )和OSSemPost( )來支持信號(hào)量的兩種原子操作P()和V()。P()操作減少信號(hào)量的值,如果新的信號(hào)量的值不大于0,則操作阻塞;V()操作增加信號(hào)量的值。 6.4 郵箱 OSMbox 郵箱是C/OS-II中另一種通訊機(jī)制,它可以使一個(gè)任務(wù)或者中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送一個(gè)指針型的變量。該指針指向一個(gè)包含了特定“消息”的數(shù)據(jù)結(jié)構(gòu)。 通過調(diào)用OSMboxCreate()函數(shù)來建立郵箱,并且要指定指針的初始值。一般情況下,這個(gè)
28、初始值是NULL,但也可以初始化一個(gè)郵箱,使其在最開始就包含一條消息。 OSMboxPend() 等待一個(gè)郵箱中的消息。OSMboxPost() 發(fā)送一個(gè)消息到郵箱中。七、 uCOS-II操作系統(tǒng)移植7.1 COS-II移植簡(jiǎn)介7.2 移植COS-II滿足的條件7.3 C/OS-II在S3C2410上的移植7.1 COS-II移植簡(jiǎn)介所謂移植,是指使一個(gè)實(shí)時(shí)操作系統(tǒng)能夠在某個(gè)微處理器平臺(tái)上運(yùn)行。COS-II的主要代碼都是由標(biāo)準(zhǔn)的C語言寫成的,移植方便。7.2 移植COS-II滿足的條件 處理器的C編譯器能產(chǎn)生可重入代碼 在程序中可以打開或者關(guān)閉中斷 處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常在1
29、01000Hz之間) 處理器支承能夠容納一定量數(shù)據(jù)的硬件堆棧 處理器有將堆棧指針和其他CPU寄存器存儲(chǔ)和讀出到堆棧(或者內(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)生定時(shí)中斷 COS-II是通過處理器產(chǎn)生的定時(shí)器的中斷來實(shí)現(xiàn)多任務(wù)之間的調(diào)度的。ARM9處理器上可以產(chǎn)生定時(shí)器中斷。本系統(tǒng)工作在60MHz的主頻下,定時(shí)器的中斷的頻率為100Hz。也就是系統(tǒng)的響應(yīng)時(shí)間
30、為10ms。處理器支持硬件堆棧 COS-II進(jìn)行任務(wù)調(diào)度的時(shí)候,會(huì)把當(dāng)前任務(wù)的CPU寄存器存放到此任務(wù)的堆棧中,然后,再從另一個(gè)任務(wù)的堆棧中恢復(fù)原來的工作寄存器,繼續(xù)運(yùn)行另一個(gè)任務(wù)。所以,寄存器的入棧和出棧是COS-II多任務(wù)調(diào)度的基礎(chǔ)。 ARM9處理器中有專門的指令處理堆棧,可以靈活的使用堆棧。7.3 C/OS-II在S3C2410上的移植 設(shè)置OS_CPU.H中與處理器和編譯器相關(guān)的代碼 用C語言編寫六個(gè)操作系統(tǒng)相關(guān)的函數(shù)(OS_CPU_C.C) 用匯編語言編寫四個(gè)與處理器相關(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è)置堆棧的增長(zhǎng)方向 :堆棧由高地址向低地址增長(zhǎng) #define OS_STK_GROWTH 1 (1=向下, 0=向上 )用C語言編寫六個(gè)操作系統(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個(gè)函數(shù)為鉤子函數(shù),可以不加代碼用匯編語言編寫四個(gè)與處理器相關(guān)的函數(shù) OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()關(guān)于移植相對(duì)于其他的嵌入式操作系統(tǒng),uCOS-II的移植雖然是一個(gè)很簡(jiǎn)單的過程,但是,對(duì)于不熟悉uCOS-II的開發(fā)者,移植還是有一定難度的。移植工作除了要熟悉C/OS-的原理外,還要對(duì)處理器和C編譯器的技術(shù)細(xì)節(jié)有一定程度的理解。移植要點(diǎn)定義函數(shù)OS_ENTER_
33、CRITICAL和OS_ENTER_CRITICAL。定義函數(shù)OS_TASK_SW執(zhí)行任務(wù)切換。 定義函數(shù)OSCtxSw實(shí)現(xiàn)用戶級(jí)上下文切換,用純匯編實(shí)現(xiàn)。 定義函數(shù)OSIntCtxSw實(shí)現(xiàn)中斷級(jí)任務(wù)切換,用純匯編實(shí)現(xiàn)。 定義函數(shù)OSTickISR。 定義OSTaskStkInit來初始化任務(wù)的堆棧。 uC/OS的改進(jìn)固定的基于優(yōu)先級(jí)的調(diào)度,不支持時(shí)間片,使用起來不方便。一個(gè)任務(wù)的基礎(chǔ)上增加一個(gè)基于時(shí)間片的微型調(diào)度核在對(duì)臨界資源的訪問上使用關(guān)閉中斷實(shí)現(xiàn),沒有使用CPU提供的硬件指令,例如測(cè)試并置位。系統(tǒng)時(shí)鐘中斷,沒有提供用戶使用定時(shí)器,可以借鑒linux的定時(shí)器加以修改可以加上文件系統(tǒng)和TCP
34、/IP協(xié)議棧八、 uCOS-II操作系統(tǒng)實(shí)驗(yàn)8.1 實(shí)驗(yàn)準(zhǔn)備8.2 uC/OS-II多任務(wù)應(yīng)用程序?qū)嶒?yàn)8.3 uC/OS-II任務(wù)間同步實(shí)驗(yàn)8.4 uC/OS-II任務(wù)間通訊實(shí)驗(yàn)8.5 uC/OS-II鍵盤驅(qū)動(dòng)實(shí)驗(yàn)8.1 實(shí)驗(yàn)準(zhǔn)備硬件連接將實(shí)驗(yàn)箱配套電源線連接到220V交流插座,并將其與實(shí)驗(yàn)箱連接。關(guān)閉實(shí)驗(yàn)箱電源開關(guān)(在實(shí)驗(yàn)箱左側(cè))。將實(shí)驗(yàn)箱配套串口線連接到計(jì)算機(jī)串口和實(shí)驗(yàn)箱的UART0之間將實(shí)驗(yàn)箱配套的并口延長(zhǎng)線一頭連接到計(jì)算機(jī),另外一頭連接到實(shí)驗(yàn)箱,有兩種連接方式:連接到上方的并口插座(實(shí)為簡(jiǎn)易JTAG插座,USB插座邊上),此時(shí)請(qǐng)檢查其下方的SIMPLE JTAG跳線,必須用跳線帽短接連
35、接到ADT1000A仿真器,仿真器接上配套電源,并用配套的20Pin軟線連接到上方的JTAG接口,此時(shí)請(qǐng)檢查其下方的SIMPLE JTAG跳線,跳線帽必須斷開硬件連接注意事項(xiàng)上述操作必須在實(shí)驗(yàn)箱斷電狀態(tài)進(jìn)行,否則,容易將實(shí)驗(yàn)箱或者計(jì)算機(jī)的并口芯片燒壞如果SIMPLE JTAG跳線短接此時(shí)使用實(shí)驗(yàn)箱內(nèi)部的簡(jiǎn)易JTAG接口(ARM9Simple)如果SIMPLE JTAG跳線斷開此時(shí)使用外置高級(jí)仿真器(ARM9Lpt)連接正確后將實(shí)驗(yàn)箱上電,觀察LCD,等待程序啟動(dòng)到如下界面(LCD顯示為綠色底白色字的界面)時(shí)開始后面的操作JX2410 #8.2 uC/OS-II多任務(wù)應(yīng)用程序?qū)嶒?yàn)實(shí)驗(yàn)?zāi)康模赫莆誹
36、C/OS-II下基本多任務(wù)應(yīng)用程序的編寫。實(shí)驗(yàn)內(nèi)容:實(shí)現(xiàn)跑馬燈和數(shù)碼管顯示的功能。實(shí)驗(yàn)方法: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ù)啟動(dòng)時(shí)鐘節(jié)拍中斷; 5、調(diào)用OSStart啟動(dòng)系統(tǒng)任務(wù)調(diào)度。 實(shí)驗(yàn)步驟1、創(chuàng)建好的模板工程Eg1,并修改相應(yīng)的設(shè)置。2、新建一個(gè)文件Eg1.c,并將其添加到Eg1工程的App文件夾中。3、添加兩個(gè)任務(wù),TaskLED和TaskSEG。在TaskLED函數(shù)中每隔200個(gè)時(shí)鐘節(jié)拍使所有的跑馬燈
37、閃爍一次;在TaskSEG函數(shù)中每隔100個(gè)時(shí)鐘節(jié)拍切換一次數(shù)碼管顯示。(循環(huán)從“1”到“F”顯示)4、編譯工程,下載調(diào)試并運(yùn)行。實(shí)驗(yàn)效果如果實(shí)驗(yàn)運(yùn)行正確,實(shí)驗(yàn)箱上最右邊的數(shù)碼管將依次從0到F顯示數(shù)據(jù),同時(shí)四個(gè)跑馬燈由亮變暗或者由暗變亮跑馬燈閃爍和數(shù)碼管顯示分別在兩個(gè)不同的任務(wù)中進(jìn)行在DNW中有相應(yīng)的顯示8.3 uC/OS-II任務(wù)間同步實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康模赫莆誹C/OS-II操作系統(tǒng)下使用信號(hào)量解決任務(wù)之間的同步問題。實(shí)驗(yàn)內(nèi)容:使用信號(hào)量實(shí)現(xiàn)任務(wù)間同步。實(shí)驗(yàn)方法:1、建立兩個(gè)信號(hào)量Sem1 (初始化為0,代表禁用的); Sem2 (初始化為1,代表可用的); 2、通過調(diào)用OSSemPost()發(fā)送一個(gè)信號(hào)量,通過調(diào)用OSSemPend()等待一個(gè)信號(hào)量;3、約定TaskLED(TaskSEG)必須等待Sem2(Sem1)可用才能夠繼續(xù)往下運(yùn)行,而Sem2(Sem1)在TaskSEG( TaskLED )中發(fā)送。實(shí)驗(yàn)步驟1、創(chuàng)建好的模板工程Eg2,并修改相應(yīng)的設(shè)置。2、新建一個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 年度光伏組件背板產(chǎn)業(yè)分析報(bào)告
- 二零二五版共享辦公空間租賃管理合同2篇
- 2024-2025學(xué)年新教材高中歷史第八單元中華民族的抗日戰(zhàn)爭(zhēng)和人民解放戰(zhàn)爭(zhēng)第23課從局部抗戰(zhàn)到全面抗戰(zhàn)學(xué)案新人教版必修中外歷史綱要上
- 2024-2025學(xué)年高中政治專題三信守合同與違約2訂立合同有學(xué)問訓(xùn)練含解析新人教版選修5
- 2024-2025學(xué)年新教材高中英語UNIT1TEENAGELIFESectionⅡDiscoveringUsefulStructures課時(shí)作業(yè)含解析新人教版必修第一冊(cè)
- 2025年度臨時(shí)勞動(dòng)合同范本(區(qū)塊鏈技術(shù)應(yīng)用)4篇
- 2025年度城市綠化工程合同及后期養(yǎng)護(hù)服務(wù)3篇
- 2024租賃合同(辦公設(shè)備)
- 2025年度智慧城市建設(shè)戰(zhàn)略合作合同范本3篇
- 2025年度監(jiān)獄門衛(wèi)安全責(zé)任書3篇
- 巖土工程勘察課件0巖土工程勘察
- 《腎上腺腫瘤》課件
- 2024-2030年中國(guó)典當(dāng)行業(yè)發(fā)展前景預(yù)測(cè)及融資策略分析報(bào)告
- 《乘用車越野性能主觀評(píng)價(jià)方法》
- 幼師個(gè)人成長(zhǎng)發(fā)展規(guī)劃
- 2024-2025學(xué)年北師大版高二上學(xué)期期末英語試題及解答參考
- 動(dòng)物醫(yī)學(xué)類專業(yè)生涯發(fā)展展示
- 批發(fā)面包采購合同范本
- 乘風(fēng)化麟 蛇我其誰 2025XX集團(tuán)年終總結(jié)暨頒獎(jiǎng)盛典
- 2024年大數(shù)據(jù)分析公司與中國(guó)政府合作協(xié)議
- 一年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)匯編
評(píng)論
0/150
提交評(píng)論