




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)時(shí)嵌入式系統(tǒng)設(shè)計(jì)第八講 實(shí)時(shí)操作系統(tǒng)內(nèi)核分析北京航空航天大學(xué)魏洪興通用操作系統(tǒng)和嵌入式(實(shí)時(shí))操作系統(tǒng)通用操作系統(tǒng):Windows/NT/XP、Linux、UNIX等,用于PC機(jī)、服務(wù)器,嵌入式(實(shí)時(shí))操作系統(tǒng):用于嵌入式設(shè)備的操作系統(tǒng),具有通用操作系統(tǒng)的基本特點(diǎn),又具有系統(tǒng)實(shí)時(shí)性、硬件的相關(guān)依賴性、軟件固態(tài)化以及應(yīng)用的專用性等特點(diǎn);嵌入式(實(shí)時(shí))操作系統(tǒng)通常包括與硬件相關(guān)的底層驅(qū)動(dòng)軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動(dòng)接口、通信協(xié)議、圖形界面、標(biāo)準(zhǔn)化瀏覽器Browser等;嵌入式(實(shí)時(shí))操作系統(tǒng)的重要指標(biāo):實(shí)時(shí)性(中斷響應(yīng)時(shí)間、任務(wù)切換時(shí)間等)、尺寸(可裁剪性 )、可擴(kuò)展性(內(nèi)核、中間件);嵌入式操作系
2、統(tǒng)的發(fā)展操作系統(tǒng)內(nèi)核應(yīng)用程序驅(qū)動(dòng)程序和固件操作系統(tǒng)內(nèi)核文件系統(tǒng)驅(qū)動(dòng)程序和固件APIGUI應(yīng)用程序操作系統(tǒng)內(nèi)核文件系統(tǒng)驅(qū)動(dòng)程序和固件APIGUI應(yīng)用程序通信協(xié)議庫(kù)函數(shù)80年代初期80年代中期-90年代中期90年代末期-21世紀(jì)RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺(tái)BSPKERNELFSTCP/IP設(shè)備驅(qū)動(dòng)設(shè)備I/O調(diào)試工具其它組件應(yīng)用RTOSC/C+常見(jiàn)的嵌入式操作系統(tǒng) 實(shí)時(shí)嵌入式操作系統(tǒng)的種類繁多,大體上可分為兩種,商用型和免費(fèi)型。商用型的實(shí)操作系統(tǒng)功能穩(wěn)定、可靠,有完善的技術(shù)支持和售后服務(wù),但往往價(jià)格昂貴,如Vxworks、QNX、WinCE、Palm OS等。免費(fèi)型的實(shí)時(shí)操作系統(tǒng)在價(jià)格
3、方面具有優(yōu)勢(shì),目前主要有Linux,C/OS是一種源碼開(kāi)放的商業(yè)RTOS;C/OS是商業(yè)操作系統(tǒng)學(xué)習(xí)嵌入式操作系統(tǒng) 學(xué)習(xí)一種實(shí)時(shí)操作系統(tǒng)RTOS,如uc/OS,掌握實(shí)時(shí)系統(tǒng)的概念和設(shè)計(jì)方法;嵌入式系統(tǒng)以應(yīng)用為中心,應(yīng)用時(shí)選擇“適用”的操作系統(tǒng);嵌入式Linux;自己“寫(xiě)”RTOS一種學(xué)習(xí)態(tài)度;C/OS簡(jiǎn)介1、C/OSMicro Controller O S,微控制器操作系統(tǒng)2、 C/OS簡(jiǎn)介美國(guó)人Jean Labrosse 1992年完成應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動(dòng)機(jī)控制、高速公路電話系統(tǒng)、自動(dòng)提款機(jī)等 1998年C/OS-II,目前的版本C/OS -II V2.6
4、1,2.722000年,得到美國(guó)航空管理局(FAA)的認(rèn)證,可以用于飛行器中網(wǎng)站www.ucos-II.com()公開(kāi)源代碼可移植性(Portable) 絕大部分 C/OS-II的源碼是用移植性很強(qiáng)的ANSI C寫(xiě)的。和微處理器硬件相關(guān)的那部分是用匯編語(yǔ)言寫(xiě)的。匯編語(yǔ)言寫(xiě)的部分已經(jīng)壓到最低限度,使得 C/OS-II便于移植到其他微處理器上。 C/OS-II可以在絕大多數(shù)8位、16位、32位以至64位微處理器、微控制器 、數(shù)字信號(hào)處理器(DSP)上運(yùn)行。可固化(ROMable) C/OS-II是為嵌入式應(yīng)用而設(shè)計(jì)的,這就意味著,只要讀者有固化手段(C編譯、連接、下載和固化), C/OS-II可以
5、嵌入到讀者的產(chǎn)品中成為產(chǎn)品的一部分。可裁剪(Scalable) 可以只使用 C/OS-II中應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說(shuō)某產(chǎn)品可以只使用很少幾個(gè) C/OS-II調(diào)用,而另一個(gè)產(chǎn)品則使用了幾乎所有 C/OS-II的功能,這樣可以減少產(chǎn)品中的 C/OS-II所需的存儲(chǔ)器空間(RAM和ROM)。這種可剪裁性是靠條件編譯實(shí)現(xiàn)的。C/OS的性能特點(diǎn)(一)占先式(Preemptive)多任務(wù) C/OS-II可以管理64個(gè)任務(wù),然而,目前這一版本保留8個(gè)給系統(tǒng)。應(yīng)用程序最多可以有256個(gè)任務(wù)可確定性 全部 C/OS-II的函數(shù)調(diào)用與服務(wù)的執(zhí)行時(shí)間具有可確定性。任務(wù)棧 每個(gè)任務(wù)有自己?jiǎn)为?dú)的棧, C/O
6、S-II允許每個(gè)任務(wù)有不同的棧空間,以便壓低應(yīng)用程序?qū)AM的需求。系統(tǒng)服務(wù) C/OS-II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊(duì)列、信號(hào)量、塊大小固定的內(nèi)存的申請(qǐng)與釋放、時(shí)間相關(guān)函數(shù)等。中斷管理 中斷可以使正在執(zhí)行的任務(wù)暫時(shí)掛起,如果優(yōu)先級(jí)更高的任務(wù)被該中斷喚醒,則高優(yōu)先級(jí)的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)255層。穩(wěn)定性與可靠性C/OS的性能特點(diǎn)(二)C/OS-II圖書(shū)描述了C/OS-II內(nèi)部的工作原理隨書(shū)的CD中包含了源代碼工業(yè)界最清晰的源代碼除英文版外,有中文和韓文版ChineseKoreanEnglishISBN 1-57820-103-9美國(guó)CMP BOOK ISBN
7、 7-81077-290-2北京航空航天大學(xué)出版社ISBN 89-951540-5-5C/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:AvionicsMedicalCell phonesRouters and switchesHigh-end audio equipmentWashing machines and dryersUPS (Uninterruptible Power Supplies)Industrial controllersGPS Navigation SystemsMicrowave RadiosInstrumentationPoint-of-sale terminal
8、s更多C/OS-II提供的系統(tǒng)服務(wù)信號(hào)量帶互斥機(jī)制的信號(hào)量減少優(yōu)先級(jí)倒置的問(wèn)題事件標(biāo)志消息信箱消息隊(duì)列內(nèi)存管理時(shí)鐘管理任務(wù)管理C/GUI and C/FSC/GUI嵌入式的用戶界面用ANSI C書(shū)寫(xiě)支持任何8, 16, 32-bits CPU彩色,灰、度,等級(jí)或黑白顯示代碼尺寸小C/FS嵌入式的文件系統(tǒng)Written in ANSI C用ANSI C書(shū)寫(xiě)支持任何8, 16, 32-bits CPU支持SMC, MMC, SD, CF, IDE, Flash, RAM其他介質(zhì)可移植的數(shù)據(jù)類型typedef unsigned char BOOLEAN;typedef unsigned char I
9、NT8U;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;C/OS-II的文件結(jié)構(gòu)任務(wù)的實(shí)現(xiàn)創(chuàng)建任務(wù)的系統(tǒng)服務(wù)OSTaskCreate()INT8U OSTaskCreate (void (*task)(void *pd), /任務(wù)代碼指針 void *pdata, /任務(wù)參數(shù)指針OS_STK *
10、ptos, /任務(wù)棧的棧頂指針 INT8U prio /任務(wù)的優(yōu)先級(jí));OSTaskCreateExt()任務(wù)主函數(shù)一個(gè)任務(wù)通常是一個(gè)無(wú)限循環(huán)(返回值類型void)void MyTask(void *pdata) while (1) do something; waiting; do something; Why?任務(wù)也可以自我刪除(并非真的刪除,只是內(nèi)核不再知道該任務(wù))void MyTask (void *pdata) . /* 用戶代碼 */ OSTaskDel(OS_PRIO_SELF);C/OS-可以管理多達(dá)64個(gè)任務(wù);每個(gè)任務(wù)被賦以不同的優(yōu)先級(jí),取值從0到OS_LOWEST_PRIO
11、-2,數(shù)值越小,優(yōu)先級(jí)越高;系統(tǒng)保留了優(yōu)先級(jí)為0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0這8個(gè)任務(wù)以被將來(lái)使用,用戶可以有56個(gè)應(yīng)用任務(wù);任務(wù)的優(yōu)先級(jí)同樣也是它的標(biāo)識(shí)號(hào)ID。OS_CFG.H中定義63空閑任務(wù)和統(tǒng)計(jì)任務(wù)內(nèi)核總是創(chuàng)建一個(gè)空閑任務(wù)OSTaskIdle();總是設(shè)置為最低優(yōu)先級(jí),OS_LOWEST_PRIOR;當(dāng)所有其他任務(wù)都未在執(zhí)行時(shí),空閑任務(wù)開(kāi)始執(zhí)行;應(yīng)用程序不能刪除該任務(wù);空閑任務(wù)的工作就是把32位計(jì)數(shù)器OSIdleCtr加1,該計(jì)數(shù)器被統(tǒng)計(jì)任務(wù)所使用;統(tǒng)計(jì)任務(wù)OSTask
12、Stat(),提供運(yùn)行時(shí)間統(tǒng)計(jì)。每秒鐘運(yùn)行一次,計(jì)算當(dāng)前的CPU利用率。其優(yōu)先級(jí)是OS_LOWEST_PRIOR-1,可選。任務(wù)控制塊TCB任務(wù)控制塊 OS_TCB是描述一個(gè)任務(wù)的核心數(shù)據(jù)結(jié)構(gòu),存放了它的各種管理信息,包括任務(wù)堆棧指針,任務(wù)的狀態(tài)、優(yōu)先級(jí),任務(wù)鏈表指針等;一旦任務(wù)建立了,任務(wù)控制塊OS_TCB將被賦值。任務(wù)控制塊TCBtypedef struct os_tcb 棧指針; INT16U OSTCBId; /*任務(wù)的ID*/ 鏈表指針; OS_EVENT *OSTCBEventPtr; /*事件指針*/ void *OSTCBMsg; /*消息指針*/ INT8U OSTCBSta
13、t; /*任務(wù)的狀態(tài)*/ INT8U OSTCBPrio; /*任務(wù)的優(yōu)先級(jí)*/ 其他 OS_TCB;棧指針OSTCBStkPtr:指向當(dāng)前任務(wù)棧頂?shù)闹羔?,每個(gè)任務(wù)可以有自己的棧,棧的容量可以是任意的;OSTCBStkBottom:指向任務(wù)棧底的指針;OSTCBStkSize:棧的容量,用可容納的指針數(shù)目而不是字節(jié)數(shù)(Byte)來(lái)表示。鏈表指針?biāo)械娜蝿?wù)控制塊分屬于兩條不同的鏈表,單向的空閑鏈表(頭指針為OSTCBFreeList)和雙向的使用鏈表(頭指針為OSTCBList);OSTCBNext、OSTCBPrev:用于將任務(wù)控制塊插入到空閑鏈表或使用鏈表中。每個(gè)任務(wù)的任務(wù)控制塊在任務(wù)創(chuàng)建的
14、時(shí)候被鏈接到使用鏈表中,在任務(wù)刪除的時(shí)候從鏈表中被刪除。雙向連接的鏈表使得任一成員都能快速插入或刪除??臻eTCB鏈表所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組OSTCBTbl中,系統(tǒng)初始化時(shí),所有TCB被鏈接成空閑的單向鏈表,頭指針為OSTCBFreeList。當(dāng)創(chuàng)建一個(gè)任務(wù)后,就把OSTCBFreeList所指向的TCB賦給了該任務(wù),并將它加入到使用鏈表中,然后把OSTCBFreeList指向空閑鏈表中的下一個(gè)結(jié)點(diǎn)。系統(tǒng)初始化后指針數(shù)組,指向相應(yīng)TCB狀態(tài)的轉(zhuǎn)換刪除任務(wù) 任務(wù)的狀態(tài)休眠休眠狀態(tài)(Dormant):任務(wù)存在于內(nèi)存空間中,但內(nèi)核不可見(jiàn);可以通過(guò)以下函數(shù)通知內(nèi)核,使之變?yōu)榫途w狀態(tài)
15、:OSTaskCreate()或OSTaskCreateExt()可以通過(guò)以下函數(shù)返回到休眠狀態(tài):OSTaskDel() 任務(wù)的狀態(tài)運(yùn)行運(yùn)行狀態(tài)(Running):任務(wù)在CPU上運(yùn)行;當(dāng)一個(gè)任務(wù)在運(yùn)行時(shí),如果沒(méi)有關(guān)閉中斷,則有可能被中斷所打斷;當(dāng)一個(gè)任務(wù)在運(yùn)行時(shí),可能因?yàn)楦鞣N原因進(jìn)入阻塞狀態(tài)。OSMBoxPend(),OSQPend(),OSSemPend() OSTaskSuspend(), OSTimeDly()任務(wù)的狀態(tài)ISR中斷服務(wù)狀態(tài)(ISR):該任務(wù)原來(lái)在CPU上運(yùn)行,后來(lái)被中斷所打斷,由中斷服務(wù)程序ISR接管了CPU;當(dāng)中斷服務(wù)程序運(yùn)行完畢后,內(nèi)核要判斷是否有新的、更高優(yōu)先級(jí)的任
16、務(wù)就緒,如果有,則原有的任務(wù)被搶占;如果沒(méi)有,則原有的任務(wù)重新運(yùn)行。任務(wù)的狀態(tài)阻塞阻塞/等待狀態(tài)(Waiting):任務(wù)由于正在等待某個(gè)事件(信號(hào)量、郵箱或隊(duì)列)而被掛起;當(dāng)任務(wù)等待的事件發(fā)生時(shí),回到就緒狀態(tài)。OSMBoxpost(), OSQPost(), OSSemPost(), OSTaskResume(), OSTimeDlyResume()或OSTimeTick()任務(wù)的狀態(tài)就緒就緒狀態(tài)(Ready):萬(wàn)事具備,只欠CPU;在所有的就緒任務(wù)當(dāng)中,具有最高優(yōu)先級(jí)的任務(wù)被選中去運(yùn)行;如果任務(wù)在運(yùn)行的時(shí)候被搶占了CPU,則又回到就緒狀態(tài)。任務(wù)就緒表每個(gè)任務(wù)的就緒態(tài)標(biāo)志放入在就緒表中,就緒表
17、中有兩個(gè)變量OSRdyGrp和OSRdyTbl。 在OSRdyGrp中,任務(wù)按優(yōu)先級(jí)分組,8個(gè)任務(wù)為一組。OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒態(tài)的任務(wù)。任務(wù)進(jìn)入就緒態(tài)時(shí),就緒表OSRdyTbl中的相應(yīng)元素的相應(yīng)位也置位。任務(wù)就緒表OSRdyGrp 1207654300XXXYYY任務(wù)優(yōu)先級(jí) 201765431089151413121118161723222120192624253130292827343233393837363542404147464544435048495554535251585657636261605901234567OSRdyTbl7XY優(yōu)先級(jí)最
18、低任務(wù) (空閑任務(wù)) 優(yōu)先級(jí)最高任務(wù) 任務(wù)優(yōu)先級(jí)號(hào) 對(duì)于整數(shù)OSRdyTbli(0i7),若它的某一位為1,則OSRdyGrp的第i位為1。任務(wù)的優(yōu)先級(jí)由X和Y確定根據(jù)優(yōu)先級(jí)確定就緒表(1)假設(shè)優(yōu)先級(jí)為12的任務(wù)進(jìn)入就緒狀態(tài),12=1100b,則OSRdyTbl1的第4位置1,且OSRdyGrp的第1位置1,相應(yīng)的數(shù)學(xué)表達(dá)式為: OSRdyGrp |=0 x02; OSRdyTbl1 |=0 x10;而優(yōu)先級(jí)為21的任務(wù)就緒21=10 101b,則OSRdyTbl2的第5位置1,且OSRdyGrp的第2位置1,相應(yīng)的數(shù)學(xué)表達(dá)式為: OSRdyGrp |=0 x04; OSRdyTbl2 |=0
19、 x20;根據(jù)優(yōu)先級(jí)確定就緒表(2)從上面的計(jì)算可知:若OSRdyGrp及OSRdyBbl的第n位置1,則應(yīng)該把OSRdyGrp及OSRdyBbl的值與2n 相或。uC/OS中,把2n的n=0-7的8個(gè)值先計(jì)算好存在數(shù)組OSMapTbl7中,也就是: OSMapTbl0 = 20 = 0 x01(0000 0001) OSMapTbl1 = 21 = 0 x02(0000 0010) OSMapTbl7 = 27 = 0 x80(1000 0000)使任務(wù)進(jìn)入就緒態(tài)如果prio是任務(wù)的優(yōu)先級(jí),即任務(wù)的標(biāo)識(shí)號(hào),則將任務(wù)放入就緒表,即使任務(wù)進(jìn)入就緒態(tài)的方法是:OSRdyGrp |= OSMapTb
20、lprio3;OSRdyTblprio3 |= OSMapTblprio&0 x07;假設(shè)優(yōu)先級(jí)為121100bOSRdyGrp |= OSMapTbl123(0 x02);OSRdyTbl1 |=0 x10;使任務(wù)脫離就緒態(tài)將任務(wù)就緒表OSRdyTblprio3相應(yīng)元素的相應(yīng)位清零,而且當(dāng)OSRdyTblprio3中的所有位都為零時(shí),即該任務(wù)所在組的所有任務(wù)中沒(méi)有一個(gè)進(jìn)入就緒態(tài)時(shí),OSRdyGrp的相應(yīng)位才為零。if(OSRdyTblprio3 &= OSMapTblprio&0 x07) = 0) OSRdyGrp &= OSMapTblprio3;任務(wù)的調(diào)度C/OS是可搶占實(shí)時(shí)多任務(wù)內(nèi)核
21、,它總是運(yùn)行就緒任務(wù)中優(yōu)先級(jí)最高的那一個(gè)。C/OS中不支持時(shí)間片輪轉(zhuǎn)法,每個(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ù)無(wú)關(guān)。確定哪個(gè)任務(wù)的優(yōu)先級(jí)最高,應(yīng)該選擇哪個(gè)任務(wù)去運(yùn)行,這部分的工作是由調(diào)度器(Scheduler)來(lái)完成的。 任務(wù)級(jí)的調(diào)度是由函數(shù)OSSched()完成的;中斷級(jí)的調(diào)度是由另一個(gè)函數(shù)OSIntExt()完成的。根據(jù)就緒表確定最高優(yōu)先級(jí)兩個(gè)關(guān)鍵:將優(yōu)先級(jí)數(shù)分解為高三位和低三位分別確定;高優(yōu)先級(jí)有著小的優(yōu)先級(jí)號(hào);根據(jù)就緒表確定最高優(yōu)先級(jí)通過(guò)OSRdyGrp值確
22、定高3位,假設(shè)OSRdyGrp0 x08=0 x00001000,第3位為1,優(yōu)先級(jí)的高3位為011;通過(guò)OSRdyTbl3的值來(lái)確定低3位,假設(shè)OSRdyTbl30 x3a,第1位為1,優(yōu)先級(jí)的低3位為001,3*8+1=2500011001任務(wù)優(yōu)先級(jí)任務(wù)調(diào)度器void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); if
23、 (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OS_TASK_SW(); OS_EXIT_CRITICAL();檢查是否中斷調(diào)用和允許任務(wù)調(diào)用找到優(yōu)先級(jí)最高的任務(wù)該任務(wù)是否正在運(yùn)行源代碼中使用了查表法查表法具有確定的時(shí)間,增加了系統(tǒng)的可預(yù)測(cè)性,uC/OS中所有的系統(tǒng)調(diào)用時(shí)間都是確定的Y = OSUnMapTblOSRdyGrp;X = OSUnMapTblOSRdyTblY;Prio = (Y3) + X;參見(jiàn)OS_CORE.CINT8U const OSUnMapTbl =
24、 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0,
25、 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0,
26、 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0;優(yōu)先級(jí)判定表OSUnMapTbl256舉例: 如OSRdyGrp的值為01101000B,即0X68,則查得OSUnMapTblOSRdyGrp的值是3,它相應(yīng)于OSRdyGrp中的第3位置1; 如OSRdyTbl3的值是11100100B,即0XE4,則查OSU
27、nMapTblOSRdyTbl3的值是2,則進(jìn)入就緒態(tài)的最高任務(wù)優(yōu)先級(jí) Prio=3*8+2=26 任務(wù)切換將被掛起任務(wù)的寄存器內(nèi)容入棧;將較高優(yōu)先級(jí)任務(wù)的寄存器內(nèi)容出棧,恢復(fù)到硬件寄存器中。任務(wù)級(jí)的任務(wù)切換OS_TASK_SW()通過(guò)sc系統(tǒng)調(diào)用指令完成保護(hù)當(dāng)前任務(wù)的現(xiàn)場(chǎng)恢復(fù)新任務(wù)的現(xiàn)場(chǎng)執(zhí)行中斷返回指令開(kāi)始執(zhí)行新的任務(wù)調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級(jí)任務(wù) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)保存當(dāng)前CPU寄存器的值
28、低優(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存貯器低地址存貯器高地址高優(yōu)先級(jí)任務(wù) OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)任務(wù)切換OS_TASK_SW()的
29、代碼Void OSCtxSw(void) 將R1,R2,R3及R4推入當(dāng)前堆棧; OSTCBCurOSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy OSTCBSTKPtr; 將R4,R3,R2及R1從新堆棧中彈出; 執(zhí)行中斷返回指令;給調(diào)度器上鎖OSSchedlock():給調(diào)度器上鎖函數(shù),用于禁止任務(wù)調(diào)度,保持對(duì)CPU的控制權(quán)(即使有優(yōu)先級(jí)更高的任務(wù)進(jìn)入了就緒態(tài));OSSchedUnlock():給調(diào)度器開(kāi)鎖函數(shù),當(dāng)任務(wù)完成后調(diào)用此函數(shù),調(diào)度重新得到允許;當(dāng)?shù)蛢?yōu)先級(jí)的任務(wù)要發(fā)消息給多任務(wù)的郵箱、消息隊(duì)列、信號(hào)量時(shí),它不希
30、望高優(yōu)先級(jí)的任務(wù)在郵箱、隊(duì)列和信號(hào)量還沒(méi)有得到消息之前就取得了CPU的控制權(quán),此時(shí),可以使用調(diào)度器上鎖函數(shù)。任務(wù)管理的系統(tǒng)服務(wù)創(chuàng)建任務(wù)刪除任務(wù)修改任務(wù)的優(yōu)先級(jí)掛起和恢復(fù)任務(wù)獲得一個(gè)任務(wù)的有關(guān)信息創(chuàng)建任務(wù)創(chuàng)建任務(wù)的函數(shù)OSTaskCreate();OSTaskCreateExt();OSTaskCreateExt()是OSTaskCreate()的擴(kuò)展版本,提供了一些附加的功能;任務(wù)可以在多任務(wù)調(diào)度開(kāi)始 (即調(diào)用OSStart() 之前創(chuàng)建,也可以在其它任務(wù)的執(zhí)行過(guò)程中被創(chuàng)建。但在OSStart()被調(diào)用之前,用戶必須創(chuàng)建至少一個(gè)任務(wù);不能在中斷服務(wù)程序(ISR)中創(chuàng)建新任務(wù)。OSTaskCre
31、ate()INT8U OSTaskCreate (void (*task)(void *pd), /任務(wù)代碼指針 void *pdata, /任務(wù)參數(shù)指針OS_STK *ptos, /任務(wù)棧的棧頂指針 INT8U prio /任務(wù)的優(yōu)先級(jí));返回值OS_NO_ERR:函數(shù)調(diào)用成功;OS_PRIO_EXIT:任務(wù)優(yōu)先級(jí)已經(jīng)存在;OS_PRIO_INVALID:任務(wù)優(yōu)先級(jí)無(wú)效。OSTaskCreate()的實(shí)現(xiàn)過(guò)程任務(wù)優(yōu)先級(jí)檢查該優(yōu)先級(jí)是否在0到OS_LOWSEST_PRIO之間?該優(yōu)先級(jí)是否空閑?調(diào)用OSTaskStkInit(),創(chuàng)建任務(wù)的棧幀;調(diào)用OSTCBInit(),從空閑的OS_TCB
32、池(即OSTCBFreeList鏈表)中獲得一個(gè)TCB并初始化其內(nèi)容,然后把它加入到OSTCBList鏈表的開(kāi)頭,并把它設(shè)定為就緒狀態(tài);任務(wù)個(gè)數(shù)OSTaskCtr加1;調(diào)用用戶自定義的函數(shù)OSTaskCreateHook();判斷是否需要調(diào)度(調(diào)用者是正在執(zhí)行的任務(wù))OSTaskCreateExt()INT8U OSTaskCreateExt(前四個(gè)參數(shù)與OSTaskCreate相同,INT16U id, /任務(wù)的IDOS_STK *pbos, /指向任務(wù)棧底的指針 INT32U stk_size, /棧能容納的成員數(shù)目void *pext,/指向用戶附加數(shù)據(jù)域的指針I(yè)NT16U opt /一
33、些選項(xiàng)信息);返回值:與OSTaskCreate()相同。任務(wù)的??臻g每個(gè)任務(wù)都有自己的??臻g(Stack),棧必須聲明為OS_STK類型,并且由連續(xù)的內(nèi)存空間組成;??臻g的分配方法靜態(tài)分配:在編譯的時(shí)候分配,例如:static OS_STK MyTaskStackstack_size;OS_STK MyTaskStackstack_size;動(dòng)態(tài)分配:在任務(wù)運(yùn)行的時(shí)候使用malloc()函數(shù)來(lái)動(dòng)態(tài)申請(qǐng)內(nèi)存空間;OS_STK *pstk; pstk = (OS_STK *)malloc(stack_size);/* 確認(rèn)malloc()能得到足夠的內(nèi)存空間 */ if (pstk != (OS
34、_STK *)0) Create the task; 動(dòng)態(tài)分配內(nèi)存碎片問(wèn)題在動(dòng)態(tài)分配中,可能存在內(nèi)存碎片問(wèn)題。特別是當(dāng)用戶反復(fù)地建立和刪除任務(wù)時(shí),內(nèi)存堆中可能會(huì)出現(xiàn)大量的碎片,導(dǎo)致沒(méi)有足夠大的一塊連續(xù)內(nèi)存區(qū)域可用作任務(wù)棧,這時(shí)malloc()便無(wú)法成功地為任務(wù)分配??臻g。3Kb堆初始狀態(tài)A(1Kb)B(1Kb)C(1Kb)3個(gè)任務(wù)1KbB(1Kb)1Kb刪除A,C棧的增長(zhǎng)方向棧的增長(zhǎng)方向的設(shè)置從低地址到高地址:在OS_CPU.H中,將常量 OS_STK_GROWTH設(shè)定為 0;從高地址到低地址:在OS_CPU.H中,將常量 OS_STK_GROWTH設(shè)定為 1; OS_STK TaskStac
35、kTASK_STACK_SIZE; OSTaskCreate(task, pdata, &TaskStackTASK_STACK_SIZE-1, prio);刪除任務(wù)OSTaskDel():刪除一個(gè)任務(wù),其TCB會(huì)從所有可能的系統(tǒng)數(shù)據(jù)結(jié)構(gòu)中移除。任務(wù)將返回并處于休眠狀態(tài)(任務(wù)的代碼還在)。如果任務(wù)正處于就緒狀態(tài),把它從就緒表中移出,這樣以后就不會(huì)再被調(diào)度執(zhí)行了;如果任務(wù)正處于郵箱、消息隊(duì)列或信號(hào)量的等待隊(duì)列中,也把它移出;將任務(wù)的OS_TCB從OSTCBList鏈表當(dāng)中移動(dòng)到OSTCBFreeList。OSTaskChangePrio():在程序運(yùn)行期間,用戶可以通過(guò)調(diào)用本函數(shù)來(lái)改變某個(gè)任務(wù)的
36、優(yōu)先級(jí)。INT8U OSTaskChangePrio(INT8U oldprio, INT8U newprio)OSTaskQuery():獲得一個(gè)任務(wù)的有關(guān)信息獲得的是對(duì)應(yīng)任務(wù)的OS_TCB中內(nèi)容的拷貝。OSTaskSuspend():掛起一個(gè)任務(wù)如果任務(wù)處于就緒態(tài),把它從就緒表中移出;在任務(wù)的TCB中設(shè)置OS_STAT_SUSPEND標(biāo)志,表明該任務(wù)正在被掛起。OSTaskResume():恢復(fù)一個(gè)任務(wù)恢復(fù)被OSTaskSuspend()掛起的任務(wù);清除TCB中OSTCBStat字段的OS_STAT_SUSPEND位掛起和恢復(fù)任務(wù)實(shí)時(shí)操作系統(tǒng)C/OS-II中斷和時(shí)間管理中斷處理中斷:由于某
37、種事件的發(fā)生而導(dǎo)致程序流程的改變。產(chǎn)生中斷的事件稱為中斷源。CPU響應(yīng)中斷的條件:至少有一個(gè)中斷源向CPU發(fā)出中斷信號(hào);系統(tǒng)允許中斷,且對(duì)此中斷信號(hào)未予屏蔽。中斷服務(wù)程序ISR中斷一旦被識(shí)別,CPU會(huì)保存部分(或全部)運(yùn)行上下文(context,即寄存器的值),然后跳轉(zhuǎn)到專門的子程序去處理此次事件,稱為中斷服務(wù)子程序(ISR)。C/OS-中,中斷服務(wù)子程序要用匯編語(yǔ)言來(lái)編寫(xiě),然而,如果用戶使用的C語(yǔ)言編譯器支持內(nèi)嵌匯編語(yǔ)言的話,用戶可以直接將中斷服務(wù)子程序代碼放在C語(yǔ)言的程序文件中。(1)保存全部CPU寄存器的值;(2)調(diào)用OSIntEnter(),或直接把全局變量OSIntNesting(中
38、斷嵌套層次)加1;(3)執(zhí)行用戶代碼做中斷服務(wù);(4)調(diào)用OSIntExit();(5)恢復(fù)所有CPU寄存器;(6)執(zhí)行中斷返回指令。用戶ISR的框架OSIntEnter()/* 在調(diào)用本函數(shù)之前必須先將中斷關(guān)閉 */void OSIntEnter (void) if (OSRunning = TRUE) if (OSIntNesting 255) OSIntNesting+; OSIntExit的意義OSIntExit()void OSIntExit (void) OS_ENTER_CRITICAL(); /關(guān)中斷 if (-OSIntNesting|OSLockNesting) = 0)/
39、判斷 /把高優(yōu)先級(jí)任務(wù)裝入 嵌套是否為零 OSIntExitY = OSUnMapTblOSRdyGrp; OSPrioHighRdy=(INT8U)(OSIntExitYOSTCBPrio != OS_IDLE_PRIO) (3) OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) If (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) (4) OSRdyGrp |= ptcb-OSTCBBitY; (5) OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX;
40、 else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL(); (6) OSTime+; (7) OS_EXIT_CRITICAL();時(shí)間管理與時(shí)間管理相關(guān)的系統(tǒng)服務(wù):OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()OSTimeDLY()OSTimeDLY():任務(wù)延時(shí)函數(shù),申請(qǐng)?jiān)摲?wù)的任務(wù)可以延時(shí)一段時(shí)間;調(diào)用OSTimeDLY后,任務(wù)進(jìn)入等待狀態(tài);使用方法void OSTimeDly (INT1
41、6U ticks);ticks表示需要延時(shí)的時(shí)間長(zhǎng)度,用時(shí)鐘節(jié)拍的個(gè)數(shù)來(lái)表示。OSTimeDLY()void OSTimeDly (INT16U ticks) if (ticks 0) OS_ENTER_CRITICAL(); if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) OSRdyGrp &= OSTCBCur-OSTCBBitY; OSTCBCur-OSTCBDly = ticks; OS_EXIT_CRITICAL(); OSSched(); OSTimeDLY(1)的問(wèn)題OSTimeDLY的問(wèn)題(1)將任務(wù)延遲一個(gè)時(shí)鐘節(jié)
42、拍(第一種情況)OSTimeDLY的問(wèn)題(2)將任務(wù)延遲一個(gè)時(shí)鐘節(jié)拍(第二種情況)OSTimeDlyHMSM()OSTimeDlyHMSM():OSTimeDly()的另一個(gè)版本,即按時(shí)分秒延時(shí)函數(shù);使用方法INT8U OSTimeDlyHMSM( INT8U hours, / 小時(shí) INT8U minutes, / 分鐘 INT8U seconds, / 秒 INT16U milli / 毫秒 );OSTimeDlyResume()OSTimeDlyResume():讓處在延時(shí)期的任務(wù)提前結(jié)束延時(shí),進(jìn)入就緒狀態(tài);使用方法INT8U OSTimeDlyResume (INT8Uprio);prio表示需要提前結(jié)束延時(shí)的任務(wù)的優(yōu)先級(jí)/任務(wù)ID。系統(tǒng)時(shí)間每隔一個(gè)時(shí)鐘節(jié)拍,發(fā)生一個(gè)時(shí)鐘中斷,將一個(gè)32位的計(jì)數(shù)器OSTime加1;該計(jì)數(shù)器在用戶調(diào)用OSStart()初始化多任務(wù)和4,294,967,295個(gè)節(jié)拍執(zhí)行完一遍的時(shí)候從0開(kāi)始計(jì)數(shù)。若時(shí)鐘節(jié)拍的頻率等于100Hz,該計(jì)數(shù)器每隔497天就重新開(kāi)始計(jì)數(shù);OSTimeGet():獲得該計(jì)數(shù)器的當(dāng)前值;INT32U OSTimeGet (void);OSTimeSet():設(shè)置該計(jì)數(shù)器的值。void OSTimeSet (INT32U tic
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度門面房出租與租賃期限調(diào)整合同
- 二零二五年度診所負(fù)責(zé)人安全責(zé)任免除合同
- 服務(wù)器采購(gòu)合同共
- 無(wú)人機(jī)研發(fā)制造投資合同
- 水利設(shè)施施工合同
- 高考語(yǔ)文復(fù)習(xí)-文言文專題訓(xùn)練-《遼史》
- 高考語(yǔ)文復(fù)習(xí):文言文霍去病專練
- 農(nóng)業(yè)產(chǎn)業(yè)孵化項(xiàng)目合作協(xié)議書(shū)
- 業(yè)務(wù)流程外包服務(wù)協(xié)議內(nèi)容詳訂
- 數(shù)字媒體設(shè)計(jì)技能考核點(diǎn)
- 2023國(guó)家自然科學(xué)基金申請(qǐng)書(shū)
- 蜂膠表彰會(huì)中宏全國(guó)通用版模板課件
- 原始狩獵圖 (2)
- 《色彩構(gòu)成——色彩基礎(chǔ)知識(shí)》PPT課件
- 煤礦供電系統(tǒng)及供電安全講座方案課件
- 綠色建筑及材料分析及案列
- 鍍層的結(jié)合力
- 霍尼韋爾DDC編程軟件(CARE)簡(jiǎn)介
- 實(shí)用中西醫(yī)結(jié)合診斷治療學(xué)
- 論《說(shuō)文解字》中的水文化
- 德龍自卸車合格證掃描件(原圖)
評(píng)論
0/150
提交評(píng)論