四、嵌入式實(shí)時(shí)操作系統(tǒng)_第1頁(yè)
四、嵌入式實(shí)時(shí)操作系統(tǒng)_第2頁(yè)
四、嵌入式實(shí)時(shí)操作系統(tǒng)_第3頁(yè)
四、嵌入式實(shí)時(shí)操作系統(tǒng)_第4頁(yè)
四、嵌入式實(shí)時(shí)操作系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩85頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)第四講第四講 實(shí)時(shí)操作系統(tǒng)實(shí)時(shí)操作系統(tǒng) C/OS-C/OS-分析分析2本節(jié)提要本節(jié)提要 C/OS-簡(jiǎn)介簡(jiǎn)介 C/OS-C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu) C/OS-任務(wù)通信與同步任務(wù)通信與同步 C/OS-C/OS-任務(wù)管理任務(wù)管理 C/OS-時(shí)間管理時(shí)間管理3常見的嵌入式操作系統(tǒng)常見的嵌入式操作系統(tǒng) 實(shí)時(shí)嵌入式操作系統(tǒng)的種類繁多,大體上可分為兩種實(shí)時(shí)嵌入式操作系統(tǒng)的種類繁多,大體上可分為兩種: :商用型商用型和免費(fèi)型。和免費(fèi)型。l商用型的實(shí)操作系統(tǒng)功能穩(wěn)定、可靠,有完善的技術(shù)支持和售商用型的實(shí)操作系統(tǒng)功能穩(wěn)定、可靠,有完善的技術(shù)支持和售后服務(wù),但往往價(jià)

2、格昂貴后服務(wù),但往往價(jià)格昂貴, ,如如VxWorksVxWorks、QNXQNX、WinCEWinCE、Palm OSPalm OS等。等。l免費(fèi)型的實(shí)時(shí)操作系統(tǒng)在價(jià)格方面具有優(yōu)勢(shì),目前主要有免費(fèi)型的實(shí)時(shí)操作系統(tǒng)在價(jià)格方面具有優(yōu)勢(shì),目前主要有LinuxLinux和和C/OSC/OS,穩(wěn)定性與服務(wù)性存在挑戰(zhàn)。,穩(wěn)定性與服務(wù)性存在挑戰(zhàn)。4學(xué)習(xí)嵌入式操作系統(tǒng)學(xué)習(xí)嵌入式操作系統(tǒng) l學(xué)習(xí)一種實(shí)時(shí)操作系統(tǒng)學(xué)習(xí)一種實(shí)時(shí)操作系統(tǒng)RTOSRTOS,如,如C/OS,C/OS,掌握實(shí)時(shí)系統(tǒng)的概念掌握實(shí)時(shí)系統(tǒng)的概念和設(shè)計(jì)方法;和設(shè)計(jì)方法;l嵌入式系統(tǒng)以應(yīng)用為中心,應(yīng)用時(shí)選擇嵌入式系統(tǒng)以應(yīng)用為中心,應(yīng)用時(shí)選擇“適用適用

3、”的操作系統(tǒng);的操作系統(tǒng);l嵌入式嵌入式LinuxLinux;l自己自己“寫寫”RTOSRTOS一種學(xué)習(xí)態(tài)度一種學(xué)習(xí)態(tài)度. .5RTOSRTOS在嵌入式系統(tǒng)中的位置在嵌入式系統(tǒng)中的位置嵌入式硬件平臺(tái)BSPKERNELFSTCP/IP設(shè)備驅(qū)動(dòng)設(shè)備驅(qū)動(dòng)設(shè)備設(shè)備I/O調(diào)試工具調(diào)試工具其他組件其他組件應(yīng)用RTOSC/C+6RTOSRTOS是是3232位的嵌入式位的嵌入式CPUCPU的軟件基礎(chǔ)的軟件基礎(chǔ)lRTOSRTOS內(nèi)核提供內(nèi)核提供CPUCPU的管理:的管理:硬件初始化,硬件初始化,MMUMMU,定時(shí)器,中斷;,定時(shí)器,中斷;lRTOSRTOS內(nèi)核提供任務(wù),內(nèi)存管理;內(nèi)核提供任務(wù),內(nèi)存管理;lRTO

4、SRTOS提供設(shè)備管理,文件和網(wǎng)絡(luò)的支持;提供設(shè)備管理,文件和網(wǎng)絡(luò)的支持;lRTOSRTOS提供提供C/C+C/C+,JAVAJAVA,圖形模塊等編程接口。,圖形模塊等編程接口。7C/OS簡(jiǎn)介1. C/OSMicro Controller O S,微控制器操作系統(tǒng)2 2. C/OSC/OS簡(jiǎn)介l美國(guó)人美國(guó)人Jean LabrosseJean Labrosse 于于19921992年完成;年完成;l應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動(dòng)機(jī)應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動(dòng)機(jī)控制、高速公路電話系統(tǒng)、自動(dòng)提款機(jī)等控制、高速公路電話系統(tǒng)、自動(dòng)提款機(jī)等 ;l199

5、81998年年 C/OSC/OS-II-II,目前的版本,目前的版本 C/OSC/OS -II V2.61 -II V2.61,2.722.72;l20002000年,得到美國(guó)航空管理局(年,得到美國(guó)航空管理局(FAAFAA)的認(rèn)證,可用于飛行器中;)的認(rèn)證,可用于飛行器中;l網(wǎng)站網(wǎng)站www.ucos-II.comwww.ucos-II.com().com)。8公開源代碼公開源代碼可移植性(可移植性(PortablePortable) 絕大部分絕大部分 C/OS-II C/OS-II的源碼是用移植性很強(qiáng)的的源碼是用移植性很強(qiáng)的ANSI CANSI C寫的。和微處寫的。和微處理器硬件相關(guān)的那部分

6、是用匯編語(yǔ)言寫的。匯編語(yǔ)言寫的部分已經(jīng)壓理器硬件相關(guān)的那部分是用匯編語(yǔ)言寫的。匯編語(yǔ)言寫的部分已經(jīng)壓到最低限度,使得到最低限度,使得 C/OS-II C/OS-II便于移植到其他微處理器上。便于移植到其他微處理器上。 C/OS-II C/OS-II可以在絕大多數(shù)可以在絕大多數(shù)8 8位、位、1616位、位、3232位以至位以至6464位微處理器、微控制器位微處理器、微控制器 、數(shù)、數(shù)字信號(hào)處理器(字信號(hào)處理器(DSPDSP)上運(yùn)行。)上運(yùn)行??晒袒晒袒≧OMableROMable) C/OS-II C/OS-II是為嵌入式應(yīng)用而設(shè)計(jì)的,這就意味著,只要讀者有固是為嵌入式應(yīng)用而設(shè)計(jì)的,這就意

7、味著,只要讀者有固化手段(化手段(C C編譯、連接、下載和固化),編譯、連接、下載和固化), C/OS-II C/OS-II可以嵌入到讀者的可以嵌入到讀者的產(chǎn)品中成為產(chǎn)品的一部分。產(chǎn)品中成為產(chǎn)品的一部分??刹眉簦刹眉簦⊿calableScalable) 可以只使用可以只使用 C/OS-II C/OS-II中應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說(shuō)中應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說(shuō)某產(chǎn)品可以只使用很少幾個(gè)某產(chǎn)品可以只使用很少幾個(gè) C/OS-II C/OS-II調(diào)用,而另一個(gè)產(chǎn)品則使用了幾調(diào)用,而另一個(gè)產(chǎn)品則使用了幾乎所有乎所有 C/OS-II C/OS-II的功能,這樣可以減少產(chǎn)品中的的功能,

8、這樣可以減少產(chǎn)品中的 C/OS-II C/OS-II所需的存所需的存儲(chǔ)器空間(儲(chǔ)器空間(RAMRAM和和ROMROM)。這種可剪裁性是靠條件編譯實(shí)現(xiàn)的。)。這種可剪裁性是靠條件編譯實(shí)現(xiàn)的。C/OS的性能特點(diǎn)(一)9占先式(占先式(PreemptivePreemptive)多任務(wù)多任務(wù) C/OS-IIC/OS-II可以管理可以管理6464個(gè)任務(wù),然而,目前這一版本保留個(gè)任務(wù),然而,目前這一版本保留8 8個(gè)給系統(tǒng)。應(yīng)用程個(gè)給系統(tǒng)。應(yīng)用程序最多可以有序最多可以有5656個(gè)任務(wù)。個(gè)任務(wù)??纱_定性可確定性 全部全部 C/OS-II C/OS-II的函數(shù)調(diào)用與服務(wù)的執(zhí)行時(shí)間具有可確定性。的函數(shù)調(diào)用與服務(wù)的

9、執(zhí)行時(shí)間具有可確定性。任務(wù)棧任務(wù)棧 每個(gè)任務(wù)有自己?jiǎn)为?dú)的棧,每個(gè)任務(wù)有自己?jiǎn)为?dú)的棧, C/OS-II C/OS-II允許每個(gè)任務(wù)有不同的棧空間,以便允許每個(gè)任務(wù)有不同的??臻g,以便壓低應(yīng)用程序?qū)旱蛻?yīng)用程序?qū)AMRAM的需求。的需求。系統(tǒng)服務(wù)系統(tǒng)服務(wù) C/OS-IIC/OS-II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊(duì)列、信號(hào)量、塊大小固定的提供很多系統(tǒng)服務(wù),例如郵箱、消息隊(duì)列、信號(hào)量、塊大小固定的內(nèi)存的申請(qǐng)與釋放、時(shí)間相關(guān)函數(shù)等。內(nèi)存的申請(qǐng)與釋放、時(shí)間相關(guān)函數(shù)等。中斷管理中斷管理 中斷可以使正在執(zhí)行的任務(wù)暫時(shí)掛起,如果優(yōu)先級(jí)更高的任務(wù)被該中斷喚醒,中斷可以使正在執(zhí)行的任務(wù)暫時(shí)掛起,如果優(yōu)先級(jí)更高

10、的任務(wù)被該中斷喚醒,則高優(yōu)先級(jí)的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)則高優(yōu)先級(jí)的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)255255層。層。穩(wěn)定性與可靠性穩(wěn)定性與可靠性C/OS的性能特點(diǎn)(二)10 C/OS-IIC/OS-II圖書圖書l描述了描述了 C/OS-IIC/OS-II內(nèi)部的工作原理;內(nèi)部的工作原理;l隨書的隨書的CDCD中包含了源代碼;中包含了源代碼;工業(yè)界最清晰的源代碼工業(yè)界最清晰的源代碼l除英文版外,有中文和韓文版。除英文版外,有中文和韓文版。ChineseKoreanEnglishISBN 1-57820-103-9美國(guó)CMP BOOK ISBN 7-8

11、1077-290-2北京航空航天大學(xué)出版社ISBN 89-951540-5-511C/OS-II的各種商業(yè)應(yīng)用l全世界有數(shù)百種產(chǎn)品在應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用: :lAvionicslMedicallCell phoneslRouters and switcheslHigh-end audio equipmentlWashing machines and dryerslUPS (Uninterruptible Power Supplies)lIndustrial controllerslGPS Navigation SystemslMicrowave RadioslInstrumentati

12、onlPoint-of-sale terminalsl更多更多12C/OS-II提供的系統(tǒng)服務(wù)l信號(hào)量;信號(hào)量;l帶互斥機(jī)制的信號(hào)量;帶互斥機(jī)制的信號(hào)量;減少優(yōu)先級(jí)倒置的問(wèn)題減少優(yōu)先級(jí)倒置的問(wèn)題l事件標(biāo)志;事件標(biāo)志;l消息信箱;消息信箱;l消息隊(duì)列;消息隊(duì)列;l內(nèi)存管理;內(nèi)存管理;l時(shí)鐘管理;時(shí)鐘管理;l任務(wù)管理。任務(wù)管理。13 C/GUI and C/FSl C/GUIC/GUI嵌入式的用戶界面;嵌入式的用戶界面;用用ANSI CANSI C書寫;書寫;支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits CPU;彩色,灰度,等級(jí)或黑白顯示;彩色,灰度,等級(jí)或黑白

13、顯示;代碼尺寸小。代碼尺寸小。l C/FSC/FS嵌入式的文件系統(tǒng)嵌入式的文件系統(tǒng)Written in ANSI CWritten in ANSI C;用用ANSI CANSI C書寫;書寫;支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits CPU;支持支持SMC, MMC, SD, CF, IDE, Flash, RAMSMC, MMC, SD, CF, IDE, Flash, RAM其他介質(zhì)。其他介質(zhì)。14本節(jié)提要本節(jié)提要 C/OS-簡(jiǎn)介簡(jiǎn)介 C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu) C/OS-任務(wù)通信與同步任務(wù)通信與同步 C/OS-C/OS-任務(wù)管理任務(wù)管理 C/OS-

14、時(shí)間管理時(shí)間管理15C/OS-II的文件結(jié)構(gòu)16l內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)l任務(wù)管理任務(wù)管理l時(shí)間管理時(shí)間管理l任務(wù)之間通信與同步任務(wù)之間通信與同步l C/OSC/OS的移植的移植C/OS-II的內(nèi)核結(jié)構(gòu)17l當(dāng)處理臨界段代碼時(shí),需要關(guān)中斷,處理完畢后,再開中斷;當(dāng)處理臨界段代碼時(shí),需要關(guān)中斷,處理完畢后,再開中斷;l關(guān)中斷時(shí)間是實(shí)時(shí)內(nèi)核最重要的指標(biāo)之一;關(guān)中斷時(shí)間是實(shí)時(shí)內(nèi)核最重要的指標(biāo)之一;l在實(shí)際應(yīng)用中,關(guān)中斷的時(shí)間很大程度中取決于微處理器的結(jié)構(gòu)在實(shí)際應(yīng)用中,關(guān)中斷的時(shí)間很大程度中取決于微處理器的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量;和編譯器生成的代碼質(zhì)量;l C/OSC/OS-II-II定義兩個(gè)宏開關(guān)中斷

15、定義兩個(gè)宏開關(guān)中斷:OS_ENTER_CRITICAL():OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()。C/OS-II中開關(guān)中斷的方法18lOS_CRITICAL_METHOD=1OS_CRITICAL_METHOD=1l用處理器指令關(guān)中斷,執(zhí)行用處理器指令關(guān)中斷,執(zhí)行OS_ENTER_CRITICAL()OS_ENTER_CRITICAL(),開中斷執(zhí),開中斷執(zhí)行行OS_EXIT_CRITICAL()OS_EXIT_CRITICAL();lOS_CRITICAL_METHOD=2OS_CRITICAL_METHOD=2l

16、實(shí)現(xiàn)實(shí)現(xiàn)OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()時(shí),先在堆棧中保存中斷的開時(shí),先在堆棧中保存中斷的開/ /關(guān)關(guān)狀態(tài),然后再關(guān)中斷;實(shí)現(xiàn)狀態(tài),然后再關(guān)中斷;實(shí)現(xiàn)OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()時(shí),從堆棧時(shí),從堆棧中彈出原來(lái)中斷的開中彈出原來(lái)中斷的開/ /關(guān)狀態(tài);關(guān)狀態(tài);lOS_CRITICAL_METHOD=3OS_CRITICAL_METHOD=3l把當(dāng)前處理器的狀態(tài)字保存在局部變量中(如把當(dāng)前處理器的狀態(tài)字保存在局部變量中(如OS_CPU_SROS_CPU_SR,關(guān),關(guān)中斷時(shí)保存,開中斷時(shí)恢復(fù)。中斷時(shí)保存,開中斷時(shí)恢

17、復(fù)。C/OS-II中采用了3種開關(guān)中斷的方法19任務(wù)task典型的任務(wù)一個(gè)無(wú)限循環(huán)。典型的任務(wù)一個(gè)無(wú)限循環(huán)。void mytask(void void mytask(void * *pdatapdata) ) for (;) for (;) do something; do something; waiting; waiting; do something; do something; l C/OSC/OS II 2.5II 2.5版本支持版本支持6464個(gè)任務(wù),每個(gè)任務(wù)一個(gè)特定的優(yōu)先級(jí)。優(yōu)先級(jí)個(gè)任務(wù),每個(gè)任務(wù)一個(gè)特定的優(yōu)先級(jí)。優(yōu)先級(jí)越高,數(shù)字越小。越高,數(shù)字越小。l系統(tǒng)占用了系統(tǒng)占用了8 8

18、個(gè)任務(wù),保留優(yōu)先級(jí)為個(gè)任務(wù),保留優(yōu)先級(jí)為0 0、1 1、2 2、3 3、OS_LOWEST_PRIO-3OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0OS_LOWEST_PRIO-0。20Task StructureTask Structure void YourTask (void *pdata) (1) for (;) (2) /* 用戶代碼用戶代碼 */ 調(diào)用調(diào)用uC/OS-II的某種系統(tǒng)服務(wù)的某種系統(tǒng)服務(wù): OSMboxPend(

19、); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用戶代碼用戶代碼 */ 21Alternate Structure void YourTask (void *pdata) /* 用戶代碼用戶代碼 */ OSTaskDel(OS_PRIO_SELF); 22任務(wù)狀態(tài)任務(wù)狀態(tài)23任務(wù)控制塊(TCB)l任務(wù)控制塊任務(wù)控制塊 OS_TCBOS_TCB是一個(gè)數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任是一個(gè)數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)

20、參數(shù),包括任務(wù)堆棧指針,狀態(tài),優(yōu)先級(jí),任務(wù)表位置,任務(wù)鏈表指針等。務(wù)堆棧指針,狀態(tài),優(yōu)先級(jí),任務(wù)表位置,任務(wù)鏈表指針等。l所有的任務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。所有的任務(wù)控制塊分為兩條鏈表,空閑鏈表和使用鏈表。24 C/OS-IIC/OS-II任務(wù)控制塊任務(wù)控制塊. .typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OS

21、TCBId;#endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev;#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endif25#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg;#endif INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; INT8U OSTCBX; INT8U OSTCBY; INT

22、8U OSTCBBitX; INT8U OSTCBBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;26任務(wù)控制塊任務(wù)控制塊OS_TCBOS_TCB中幾個(gè)成員的算法中幾個(gè)成員的算法OSTCBY= priority 3;OSTCBBitY= OSMapTblpriority 3;OSTCBX= priority & 0 x07;OSTCBBitX= OSMapTblpriority & 0 x07;27空任務(wù)列表空任務(wù)列表 所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組OSTCBTbl中,

23、系統(tǒng)初始化時(shí),所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向中,系統(tǒng)初始化時(shí),所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表,任務(wù)建立后,空任務(wù)控制塊指針鏈表,任務(wù)建立后,空任務(wù)控制塊指針OSTCBFreeList指向的任務(wù)指向的任務(wù)控制塊就賦給了該任務(wù),然后控制塊就賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向鏈表的值調(diào)整為指向鏈表中的下一個(gè)空任務(wù)控制塊。中的下一個(gè)空任務(wù)控制塊。28任務(wù)控制塊初始化函數(shù)INT8U OS_TCBInit ( INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *p

24、ext, INT16U opt )29任務(wù)級(jí)的任務(wù)調(diào)度-OSSchedl C/OSC/OS是占先式實(shí)時(shí)多任務(wù)內(nèi)核,優(yōu)先級(jí)最高的任務(wù)一旦準(zhǔn)備就緒,則是占先式實(shí)時(shí)多任務(wù)內(nèi)核,優(yōu)先級(jí)最高的任務(wù)一旦準(zhǔn)備就緒,則擁有擁有CPUCPU的所有權(quán)開始投入運(yùn)行。的所有權(quán)開始投入運(yùn)行。l C/OSC/OS中不支持時(shí)間片輪轉(zhuǎn)法,每個(gè)任務(wù)的優(yōu)先級(jí)要求不一樣且是唯一中不支持時(shí)間片輪轉(zhuǎn)法,每個(gè)任務(wù)的優(yōu)先級(jí)要求不一樣且是唯一的,所以任務(wù)調(diào)度的工作就是:查找準(zhǔn)備就緒的最高優(yōu)先級(jí)的任務(wù)并進(jìn)的,所以任務(wù)調(diào)度的工作就是:查找準(zhǔn)備就緒的最高優(yōu)先級(jí)的任務(wù)并進(jìn)行上下文切換。行上下文切換。l C/OSC/OS任務(wù)調(diào)度所花的時(shí)間為常數(shù),與應(yīng)

25、用程序中建立的任務(wù)數(shù)無(wú)關(guān)。任務(wù)調(diào)度所花的時(shí)間為常數(shù),與應(yīng)用程序中建立的任務(wù)數(shù)無(wú)關(guān)。30根據(jù)就緒表確定最高優(yōu)先級(jí)兩個(gè)關(guān)鍵兩個(gè)關(guān)鍵: :l優(yōu)先級(jí)數(shù)分解為高三位和低三位分別確定;優(yōu)先級(jí)數(shù)分解為高三位和低三位分別確定;l高優(yōu)先級(jí)有著小的優(yōu)先級(jí)號(hào)高優(yōu)先級(jí)有著小的優(yōu)先級(jí)號(hào) 。31根據(jù)優(yōu)先級(jí)找到任務(wù)在就緒任務(wù)表中的位置每個(gè)就緒的任務(wù)都放入就緒表(每個(gè)就緒的任務(wù)都放入就緒表(ready listready list)中,就緒表有兩個(gè)變量:)中,就緒表有兩個(gè)變量:OSRdyGrpOSRdyGrp、OSRdyTblOSRdyTblOSRdyGrp1207 6 5 4 300XXXYY Y任務(wù)優(yōu)先級(jí)20176543

26、108915 14 13 1212 1118161723 22 2121 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY優(yōu)先級(jí)最低任務(wù)(空閑任務(wù))優(yōu)先級(jí)最高任務(wù)任務(wù)優(yōu)先級(jí)號(hào)32根據(jù)優(yōu)先級(jí)確定就緒表(1)假設(shè)優(yōu)先級(jí)為假設(shè)優(yōu)先級(jí)為1212的任務(wù)進(jìn)入就緒狀態(tài),的任務(wù)進(jìn)入就緒狀態(tài),12=1100b12=1100b,則,則OSRdyTbl1OSRdyTbl1的第的第4 4位置位置1 1,且,且OSRdyG

27、rpOSRdyGrp的第的第1 1位置位置1 1,相應(yīng)的數(shù)學(xué)表達(dá)式為,相應(yīng)的數(shù)學(xué)表達(dá)式為: : OSRdyGrp OSRdyGrp |=0000 0010=0 x02|=0000 0010=0 x02; OSRdyTbl1 |=0001 0000=0 x10;OSRdyTbl1 |=0001 0000=0 x10;而優(yōu)先級(jí)為而優(yōu)先級(jí)為2121的任務(wù)就緒的任務(wù)就緒21=10 101b21=10 101b,則,則OSRdyTbl2OSRdyTbl2的第的第5 5位置位置1 1,且,且OSRdyGrpOSRdyGrp的第的第2 2位置位置1 1,相應(yīng)的數(shù)學(xué)表達(dá)式為:,相應(yīng)的數(shù)學(xué)表達(dá)式為: OSRdy

28、Grp OSRdyGrp |=0000 0100=0 x04|=0000 0100=0 x04; OSRdyTbl2 |=0010 0000=0 x20;OSRdyTbl2 |=0010 0000=0 x20;33根據(jù)優(yōu)先級(jí)確定就緒表(2)l從上面的計(jì)算我們可以得到從上面的計(jì)算我們可以得到: :若若OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的第的第n n位置位置1 1,則,則應(yīng)該把應(yīng)該把OSRdyGrpOSRdyGrp及及OSRdyBblOSRdyBbl的值與的值與2 2n n 相或。相或。C/OSC/OS中,把中,把2 2n n的的n=0-7n=0-7的的8 8個(gè)值

29、先計(jì)算好存在數(shù)組個(gè)值先計(jì)算好存在數(shù)組OSMapTblOSMapTbl中,也就是:中,也就是: OSMapTbl0 =2OSMapTbl0 =20 0=0 x01=0 x01(0000 00010000 0001) OSMapTbl1 =2OSMapTbl1 =21 1=0 x02=0 x02(0000 00100000 0010) OSMapTbl7 =2 OSMapTbl7 =27 7=0 x80=0 x80(1000 00001000 0000)34使任務(wù)進(jìn)入就緒態(tài)如果如果prio(00yyyxxx)prio(00yyyxxx)是任務(wù)的優(yōu)先級(jí),也是任務(wù)的識(shí)別號(hào),則將任務(wù)是任務(wù)的優(yōu)先級(jí),也是

30、任務(wù)的識(shí)別號(hào),則將任務(wù)放入就緒表,即使任務(wù)進(jìn)入就緒態(tài)的方法是:放入就緒表,即使任務(wù)進(jìn)入就緒態(tài)的方法是:OSRdyGrp |=OSMapTblprioOSRdyGrp |=OSMapTblprio3;3;OSRdyTblprio3 |=OSMapTblprioOSRdyTblprio3 |=OSMapTblprio & 0 x07; & 0 x07;假設(shè)優(yōu)先級(jí)為假設(shè)優(yōu)先級(jí)為12121100b1100bOSRdyGrp OSRdyGrp |=OSMapTbl1(0000 0010)|=OSMapTbl1(0000 0010);OSRdyTbl1 |=OSMapTbl4(0001 0000);OSR

31、dyTbl1 |=OSMapTbl4(0001 0000);35使任務(wù)脫離就緒態(tài) 將任務(wù)就緒表將任務(wù)就緒表OSRdyTblprioOSRdyTblprio33相應(yīng)元素的相應(yīng)位清零,而且相應(yīng)元素的相應(yīng)位清零,而且當(dāng)當(dāng)OSRdyTblprioOSRdyTblprio33中的所有位都為零時(shí),即全組任務(wù)中沒有一個(gè)中的所有位都為零時(shí),即全組任務(wù)中沒有一個(gè)進(jìn)入就緒態(tài)時(shí),進(jìn)入就緒態(tài)時(shí),OSRdyGrpOSRdyGrp的相應(yīng)位才為零。的相應(yīng)位才為零。If(OSRdyTblprioIf(OSRdyTblprio3&= 3&= OSMapTblprioOSMapTblprio & 0 x07)=0); & 0 x

32、07)=0);OSRdyGrpOSRdyGrp&= &= OSMapTblprioOSMapTblprio3;3;36采用查表法確定高優(yōu)先級(jí)任務(wù) 查表法具有確定的時(shí)間,增加了系統(tǒng)的可預(yù)測(cè)性,查表法具有確定的時(shí)間,增加了系統(tǒng)的可預(yù)測(cè)性,C/OSC/OS中中所有的系統(tǒng)調(diào)用時(shí)間都是確定的所有的系統(tǒng)調(diào)用時(shí)間都是確定的High3 =OSUnMapTblOSRdyGrpHigh3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Low3 =OSUnMapTblOSRdyTblHigh3;Prio Prio =(High33)+Low3;=(High33)

33、+Low3;OSRdyGrp1207 6 5 4 300XXXYY Y任務(wù)優(yōu)先級(jí)20176543108915 14 13 12 1118161723 22 21 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY37INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1,

34、 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, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1,

35、 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, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1,

36、 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舉例:舉例: 如如OSRdyGrpOSRdyGrp的值為的值為01101000B01101000B,即,即0X680X68,則查得,則查得OSUnMapTblOSUnMapTblOSRdyGrpOSRdyGrp 的值是的值是3 3,它相應(yīng)于,它相應(yīng)于OSRdyGrpOSRdyGrp中的第中的第3 3位位置置1 1; 如如OSRdyTbl3OSRdyTbl3的值是

37、的值是11100100B11100100B,即,即0XE40XE4,則查,則查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的值是的值是2 2,則進(jìn)入就緒態(tài)的最高任務(wù)優(yōu),則進(jìn)入就緒態(tài)的最高任務(wù)優(yōu)先級(jí)先級(jí)PrioPrio=3=3* *8+2=268+2=26 38Task schedulervoid OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting =0)&(OSIntNesting= 0) y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y

38、3) + OSUnMapTblOSRdyTbly) if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OS_TASK_SW(); OS_EXIT_CRITICAL();39void OSSchedLock (void) if (OSRunning = TRUE) OS_ENTER_CRITICAL(); if(OSLockNesting 0) OSLockNesting-; if (OSLockNesting=0)&(OSIntNesting=0) OS_EXIT_CRI

39、TICAL(); OSSched(); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 41任務(wù)切換l將被掛起的任務(wù)寄存器入棧;將被掛起的任務(wù)寄存器入棧;l將較高優(yōu)先級(jí)任務(wù)的寄存器出棧。將較高優(yōu)先級(jí)任務(wù)的寄存器出棧。42任務(wù)級(jí)的任務(wù)切換OS_TASK_SW()lOS_TASK_SW()OS_TASK_SW()是宏調(diào)用,含有微處理器的軟中斷指令;是宏調(diào)用,含有微處理器的軟中斷指令;lOS_TASK_SW()OS_TASK_SW()將處理器相關(guān)的軟件中斷機(jī)制封裝起來(lái),便于操作將處理器相關(guān)的軟件中斷機(jī)制封裝起來(lái),便于操作系統(tǒng)移植。系統(tǒng)移植。43調(diào)用

40、OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCur(1)存儲(chǔ)器低地址存儲(chǔ)器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSW存儲(chǔ)器低地址存儲(chǔ)器高地址高優(yōu)先級(jí)任務(wù) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R444保存當(dāng)前CPU寄存器的值低優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存儲(chǔ)器低地址存儲(chǔ)器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存儲(chǔ)器低地址存儲(chǔ)器高地址高優(yōu)先級(jí)任務(wù) OS_TCBOSTCBHighRdy(2)CPU(1)(3)45重新裝入要運(yùn)行的任務(wù)低

41、優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存儲(chǔ)器低地址存儲(chǔ)器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存儲(chǔ)器低地址存儲(chǔ)器高地址高優(yōu)先級(jí)任務(wù) OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)46任務(wù)切換OS_TASK_SW()的代碼Void OSCtxSw(voidVoid OSCtxSw(void) ) 將將R1,R2,R3R1,R2,R3及及R4R4推入當(dāng)前堆棧;推入當(dāng)前堆棧; OSTCBCurOSTCBCurOSTCBStkPtrOSTCBStkPtr = SP; = SP

42、; OSTCBCur = OSTCBHighRdy OSTCBCur = OSTCBHighRdy; ; SP = OSTCBHighRdy SP = OSTCBHighRdy OSTCBSTKPtrOSTCBSTKPtr; ; 將將R4,R3,R2R4,R3,R2及及R1R1從新堆棧中彈出;從新堆棧中彈出; 執(zhí)行中斷返回指令;執(zhí)行中斷返回指令; 47C/OS-II中的中斷l(xiāng)中斷:中斷:由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的事件稱為中斷源。事件稱為中斷源。lCPU響應(yīng)中斷的條件:響應(yīng)中斷的條件:至少有一個(gè)中斷源向至少有一個(gè)中斷源

43、向CPU發(fā)出中斷信號(hào);發(fā)出中斷信號(hào);系統(tǒng)允許中斷,且對(duì)此中斷信號(hào)未予屏蔽。系統(tǒng)允許中斷,且對(duì)此中斷信號(hào)未予屏蔽。l中斷類型:中斷類型:硬件中斷;硬件中斷; 外部中斷;外部中斷;陷井中斷;陷井中斷;現(xiàn)場(chǎng)控制量的中斷?,F(xiàn)場(chǎng)控制量的中斷。48 C/OSC/OS-II-II中的中斷服務(wù)子程序中的中斷服務(wù)子程序用戶中斷服務(wù)子程序:用戶中斷服務(wù)子程序: 保存全部保存全部CPUCPU寄存器;寄存器; 調(diào)用調(diào)用OSIntEnterOSIntEnter()()或或OSIntNestingOSIntNesting直接加直接加1 1; if(OSIntNestingif(OSIntNesting=1)=1) OST

44、CBCur-OSTCBStkPtr OSTCBCur-OSTCBStkPtr=SP;=SP; 清中斷源;清中斷源; 重新開中斷;重新開中斷; 執(zhí)行用戶代碼做中斷服務(wù);執(zhí)行用戶代碼做中斷服務(wù); 調(diào)用調(diào)用OSIntExitOSIntExit();(); 恢復(fù)所有恢復(fù)所有CPUCPU寄存器;寄存器; 執(zhí)行中斷返回指令;執(zhí)行中斷返回指令;49中斷服務(wù)中斷服務(wù)5051Search for highest priority similar to schedulerHalf context switch is done by interrupt response i.e. registers saved52

45、中斷與時(shí)鐘節(jié)拍中斷與時(shí)鐘節(jié)拍l時(shí)鐘節(jié)拍(時(shí)鐘滴答)時(shí)鐘節(jié)拍(時(shí)鐘滴答)TickTick,是一種定時(shí)器中斷,可通過(guò)編程方,是一種定時(shí)器中斷,可通過(guò)編程方式實(shí)現(xiàn)。式實(shí)現(xiàn)。l時(shí)鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先時(shí)鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先3232位的整數(shù)位的整數(shù)OSTimeOSTime加加1 1。對(duì)任務(wù)列表進(jìn)行掃描,判斷是否有延時(shí)任務(wù)應(yīng)該處。對(duì)任務(wù)列表進(jìn)行掃描,判斷是否有延時(shí)任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。53時(shí)鐘節(jié)拍中斷服務(wù)子程序時(shí)鐘節(jié)拍中斷服務(wù)子程序Void OSTickISR(void) 保存處理器寄存器的值; 調(diào)用

46、OSIntEnter(),或是將OSIntNesting加1 if(OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; 調(diào)用OSTimeTick(); 清發(fā)出中斷設(shè)備的中斷; 重新允許中斷(可選用) 調(diào)用OSIntExit(); 恢復(fù)處理器寄存器的值; 執(zhí)行中斷返回指令;54void OSTimeTick (void) OS_TCB *ptcb; OSTimeTickHook(); (1) ptcb = OSTCBList; (2) while (ptcb-OSTCBPrio != OS_IDLE_PRIO) (3) OS_ENTER_CRITICAL(); if

47、 (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) if (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) (4) OSRdyGrp |= ptcb-OSTCBBitY; (5) OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL(); (6) OSTime+; (7)時(shí)鐘節(jié)拍函數(shù)時(shí)鐘節(jié)拍函數(shù)OSTimTickOSTimTick()()5

48、5void OSTaskIdle (void *pdata) pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); 空閑任務(wù)空閑任務(wù)OSTaskIdle()56初始化統(tǒng)計(jì)任務(wù)初始化統(tǒng)計(jì)任務(wù)void main (void) OSInit(); /* 初始化初始化C/OS-II(1)*/ /* 安裝安裝C/OS-II的任務(wù)切換向量的任務(wù)切換向量*/ /* 創(chuàng)建用戶起始任務(wù)創(chuàng)建用戶起始任務(wù)(以以TaskStart()作為起始任務(wù)作為起始任務(wù))(2)*/ OSStart(); /* 開始多任務(wù)調(diào)度開始多任

49、務(wù)調(diào)度(3)*/void TaskStart (void *pdata) /* 安裝并啟動(dòng)安裝并啟動(dòng)C/OS-II的時(shí)鐘節(jié)拍的時(shí)鐘節(jié)拍 (4)*/ OSStatInit(); /* 初始化統(tǒng)計(jì)任務(wù)初始化統(tǒng)計(jì)任務(wù)(5)*/ /* 創(chuàng)建用戶應(yīng)用程序任務(wù)創(chuàng)建用戶應(yīng)用程序任務(wù)*/ for (;) /* 這里是這里是TaskStart()的代碼的代碼!*/ 57統(tǒng)計(jì)任務(wù)初始化統(tǒng)計(jì)任務(wù)初始化58 C/OSC/OS-II-II初始化初始化l首先調(diào)用系統(tǒng)初始化函數(shù)首先調(diào)用系統(tǒng)初始化函數(shù)OSIint()。OSIint()初始化初始化C/OS-所有的變量和數(shù)所有的變量和數(shù)據(jù)結(jié)構(gòu)(見據(jù)結(jié)構(gòu)(見OS_CORE.C)。

50、)。lOSInit()建立空閑任務(wù)建立空閑任務(wù)idle task,這個(gè)任務(wù)總是處于就緒態(tài)的??臻e任務(wù),這個(gè)任務(wù)總是處于就緒態(tài)的??臻e任務(wù)OSTaskIdle()的優(yōu)先級(jí)總是設(shè)成最低,即()的優(yōu)先級(jí)總是設(shè)成最低,即OS_LOWEST_PRIO。l如果統(tǒng)計(jì)任務(wù)允許如果統(tǒng)計(jì)任務(wù)允許OS_TASK_STAT_EN和任務(wù)建立擴(kuò)展允許都設(shè)為和任務(wù)建立擴(kuò)展允許都設(shè)為1,則,則OSInit()還得建立統(tǒng)計(jì)任務(wù)還得建立統(tǒng)計(jì)任務(wù)OSTaskStat()并且讓其進(jìn)入就緒態(tài)。并且讓其進(jìn)入就緒態(tài)。OSTaskStat的優(yōu)先級(jí)總是設(shè)為的優(yōu)先級(jí)總是設(shè)為OS_LOWEST_PRIO-1 。l空閑和統(tǒng)計(jì)任務(wù)的任務(wù)控制塊(空閑和

51、統(tǒng)計(jì)任務(wù)的任務(wù)控制塊(OS_TCBs)是用雙向鏈表鏈接在一起的。)是用雙向鏈表鏈接在一起的。OSTCBList指向這個(gè)鏈表的起始處。當(dāng)建立一個(gè)任務(wù)時(shí),這個(gè)任務(wù)總是被放指向這個(gè)鏈表的起始處。當(dāng)建立一個(gè)任務(wù)時(shí),這個(gè)任務(wù)總是被放在這個(gè)鏈表的起始處。在這個(gè)鏈表的起始處。59調(diào)用OSInit()之后的數(shù)據(jù)結(jié)構(gòu) 60空閑緩沖區(qū)空閑緩沖區(qū)61C/OS-C/OS-的啟動(dòng)的啟動(dòng)void main (void) OSInit(); /* 初始化初始化C/OS-II */ . . 通過(guò)調(diào)用通過(guò)調(diào)用OSTaskCreate()或或OSTaskCreateExt()創(chuàng)建至少一個(gè)任創(chuàng)建至少一個(gè)任務(wù)務(wù); . . OSSta

52、rt(); /* 開始多任務(wù)調(diào)度開始多任務(wù)調(diào)度!OSStart()永遠(yuǎn)不永遠(yuǎn)不會(huì)返回會(huì)返回 */62啟動(dòng)多任務(wù)啟動(dòng)多任務(wù)void OSStart (void) INT8U y; INT8U x; if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y OSTCBStkPtr; OSRunning = TRUE; Restore all processor registers from the new tasks stack; Execute a retur

53、n from interrupt nstruction; 64調(diào)用OSStart()之后的數(shù)據(jù)結(jié)構(gòu) 65本節(jié)提要本節(jié)提要 C/OS-簡(jiǎn)介簡(jiǎn)介 C/OS-C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu) C/OS-任務(wù)通信與同步任務(wù)通信與同步 C/OS-任務(wù)管理任務(wù)管理 C/OS-時(shí)間管理時(shí)間管理66建立任務(wù)建立任務(wù)Use one of two serviceslOS TaskCreate()lOSTaskCreateExt ()67建立任務(wù),建立任務(wù),OSTaskCreate()INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos

54、, INT8U prio) void *psp; INT8U err; if (prio OS_LOWEST_PRIO) (1) return (OS_PRIO_INVALID); OS_ENTER_CRITICAL(); if (OSTCBPrioTblprio = (OS_TCB *)0) (2) OSTCBPrioTblprio = (OS_TCB *)1; (3) OS_EXIT_CRITICAL(); (4) psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); err = OSTCBInit(prio, psp, (void *)0,

55、 0, 0, (void *)0, 0); if (err = OS_NO_ERR) OS_ENTER_CRITICAL();68 OSTaskCtr+; OSTaskCreateHook(OSTCBPrioTblprio); OS_EXIT_CRITICAL(); if (OSRunning) OSSched(); else OS_ENTER_CRITICAL(); OSTCBPrioTblprio = (OS_TCB *)0; OS_EXIT_CRITICAL(); return (err); else OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST);

56、 69堆棧檢驗(yàn),堆棧檢驗(yàn),OSTaskStkChkOSTaskStkChk()();刪除任務(wù),刪除任務(wù),OSTaskDelOSTaskDel()();請(qǐng)求刪除任務(wù),請(qǐng)求刪除任務(wù),OSTaskDelReqOSTaskDelReq()();改變?nèi)蝿?wù)的優(yōu)先級(jí),改變?nèi)蝿?wù)的優(yōu)先級(jí),OSTaskChangePrioOSTaskChangePrio()();掛起任務(wù),掛起任務(wù),OSTaskSuspendOSTaskSuspend()();恢復(fù)任務(wù),恢復(fù)任務(wù),OSTaskResumeOSTaskResume()()。 其他相關(guān)函數(shù)其他相關(guān)函數(shù)70本節(jié)提要本節(jié)提要 C/OS-簡(jiǎn)介簡(jiǎn)介 C/OS-C/OS-內(nèi)核結(jié)

57、構(gòu)內(nèi)核結(jié)構(gòu) C/OS-任務(wù)通信與同步任務(wù)通信與同步 C/OS-C/OS-任務(wù)管理任務(wù)管理 C/OS-時(shí)間管理時(shí)間管理71時(shí)間管理Five services:lOSTimeDLY();lOSTimeDLYHMSM();lOSTimeDlyResmue();lOStimeGet();lOSTimeSet()。72OSTimeDly( )void OSTimeDly (INT16U ticks) if (ticks 0) OS_ENTER_CRITICAL(); if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) OSRdyGrp &= O

58、STCBCur-OSTCBBitY; OSTCBCur-OSTCBDly = ticks; OS_EXIT_CRITICAL(); OSSched(); 73OSTimeDlyHMSM( )74本節(jié)提要本節(jié)提要 C/OS-簡(jiǎn)介簡(jiǎn)介 C/OS-C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu) C/OS-任務(wù)通信與同步任務(wù)通信與同步 C/OS-任務(wù)管理任務(wù)管理 C/OS-時(shí)間管理時(shí)間管理 C/OS-移植移植75任務(wù)間通信手段 C/OSC/OS中,采用多種方法保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之中,采用多種方法保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通信。間的通信。提供提供OS_ENTER_CRITICALOS_ENTER_

59、CRITICAL和和OS_EXIT_CRITICALOS_EXIT_CRITICAL來(lái)對(duì)臨界資源進(jìn)來(lái)對(duì)臨界資源進(jìn)行保護(hù)。行保護(hù)。OSSchedLockOSSchedLock( )( )禁止調(diào)度保護(hù)任務(wù)級(jí)的共享資源。禁止調(diào)度保護(hù)任務(wù)級(jí)的共享資源。提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號(hào)量、郵箱、消息提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號(hào)量、郵箱、消息隊(duì)列,事件標(biāo)志。隊(duì)列,事件標(biāo)志。 76事件控制塊ECB 程序程序4.5 ECB的結(jié)構(gòu)如下的結(jié)構(gòu)如下 - typedef struct void *OSEventPtr; /*指向消息或消息隊(duì)列的指針指向消息或消息隊(duì)列的指針*/ INT8U OSEven

60、tTblOS_EVENT_TBL_SIZE; /*等待任務(wù)列表等待任務(wù)列表*/ INT16U OSEventCnt; /*計(jì)數(shù)器(當(dāng)事件是信號(hào)量時(shí))計(jì)數(shù)器(當(dāng)事件是信號(hào)量時(shí))*/ INT8U OSEventType; /*事件類型:信號(hào)量、郵箱等事件類型:信號(hào)量、郵箱等*/ INT8U OSEventGrp; /*等待任務(wù)組等待任務(wù)組*/ OS_EVENT; 與與TCB類似的結(jié)構(gòu),使用兩個(gè)鏈表,空閑鏈表與使用類似的結(jié)構(gòu),使用兩個(gè)鏈表,空閑鏈表與使用鏈表鏈表 所有的通信信號(hào)都被看成是事件所有的通信信號(hào)都被看成是事件(event), (event), 一個(gè)稱為事件控制塊一個(gè)稱為事件控制塊(ECB,

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論