嵌入式系統(tǒng)課件第八章_第1頁
嵌入式系統(tǒng)課件第八章_第2頁
嵌入式系統(tǒng)課件第八章_第3頁
嵌入式系統(tǒng)課件第八章_第4頁
嵌入式系統(tǒng)課件第八章_第5頁
已閱讀5頁,還剩102頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1嵌入式系統(tǒng)嵌入式系統(tǒng)嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)C/OS-C/OS-分析分析2012年10月2主要內(nèi)容n嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)n C/OS-簡介簡介n C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)n C/OS-任務(wù)管理任務(wù)管理n C/OS-時間管理時間管理n C/OS-任務(wù)通信與同步任務(wù)通信與同步3為什么需要操作系統(tǒng)嵌入式嵌入式微處理器微處理器SDRAMSDRAMROMROMI/OI/OA/DA/DD/AD/A人機交互接口人機交互接口通用接口通用接口實時操作系統(tǒng)(實時操作系統(tǒng)(RTOS)RTOS)圖形用戶圖形用戶接口接口BSP/HAL 硬件抽象層/板極支持包BSP/HAL 硬件抽象層/板極支持包

2、任務(wù)管理任務(wù)管理文件系統(tǒng)文件系統(tǒng)應(yīng)用程序應(yīng)用程序嵌入式計算機系統(tǒng)嵌入式計算機系統(tǒng)硬件層硬件層軟件層軟件層中間層中間層功能層功能層4硬件抽象層的引入硬件抽象層的引入 n嵌入式實時系統(tǒng)自底向上包含三個部分 n硬件環(huán)境n嵌入式實時操作系統(tǒng)RTOSn嵌入式實時應(yīng)用程序n由于嵌入式系統(tǒng)應(yīng)用的硬件環(huán)境差異較大 n新增加的中間層位于操作系統(tǒng)和硬件之間,包含了系統(tǒng)中與硬件相關(guān)的大部分功能 ,隱蔽了底層硬件的多樣性 5 嵌入式系統(tǒng)的體系結(jié)構(gòu)嵌入式嵌入式微處理器微處理器SDRAMSDRAMROMROMI/OI/OA/DA/DD/AD/A人機交互接口人機交互接口通用接口通用接口實時操作系統(tǒng)(實時操作系統(tǒng)(RTOS)

3、RTOS)圖形用戶圖形用戶接口接口BSP/HAL 硬件抽象層/板極支持包BSP/HAL 硬件抽象層/板極支持包任務(wù)管理任務(wù)管理文件系統(tǒng)文件系統(tǒng)應(yīng)用程序應(yīng)用程序嵌入式計算機系統(tǒng)嵌入式計算機系統(tǒng)硬件層硬件層軟件層軟件層中間層中間層功能層功能層6HAL簡介n硬件抽象層(硬件抽象層(HALHAL)是體系結(jié)構(gòu)相關(guān)的底層程序)是體系結(jié)構(gòu)相關(guān)的底層程序n處理系統(tǒng)啟動、硬件初始化以及中斷與異常處理系統(tǒng)啟動、硬件初始化以及中斷與異常n硬件抽象層對內(nèi)核其它部分提供統(tǒng)一的調(diào)用接口硬件抽象層對內(nèi)核其它部分提供統(tǒng)一的調(diào)用接口 nHALHAL可以提供可以提供BSPBSP規(guī)范,提供跨平臺可移植性規(guī)范,提供跨平臺可移植性 7

4、硬件抽象層接口定義和代碼設(shè)計特點硬件抽象層接口定義和代碼設(shè)計特點 n硬件抽象層具有與硬件密切相關(guān)性硬件抽象層具有與硬件密切相關(guān)性n硬件抽象層具有與操作系統(tǒng)無關(guān)性硬件抽象層具有與操作系統(tǒng)無關(guān)性n接口定義的功能應(yīng)包含硬件或系統(tǒng)所需硬件支接口定義的功能應(yīng)包含硬件或系統(tǒng)所需硬件支持的所有功能持的所有功能n接口定義簡單明了,太多接口函數(shù)會增加軟件接口定義簡單明了,太多接口函數(shù)會增加軟件模擬的復(fù)雜性模擬的復(fù)雜性n具有可測性的接口設(shè)計有利于系統(tǒng)的軟硬件測具有可測性的接口設(shè)計有利于系統(tǒng)的軟硬件測試和集成試和集成 8HAL設(shè)計目標(biāo)n支持多種的國際主流嵌入式芯片支持多種的國際主流嵌入式芯片n支持?jǐn)?shù)字電視機頂盒、智

5、能手機、數(shù)字化音視頻、數(shù)字儀表等數(shù)字化產(chǎn)支持?jǐn)?shù)字電視機頂盒、智能手機、數(shù)字化音視頻、數(shù)字儀表等數(shù)字化產(chǎn)品中常見外設(shè)的驅(qū)動品中常見外設(shè)的驅(qū)動 n基于甚高端通訊設(shè)備的硬件抽象層,能夠支持多基于甚高端通訊設(shè)備的硬件抽象層,能夠支持多CPUCPU體系結(jié)構(gòu)(體系結(jié)構(gòu)(SMPSMP),),以及基于網(wǎng)絡(luò)元素以及基于網(wǎng)絡(luò)元素NENE的甚高端通訊設(shè)備的甚高端通訊設(shè)備n基于智能手機的硬件抽象層,能夠支持以基于智能手機的硬件抽象層,能夠支持以Intel PCAIntel PCA體系結(jié)構(gòu)為內(nèi)核的體系結(jié)構(gòu)為內(nèi)核的智能手機、以智能手機、以Intel EIAIntel EIA體系結(jié)構(gòu)為內(nèi)核的智能手機,以及以體系結(jié)構(gòu)為內(nèi)核的

6、智能手機,以及以MotorolaMotorola的的8800088000系列為內(nèi)核的系列為內(nèi)核的PDAPDAn基于基于ICIC卡的匯編級硬件抽象層,能夠支持?jǐn)?shù)字電視條件接收卡的匯編級硬件抽象層,能夠支持?jǐn)?shù)字電視條件接收CACA的的8/16/328/16/32位位CPU ICCPU IC設(shè)計和機器碼級匯編抽象層設(shè)計和機器碼級匯編抽象層 9通用操作系統(tǒng)和嵌入式(實時)操作系統(tǒng)通用操作系統(tǒng)和嵌入式(實時)操作系統(tǒng)n通用操作系統(tǒng):Windows/NT/XP、Linux、UNIX等,用于PC機、服務(wù)器,n嵌入式(實時)操作系統(tǒng):用于嵌入式設(shè)備的操作系統(tǒng),具有通用操作系統(tǒng)的基本特點,又具有系統(tǒng)實時性、硬件

7、的相關(guān)依賴性、軟件固態(tài)化以及應(yīng)用的專用性等特點;n嵌入式(實時)操作系統(tǒng)通常包括與硬件相關(guān)的底層驅(qū)動軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動接口、通信協(xié)議、圖形界面、標(biāo)準(zhǔn)化瀏覽器Browser等;n嵌入式(實時)操作系統(tǒng)的重要指標(biāo):實時性(中斷響應(yīng)時間、任務(wù)切換時間等)、尺寸(可裁剪性 )、可擴展性(內(nèi)核、中間件)10嵌入式操作系統(tǒng)的發(fā)展操作系統(tǒng)內(nèi)核操作系統(tǒng)內(nèi)核應(yīng)用程序應(yīng)用程序驅(qū)動程序和固件驅(qū)動程序和固件操作系統(tǒng)內(nèi)核操作系統(tǒng)內(nèi)核文件系統(tǒng)文件系統(tǒng)驅(qū)動程序和固件驅(qū)動程序和固件API GUI應(yīng)用程序應(yīng)用程序操作系統(tǒng)內(nèi)核操作系統(tǒng)內(nèi)核文件系統(tǒng)文件系統(tǒng)驅(qū)動程序和固件驅(qū)動程序和固件API GUI應(yīng)用程序應(yīng)用程序通信協(xié)議通信

8、協(xié)議庫函數(shù)庫函數(shù)80年代初期年代初期80年代中期年代中期-90年代中年代中期期90年代末期年代末期-21世紀(jì)世紀(jì)11常見的嵌入式操作系統(tǒng) 實時嵌入式操作系統(tǒng)的種類繁多,大體上可分為兩種,商用型和免費型。商用型的實操作系統(tǒng)功能穩(wěn)定、可靠,有完善的技術(shù)支持和售后服務(wù),但往往價格昂貴,如Vxworks、QNX、WinCE、Palm OS等。免費型的實時操作系統(tǒng)在價格方面具有優(yōu)勢,目前主要有Linux,C/OS是一種源碼開放的商業(yè)RTOS12學(xué)習(xí)嵌入式操作系統(tǒng) 學(xué)習(xí)一種實時操作系統(tǒng)RTOS,如C/OS-,掌握實時系統(tǒng)的概念和設(shè)計方法嵌入式系統(tǒng)以應(yīng)用為中心,要選擇“適用”的操作系統(tǒng)嵌入式Linux自己嘗

9、試“寫”RTOS13RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺BSPKERNELFSTCP/IP設(shè)備驅(qū)動設(shè)備驅(qū)動設(shè)備設(shè)備I/O調(diào)試工具調(diào)試工具其它組件其它組件應(yīng)用RTOSC/C+14主要內(nèi)容n嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)n C/OS-簡介簡介n C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)n C/OS-任務(wù)管理任務(wù)管理n C/OS-時間管理時間管理n C/OS-任務(wù)通信與同步任務(wù)通信與同步15 C/OSC/OS簡介簡介1 1、 C/OSMicro Controller O SC/OSMicro Controller O S,微控制器操作系統(tǒng)微控制器操作系統(tǒng)2 2、 C/OSC/OS簡介簡介美國人美國人Jean

10、Labrosse 1992Jean Labrosse 1992年完成年完成應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機、醫(yī)應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機、醫(yī)療器械、音響設(shè)備、發(fā)動機控制、高療器械、音響設(shè)備、發(fā)動機控制、高速公路電話系統(tǒng)、自動提款機等速公路電話系統(tǒng)、自動提款機等 19981998年年 C/OS-IIC/OS-II,目前的版本,目前的版本 C/OS -C/OS -II V2.61II V2.61,2.722.7220002000年,得到美國航空管理局(年,得到美國航空管理局(FAAFAA)的認(rèn)證,可以用于飛行器中的認(rèn)證,可以用于飛行器中網(wǎng)站網(wǎng)站 ( ) )16u公開源代碼u可移植性(Portab

11、le)u 絕大部分 C/OS-II的源碼是用移植性很強的ANSI C寫的。和微處理器硬件相關(guān)的那部分是用匯編語言寫的。匯編語言寫的部分已經(jīng)壓到最低限度,使得 C/OS-II便于移植到其他微處理器上。 C/OS-II可以在絕大多數(shù)8位、16位、32位以至64位微處理器、微控制器 、數(shù)字信號處理器(DSP)上運行。u可固化(ROMable)u C/OS-II是為嵌入式應(yīng)用而設(shè)計的,這就意味著,只要用戶有固化手段(C編譯、連接、下載和固化), C/OS-II可以嵌入到用戶的產(chǎn)品中成為產(chǎn)品的一部分。u可裁剪(Scalable)u 可以只使用 C/OS-II中應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說某產(chǎn)品可

12、以只使用很少幾個 C/OS-II調(diào)用,而另一個產(chǎn)品則使用了幾乎所有 C/OS-II的功能,這樣可以減少產(chǎn)品中的 C/OS-II所需的存儲器空間(RAM和ROM)。這種可剪裁性是靠條件編譯實現(xiàn)的。 C/OSC/OS的性能特點(一)的性能特點(一)17u占先式(Preemptive)u多任務(wù)u C/OS-II可以管理64個任務(wù),然而,目前這一版本保留8個給系統(tǒng)。應(yīng)用程序最多可以有56個任務(wù)u可確定性 u 全部 C/OS-II的函數(shù)調(diào)用與服務(wù)的執(zhí)行時間具有可確定性。u任務(wù)棧u 每個任務(wù)有自己單獨的棧, C/OS-II允許每個任務(wù)有不同的??臻g,以便壓低應(yīng)用程序?qū)AM的需求。u系統(tǒng)服務(wù)u C/OS-

13、II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊列、信號量、塊大小固定的內(nèi)存的申請與釋放、時間相關(guān)函數(shù)等。u中斷管理u 中斷可以使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被該中斷喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)255層。u穩(wěn)定性與可靠性 C/OSC/OS的性能特點(二)的性能特點(二)18C/OS-II圖籍n描述了C/OS-II內(nèi)部的工作原理n隨書的CD中包含了源代碼n工業(yè)界最清晰的源代碼n除英文版外,有中文和韓文版ChineseKoreanEnglishISBN 1-57820-103-9美國CMP BOOK ISBN 7-81077-290-2北京航空航天大學(xué)

14、出版社ISBN 89-951540-5-519C/OS-IIC/OS-II的各種商業(yè)應(yīng)用的各種商業(yè)應(yīng)用n全世界有數(shù)百種產(chǎn)品在應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用: :nAvionicsAvionics(航空電子設(shè)備)(航空電子設(shè)備)nMedicalMedicalnCell phonesCell phonesnRouters and switchesRouters and switchesnHigh-end audio equipmentHigh-end audio equipmentnWashing machines and Washing machines and dryersdryersnUPS

15、(Uninterruptible Power UPS (Uninterruptible Power Supplies)Supplies)nIndustrial controllersIndustrial controllersnGPS Navigation SystemsGPS Navigation SystemsnMicrowave RadiosMicrowave RadiosnInstrumentationInstrumentationnPoint-of-sale terminalsPoint-of-sale terminalsn更多更多20C/OS-IIC/OS-II提供的系統(tǒng)服務(wù)提供的

16、系統(tǒng)服務(wù)n信號量n帶互斥機制的信號量n減少優(yōu)先級倒置的問題n事件標(biāo)志n消息信箱n消息隊列n內(nèi)存管理n時鐘管理n任務(wù)管理21C/GUI and C/FSnC/GUIC/GUIn嵌入式的用戶界面嵌入式的用戶界面n用用ANSI CANSI C書寫書寫n支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits CPUn彩色,灰度等級或黑白顯示彩色,灰度等級或黑白顯示n代碼尺寸小代碼尺寸小nC/FSC/FSn嵌入式的文件系統(tǒng)嵌入式的文件系統(tǒng)n用用ANSI CANSI C書寫書寫n支持任何支持任何8, 16, 32-bits CPU8, 16, 32-bits CPUn支持支持SM

17、C, MMC, SD, CF, IDE, Flash, RAMSMC, MMC, SD, CF, IDE, Flash, RAM其他其他介質(zhì)介質(zhì)22主要內(nèi)容n嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)n C/OS-簡介簡介n C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)n C/OS-任務(wù)管理任務(wù)管理n C/OS-時間管理時間管理n C/OS-任務(wù)通信與同步任務(wù)通信與同步23 C/OS-IIC/OS-II的文件結(jié)構(gòu)的文件結(jié)構(gòu)24n內(nèi)核結(jié)構(gòu)n任務(wù)管理n時間管理n任務(wù)之間通信與同步nC/OS的移植 C/OS-IIC/OS-II分析分析25n當(dāng)處理臨界段代碼時,須關(guān)中斷,處理完畢后,再開中斷當(dāng)處理臨界段代碼時,須關(guān)中斷,處理完畢后,

18、再開中斷n關(guān)中斷時間是實時內(nèi)核最重要的指標(biāo)之一。它影響用戶系關(guān)中斷時間是實時內(nèi)核最重要的指標(biāo)之一。它影響用戶系統(tǒng)對實時事件的相應(yīng)特性。統(tǒng)對實時事件的相應(yīng)特性。n在實際應(yīng)用中,關(guān)中斷的時間很大程度上取決于微處理器在實際應(yīng)用中,關(guān)中斷的時間很大程度上取決于微處理器的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量n微處理器通常具有關(guān)中斷微處理器通常具有關(guān)中斷/ /開中斷操作。開中斷操作。C C編譯器須具有某編譯器須具有某種機制,能夠在種機制,能夠在c c中直接實現(xiàn)關(guān)中斷中直接實現(xiàn)關(guān)中斷/ /開中斷操作開中斷操作nC C源代碼中插入?yún)R編語言的語句,易實現(xiàn)關(guān)中斷源代碼中插入?yún)R編語言的語句,易實現(xiàn)

19、關(guān)中斷/ /開中斷操開中斷操作作n關(guān)中斷關(guān)中斷/ /開中斷操作作為語言的擴展部分,直接從開中斷操作作為語言的擴展部分,直接從C C語言中語言中可以可以n 關(guān)中斷關(guān)中斷/ /開中斷開中斷 C/OS-IIC/OS-II開關(guān)中斷的方法開關(guān)中斷的方法26 C/OS-IIC/OS-II開關(guān)中斷的方法(續(xù)開關(guān)中斷的方法(續(xù)1 1)nC/OS-IIC/OS-II定義了兩個宏調(diào)用來開關(guān)中斷定義了兩個宏調(diào)用來開關(guān)中斷: :nOS_ENTER_CRITICAL( ) OS_ENTER_CRITICAL( ) (禁止中斷的宏(禁止中斷的宏) ) nOS_EXIT_CRITICAL( ) (OS_EXIT_CRITI

20、CAL( ) (啟用中斷的宏)啟用中斷的宏)n通常成對出現(xiàn)通常成對出現(xiàn)n上述宏定義取決于使用的微處理器。在文件上述宏定義取決于使用的微處理器。在文件OS_CPU.HOS_CPU.H有相應(yīng)的宏定義有相應(yīng)的宏定義n在在C/OS-IIC/OS-II中,每種微處理器都有自己的中,每種微處理器都有自己的OS_CPU.HOS_CPU.H文件文件27 C/OS-IIC/OS-II開關(guān)中斷的方法(續(xù)開關(guān)中斷的方法(續(xù)2 2)28 C/OS-IIC/OS-II開關(guān)中斷的方法(續(xù)開關(guān)中斷的方法(續(xù)3 3)29nOS_CRITICAL_METHOD=1OS_CRITICAL_METHOD=1n用最簡單的方式來實現(xiàn)用

21、最簡單的方式來實現(xiàn)2 2個宏調(diào)用個宏調(diào)用n用處理器指令關(guān)中斷,完成用處理器指令關(guān)中斷,完成OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()n用開中斷指令完成用開中斷指令完成OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()n問題:問題:n如果調(diào)用如果調(diào)用C/OS-IIC/OS-II功能函數(shù)時,中斷是關(guān)掉的,則從功能函數(shù)時,中斷是關(guān)掉的,則從C/OS-IIC/OS-II函數(shù)返回函數(shù)返回時,中斷就打開了時,中斷就打開了n若調(diào)用若調(diào)用C/OS-IIC/OS-II功能函數(shù)之前已將中斷關(guān)掉,那么用戶往往希望從功能函數(shù)之前已將中斷關(guān)掉,那么用戶往往希望從C

22、/OS-IIC/OS-II函數(shù)返回時,中斷仍然是關(guān)著的。這時,這種方法就不妥當(dāng)。函數(shù)返回時,中斷仍然是關(guān)著的。這時,這種方法就不妥當(dāng)。n對特定的處理器,這種辦法是唯一的選擇對特定的處理器,這種辦法是唯一的選擇 C/OS-IIC/OS-II中采用了中采用了3 3種開關(guān)中斷的方法種開關(guān)中斷的方法30 C/OS-IIC/OS-II中采用了中采用了3 3種開關(guān)中斷的方法(續(xù)種開關(guān)中斷的方法(續(xù)1 1)nOS_CRITICAL_METHOD=2OS_CRITICAL_METHOD=2n在堆棧中保存中斷的開在堆棧中保存中斷的開/ /關(guān)狀態(tài),然后再關(guān)中斷關(guān)狀態(tài),然后再關(guān)中斷n實現(xiàn)實現(xiàn)OS_ENTER_CRI

23、TICAL()OS_ENTER_CRITICAL()時,先在堆棧中保存中斷的時,先在堆棧中保存中斷的開開/ /關(guān)狀態(tài),然后再關(guān)中斷關(guān)狀態(tài),然后再關(guān)中斷n實現(xiàn)實現(xiàn)OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()時,從堆棧中彈出原來中斷時,從堆棧中彈出原來中斷的開的開/ /關(guān)狀態(tài)關(guān)狀態(tài)n利用這種機制,不論用戶在調(diào)用利用這種機制,不論用戶在調(diào)用C/OS-IIC/OS-II功能函數(shù)之功能函數(shù)之前中斷是開或關(guān),函數(shù)的進(jìn)入和返回狀態(tài)都得到了保前中斷是開或關(guān),函數(shù)的進(jìn)入和返回狀態(tài)都得到了保護。即:調(diào)用前中斷的開護。即:調(diào)用前中斷的開/ /關(guān)狀態(tài),在調(diào)用之后保持不關(guān)狀態(tài),在調(diào)用之后保持

24、不變變31 C/OS-IIC/OS-II中采用了中采用了3 3種開關(guān)中斷的方法(續(xù)種開關(guān)中斷的方法(續(xù)2 2)nOS_CRITICAL_METHOD=3OS_CRITICAL_METHOD=3n把當(dāng)前處理器的狀態(tài)字(把當(dāng)前處理器的狀態(tài)字(PSWPSW)保存在)保存在C C函數(shù)的函數(shù)的局部變量中(如局部變量中(如OS_CPU_SROS_CPU_SR)n關(guān)中斷時保存,開中斷時恢復(fù)關(guān)中斷時保存,開中斷時恢復(fù)32 C/OS-IIC/OS-II中采用了中采用了3 3種開關(guān)中斷的方法(續(xù)種開關(guān)中斷的方法(續(xù)3 3)Void Some_ uCOS_II_Service(arguments) OS_CPU_S

25、R cpu_sr; cpu_sr=get_processor_psw(); disable_interrupts(); /*臨界段代碼*/ set_processor_psw(cpu_sr); 33任務(wù)(任務(wù)(tasktask) 典型的任務(wù):一個無限循環(huán)void mytask(void *pdata) for (;) do something; waiting; do something; 34Task Structure void YourTask (void *pdata) (1) for (;) (2) /* 用戶代碼 */ 調(diào)用uC/OS-II的某種系統(tǒng)服務(wù): OSMboxPend()

26、; OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用戶代碼 */ 35任務(wù)完成后的自我刪除任務(wù)完成后的自我刪除n當(dāng)任務(wù)完成后,任務(wù)可以自我刪除當(dāng)任務(wù)完成后,任務(wù)可以自我刪除n任務(wù)代碼并非真的刪除了,系統(tǒng)只是簡單地不再理會任務(wù)代碼并非真的刪除了,系統(tǒng)只是簡單地不再理會這個任務(wù)這個任務(wù)n這個任務(wù)的代碼也不會再運行了,即使任務(wù)調(diào)用了這個任務(wù)的代碼也不會再運行了,即使任務(wù)調(diào)用了OSTaskDelOSTaskDel(),這個任務(wù)也

27、絕不會返回(),這個任務(wù)也絕不會返回 void YourTask (void *pdata) /* 用戶代碼 */ OSTaskDel(OS_PRIO_SELF); 36 C/OS IIC/OS II中的任務(wù)中的任務(wù)n C/OS II 2.5C/OS II 2.5版本支持版本支持6464個任務(wù),每個任務(wù)一個特定的優(yōu)先級。個任務(wù),每個任務(wù)一個特定的優(yōu)先級。數(shù)字越小,優(yōu)先級越高數(shù)字越小,優(yōu)先級越高n系統(tǒng)總是運行進(jìn)入就緒態(tài)優(yōu)先級最高的任務(wù)系統(tǒng)總是運行進(jìn)入就緒態(tài)優(yōu)先級最高的任務(wù)n任務(wù)優(yōu)先級號就是任務(wù)編號(任務(wù)優(yōu)先級號就是任務(wù)編號(IDID). .優(yōu)先級號也被一些內(nèi)核功能優(yōu)先級號也被一些內(nèi)核功能函數(shù)調(diào)用

28、。如函數(shù)調(diào)用。如OsTaskChangePrio( )OsTaskChangePrio( )及及OsTaskDel( ).OsTaskDel( ).n系 統(tǒng) 占 用 了系 統(tǒng) 占 用 了 8 8 個 任 務(wù) , 保 留 優(yōu) 先 級 為個 任 務(wù) , 保 留 優(yōu) 先 級 為 0 0 、 1 1 、 2 2 、 3 3 、OS_LOWEST_PRIO-3OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2 OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1 OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0OS_LOWEST_PRIO-0n即:建

29、議不使用上述最高即:建議不使用上述最高4 4個和最低個和最低4 4個優(yōu)先級,用戶任務(wù)仍可達(dá)個優(yōu)先級,用戶任務(wù)仍可達(dá)5656個個37任務(wù)狀態(tài)任務(wù)狀態(tài)n在任一給定的時刻,任務(wù)的狀態(tài)一定是在任一給定的時刻,任務(wù)的狀態(tài)一定是以下五種狀態(tài)之一:以下五種狀態(tài)之一:n睡眠態(tài)(睡眠態(tài)(task dormanttask dormant)n就緒態(tài)(就緒態(tài)(task readytask ready)n運行態(tài)(運行態(tài)(task runningtask running)n等待狀態(tài)(等待狀態(tài)(task waitingtask waiting)n中斷服務(wù)態(tài)(中斷服務(wù)態(tài)(ISR running)ISR running)38睡

30、眠態(tài)(睡眠態(tài)(task dormanttask dormant)n指任務(wù)駐留在程序空間(指任務(wù)駐留在程序空間(ROMROM或或RAMRAM),還沒有),還沒有交給系統(tǒng)來管理的狀態(tài)交給系統(tǒng)來管理的狀態(tài)n任務(wù)交給系統(tǒng)通過調(diào)用以下函數(shù)之一來實現(xiàn):任務(wù)交給系統(tǒng)通過調(diào)用以下函數(shù)之一來實現(xiàn): nOSTaskCreateOSTaskCreate()()nOSTaskCreateExtOSTaskCreateExt()()n告知系統(tǒng):告知系統(tǒng):n任務(wù)的起始地址任務(wù)的起始地址n任務(wù)建立時,用戶給任務(wù)賦予的優(yōu)先級任務(wù)建立時,用戶給任務(wù)賦予的優(yōu)先級n任務(wù)要使用的??臻g大小等任務(wù)要使用的棧空間大小等39就緒態(tài)(就緒態(tài)

31、(task readytask ready)n任務(wù)一旦創(chuàng)建就進(jìn)入就緒態(tài),準(zhǔn)備運行任務(wù)一旦創(chuàng)建就進(jìn)入就緒態(tài),準(zhǔn)備運行n任務(wù)的創(chuàng)建可以是在多任務(wù)開始之前,也可以任務(wù)的創(chuàng)建可以是在多任務(wù)開始之前,也可以動態(tài)地由一個運行著的任務(wù)創(chuàng)建動態(tài)地由一個運行著的任務(wù)創(chuàng)建n若剛創(chuàng)建任務(wù)的優(yōu)先級高于創(chuàng)建它的任務(wù)的優(yōu)若剛創(chuàng)建任務(wù)的優(yōu)先級高于創(chuàng)建它的任務(wù)的優(yōu)先級,它將立即獲得先級,它將立即獲得cpucpu的使用權(quán)的使用權(quán)n任務(wù)可通過任務(wù)可通過OSTaskDelOSTaskDel()返回睡眠態(tài);或調(diào)()返回睡眠態(tài);或調(diào)用該函數(shù)讓另一個任務(wù)進(jìn)入睡眠態(tài)用該函數(shù)讓另一個任務(wù)進(jìn)入睡眠態(tài)40運行態(tài)(運行態(tài)(task running

32、task running)n就緒的任務(wù)只有當(dāng)所有優(yōu)先級高于它的任務(wù)都轉(zhuǎn)為等就緒的任務(wù)只有當(dāng)所有優(yōu)先級高于它的任務(wù)都轉(zhuǎn)為等待狀態(tài),或被刪除后,才能進(jìn)入運行態(tài)待狀態(tài),或被刪除后,才能進(jìn)入運行態(tài)n任何時刻只有一個任務(wù)處于運行態(tài)任何時刻只有一個任務(wù)處于運行態(tài)n調(diào)用調(diào)用OSStartOSStart()可以啟動多任務(wù)。該函數(shù)只能在啟動()可以啟動多任務(wù)。該函數(shù)只能在啟動時調(diào)用一次時調(diào)用一次nOSStartOSStart()運行用戶初始化代碼中已經(jīng)建立的、進(jìn)入()運行用戶初始化代碼中已經(jīng)建立的、進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)就緒態(tài)的優(yōu)先級最高的任務(wù)41等待狀態(tài)(等待狀態(tài)(task waitingtask wa

33、iting)n正在運行的任務(wù)可以通過下面的調(diào)用進(jìn)入等待狀態(tài)。延遲時間到,正在運行的任務(wù)可以通過下面的調(diào)用進(jìn)入等待狀態(tài)。延遲時間到,立即強制執(zhí)行任務(wù)切換,讓下一個優(yōu)先級最高、并進(jìn)入就緒態(tài)的任立即強制執(zhí)行任務(wù)切換,讓下一個優(yōu)先級最高、并進(jìn)入就緒態(tài)的任務(wù)執(zhí)行。務(wù)執(zhí)行。nOSTimeDlyOSTimeDly()()nOSTimeDlyHMSMOSTimeDlyHMSM()()n等待時間過去后,系統(tǒng)服務(wù)(內(nèi)部)函數(shù)等待時間過去后,系統(tǒng)服務(wù)(內(nèi)部)函數(shù)OSTimeTickOSTimeTick()使延遲了()使延遲了的任務(wù)進(jìn)入就緒態(tài)的任務(wù)進(jìn)入就緒態(tài)n用戶無需在應(yīng)用程序代碼中調(diào)用這個函數(shù)用戶無需在應(yīng)用程序代碼

34、中調(diào)用這個函數(shù)42等待狀態(tài)(續(xù))等待狀態(tài)(續(xù))n正在運行的任務(wù)可能需要通過調(diào)用函數(shù)等待某正在運行的任務(wù)可能需要通過調(diào)用函數(shù)等待某一事件發(fā)生。如果該事件并未發(fā)生,任務(wù)就進(jìn)一事件發(fā)生。如果該事件并未發(fā)生,任務(wù)就進(jìn)入等待狀態(tài)入等待狀態(tài)nOSFlagPendOSFlagPend();();OSMutexPendOSMutexPend()()nOSSemPendOSSemPend();();OSMboxPendOSMboxPend()()n當(dāng)事件發(fā)生或等待超時,被掛起的任務(wù)就進(jìn)入當(dāng)事件發(fā)生或等待超時,被掛起的任務(wù)就進(jìn)入就緒態(tài)就緒態(tài)43中斷服務(wù)態(tài)(中斷服務(wù)態(tài)(ISR running)ISR running

35、)n正在執(zhí)行的任務(wù)是可以被中斷的,除非該正在執(zhí)行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)閉,或系統(tǒng)將中斷關(guān)閉。被任務(wù)將中斷關(guān)閉,或系統(tǒng)將中斷關(guān)閉。被中斷的任務(wù)便進(jìn)入了中斷服務(wù)態(tài)中斷的任務(wù)便進(jìn)入了中斷服務(wù)態(tài)n響應(yīng)中斷后,正在運行的任務(wù)被掛起,中響應(yīng)中斷后,正在運行的任務(wù)被掛起,中斷服務(wù)子程序控制了斷服務(wù)子程序控制了CPUCPU的使用權(quán)的使用權(quán)44中斷服務(wù)態(tài)(中斷服務(wù)態(tài)(ISR running)ISR running)n中斷服務(wù)子程序可能會報告一個或多個事件的發(fā)生,中斷服務(wù)子程序可能會報告一個或多個事件的發(fā)生,而使一個或多個任務(wù)進(jìn)入就緒態(tài)而使一個或多個任務(wù)進(jìn)入就緒態(tài)n上述情況下,從中斷服務(wù)子程序返

36、回之前,上述情況下,從中斷服務(wù)子程序返回之前,C/OS C/OS II II 要判定:要判定:n被中斷的任務(wù)是否還是就緒態(tài)任務(wù)中優(yōu)先級最高的被中斷的任務(wù)是否還是就緒態(tài)任務(wù)中優(yōu)先級最高的n如果中斷服務(wù)子程序使另一個優(yōu)先級更高的任務(wù)進(jìn)如果中斷服務(wù)子程序使另一個優(yōu)先級更高的任務(wù)進(jìn)入了就緒態(tài),則新進(jìn)入就緒態(tài)的這個優(yōu)先級更高的入了就緒態(tài),則新進(jìn)入就緒態(tài)的這個優(yōu)先級更高的任務(wù)將得以運行;否則,原來被中斷了的任務(wù)將繼任務(wù)將得以運行;否則,原來被中斷了的任務(wù)將繼續(xù)運行。續(xù)運行。45任務(wù)狀態(tài)任務(wù)狀態(tài)n當(dāng)所有的任務(wù)都在等待時間發(fā)生或等待延遲時間結(jié)束時,C/OS II 執(zhí)行被稱為空閑任務(wù)(Idle Task)的內(nèi)部

37、函數(shù),即:OSTaskIdle()46任務(wù)狀態(tài)任務(wù)的任務(wù)的CPU使用權(quán)使用權(quán)被剝奪被剝奪中斷中斷恢復(fù)恢復(fù)任務(wù)任務(wù)47任務(wù)控制塊(任務(wù)控制塊(TCBTCB)n任務(wù)控制塊任務(wù)控制塊 OS_TCB OS_TCB是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針、狀態(tài)、優(yōu)先級、任務(wù)表位置、參數(shù),包括任務(wù)堆棧指針、狀態(tài)、優(yōu)先級、任務(wù)表位置、任務(wù)鏈表指針等任務(wù)鏈表指針等n所有的任務(wù)控制塊分為兩條鏈表:所有的任務(wù)控制塊分為兩條鏈表:n空閑鏈表空閑鏈表n使用鏈表使用鏈表n當(dāng)任務(wù)的當(dāng)任務(wù)的CPUCPU使用權(quán)被剝奪時,系統(tǒng)用它來保存該任務(wù)的使用權(quán)被剝奪時,系統(tǒng)用它來保存該任務(wù)的

38、狀態(tài)狀態(tài)n全部駐留在全部駐留在RAMRAM中中48 C/OS-II任務(wù)控制塊.typedef struct os_tcb OS_STK *OSTCBStkPtr(當(dāng)前任務(wù)堆棧棧頂指針);#if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; (指向用戶定義的任務(wù)控制塊擴展) OS_STK *OSTCBStkBottom;(指向任務(wù)堆棧棧底指針) INT32U OSTCBStkSize;(存有棧中可容納的指針元數(shù)目) INT16U OSTCBOpt; INT16U OSTCBId; (存儲任務(wù)的識別碼ID,備用)#endif struct os_tcb *OS

39、TCBNext; (任務(wù)控制塊OS-TCB雙向鏈表的后鏈接) struct os_tcb *OSTCBPrev; (任務(wù)控制塊OS-TCB雙向鏈表的前鏈接)#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;(指向事件控制塊的指針)#endif49#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg;(指向傳遞給任務(wù)的消息的指針)#endif INT16U OSTCBDly; INT8U OSTCBStat;

40、(任務(wù)的狀態(tài)字) INT8U OSTCBPrio; (任務(wù)的優(yōu)先級) INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;50空任務(wù)列表n所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組OSTCBTbl 中中n系統(tǒng)初始化時,所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表系統(tǒng)初始化時,所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表n任務(wù)建立后,空任務(wù)控制塊指針任務(wù)建立后,空任務(wù)控制塊指針

41、OSTCBFreeList指向的任務(wù)控制塊就指向的任務(wù)控制塊就賦給了該任務(wù),然后賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向鏈表中的下一個空的值調(diào)整為指向鏈表中的下一個空任務(wù)控制塊任務(wù)控制塊n任務(wù)一旦被刪除,任務(wù)控制塊就還給空任務(wù)鏈表任務(wù)一旦被刪除,任務(wù)控制塊就還給空任務(wù)鏈表51任務(wù)級的任務(wù)調(diào)度任務(wù)級的任務(wù)調(diào)度-OSSched-OSSchedn C/OSC/OS是占先式實時多任務(wù)內(nèi)核,優(yōu)先級最高的任務(wù)一是占先式實時多任務(wù)內(nèi)核,優(yōu)先級最高的任務(wù)一旦準(zhǔn)備就緒,則擁有旦準(zhǔn)備就緒,則擁有CPUCPU的所有權(quán)即開始投入運行。的所有權(quán)即開始投入運行。n C/OSC/OS中不支持時間片輪轉(zhuǎn)法,

42、每個任務(wù)的優(yōu)先級要求中不支持時間片輪轉(zhuǎn)法,每個任務(wù)的優(yōu)先級要求不一樣且是唯一的。因此,任務(wù)調(diào)度就是:查找準(zhǔn)備不一樣且是唯一的。因此,任務(wù)調(diào)度就是:查找準(zhǔn)備就緒的最高優(yōu)先級的任務(wù)并進(jìn)行上下文切換。就緒的最高優(yōu)先級的任務(wù)并進(jìn)行上下文切換。n C/OSC/OS任務(wù)調(diào)度所花的時間為常數(shù),與應(yīng)用程序中建立任務(wù)調(diào)度所花的時間為常數(shù),與應(yīng)用程序中建立的任務(wù)數(shù)無關(guān)。的任務(wù)數(shù)無關(guān)。52就緒表就緒表根據(jù)就緒表確定最高優(yōu)先級根據(jù)就緒表確定最高優(yōu)先級兩個關(guān)鍵兩個關(guān)鍵:優(yōu)先級數(shù)分解為高三位和低三位分別確定優(yōu)先級數(shù)分解為高三位和低三位分別確定高優(yōu)先級有著小的優(yōu)先級號高優(yōu)先級有著小的優(yōu)先級號 53根據(jù)優(yōu)先級找到任務(wù)在就緒任

43、務(wù)表中的位置根據(jù)優(yōu)先級找到任務(wù)在就緒任務(wù)表中的位置每個就緒的任務(wù)都放入就緒表中(每個就緒的任務(wù)都放入就緒表中(ready listready list)中,就緒表用兩個變)中,就緒表用兩個變量表示:量表示:OSRdyGrpOSRdyGrp、OSRdyTblOSRdyTblOSRdyGrpOSRdyGrp1207 6 5 4 300X XX XX XY YY Y Y Y任務(wù)優(yōu)先級20 0176543108915 14 13 1212 1118161723 22 2121 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44

44、4350484955 54 53 52 515856576363 62 61 60 5901234567OSRdyTbl7OSRdyTbl7X XY優(yōu)先級最低任務(wù)優(yōu)先級最低任務(wù)(空閑任務(wù))優(yōu)先級最高任務(wù)優(yōu)先級最高任務(wù)任務(wù)優(yōu)先級號任務(wù)優(yōu)先級號000 00 01 10 0 0 0001 10 01 10 00 0 1 1122154采用查表法確定高優(yōu)先級任務(wù)采用查表法確定高優(yōu)先級任務(wù) 查表法具有確定的時間,增加了系統(tǒng)的可預(yù)測性, C/OS II中所有的系統(tǒng)調(diào)用時間都是確定的High3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Prio =(

45、High33)+Low3;OSRdyGrp1207 6 5 4 300XXXYY Y任務(wù)優(yōu)先級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 5901234567OSRdyTbl7XY55任務(wù)調(diào)度器(task scheduler)56Task schedulervoid OSSched (void) INT8U y; OS_ENTER_CRITICAL();

46、 (禁止中斷的宏) if (OSLockNesting =0)&(OSIntNesting= 0) (如果調(diào)用來自中斷服務(wù)程序,或者至少調(diào)用了一次給任務(wù)調(diào)度上鎖函數(shù),任務(wù)調(diào)度函數(shù)將退出,不做調(diào)度) y = OSUnMapTblOSRdyGrp; (否則,調(diào)度找出進(jìn)入就緒態(tài)且優(yōu)先級最高的任務(wù),就緒任務(wù)表相應(yīng)的位置位) OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly) if (OSPrioHighRdy != OSPrioCur) (優(yōu)先級最高的任務(wù)是否是當(dāng)前正在運行的任務(wù),若是不調(diào)度) OSTCBHighRdy = OSTCBPrio

47、TblOSPrioHighRdy;(若不是,為了實現(xiàn)任務(wù)切換,指向優(yōu)先級最高的任務(wù)控制塊) OSCtxSwCtr+; (統(tǒng)計計數(shù),跟蹤任務(wù)切換次數(shù)) OS_TASK_SW(); (任務(wù)切換) OS_EXIT_CRITICAL(); (開放中斷的宏) 57void OSSchedLock (void) if (OSRunning = TRUE) OS_ENTER_CRITICAL(); if(OSLockNesting 0) OSLockNesting-; if (OSLockNesting=0)&(OSIntNesting=0) OS_EXIT_CRITICAL(); OSSched(

48、); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 59任務(wù)切換任務(wù)切換n將被掛起的任務(wù)寄存器入棧n將較高優(yōu)先級任務(wù)的寄存器出棧60任務(wù)級的任務(wù)切換任務(wù)級的任務(wù)切換OS_TASK_SW()OS_TASK_SW()nOS_TASK_SW()是宏調(diào)用,含有微處理器的軟中斷指令。因為,系統(tǒng)假定任務(wù)切換是靠中斷級代碼完成的。nOS_TASK_SW()將處理器相關(guān)的軟件中斷機制封裝起來,便于操作系統(tǒng)移植61調(diào)用調(diào)用OS_TASK_SW()OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級任務(wù) OS_TCBOSTCBCur(1)存貯器低地址存貯器

49、高地址堆棧方向堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務(wù)(切換后運行的任務(wù)) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R4即將被掛起任務(wù)的棧頂(即將被掛起任務(wù))(即將被掛起任務(wù))指向即將運行的任務(wù)的棧頂62保存當(dāng)前保存當(dāng)前CPUCPU寄存器的值寄存器的值低優(yōu)先級任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務(wù) OS_TCBOSTCBHighRdy(2)CPU(1)(3)(3

50、)63重新裝入要運行的任務(wù)重新裝入要運行的任務(wù)低優(yōu)先級任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務(wù) OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)復(fù)制64任務(wù)切換任務(wù)切換OS_TASK_SW()OS_TASK_SW()的代碼的代碼Void OSCtxSw(void)Void OSCtxSw(void) 將將R1,R2,R3R1,R2,R3及及R4R4推入當(dāng)前堆棧;推入當(dāng)前堆棧; OSTCB

51、Cur OSTCBCurOSTCBStkPtr = SP;OSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy SP = OSTCBHighRdy OSTCBSTKPtr;OSTCBSTKPtr; 將將R4,R3,R2R4,R3,R2及及R1R1從新堆棧中彈出;從新堆棧中彈出; 執(zhí)行中斷返回指令;執(zhí)行中斷返回指令; 65 C/OS-IIC/OS-II中的中斷中的中斷l(xiāng)中斷:由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的中斷:由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中

52、斷的事件稱為中斷源。事件稱為中斷源。lCPU響應(yīng)中斷的條件:響應(yīng)中斷的條件:l至少有一個中斷源向至少有一個中斷源向CPU發(fā)出中斷信號;發(fā)出中斷信號;l系統(tǒng)允許中斷,且對此中斷信號未予屏蔽系統(tǒng)允許中斷,且對此中斷信號未予屏蔽l中斷類型:中斷類型:l硬件中斷硬件中斷 l外部中斷外部中斷l(xiāng)陷井中斷陷井中斷l(xiāng)現(xiàn)場控制量的中斷現(xiàn)場控制量的中斷66 C/OS-IIC/OS-II中的中斷服務(wù)子程序中的中斷服務(wù)子程序用戶中斷服務(wù)子程序:用戶中斷服務(wù)子程序: 保存全部保存全部CPUCPU寄存器;寄存器; 調(diào)用調(diào)用OSIntEnter()OSIntEnter()或或OSIntNestingOSIntNesting

53、直接加直接加1 1; if(OSIntNesting=1) if(OSIntNesting=1) OSTCBCur-OSTCBStkPtr=SP; OSTCBCur-OSTCBStkPtr=SP; 清中斷源;清中斷源; 重新開中斷;重新開中斷; 執(zhí)行用戶代碼做中斷服務(wù);執(zhí)行用戶代碼做中斷服務(wù); 調(diào)用調(diào)用OSIntExit();OSIntExit(); 恢復(fù)所有恢復(fù)所有CPUCPU寄存器;寄存器; 執(zhí)行中斷返回指令;執(zhí)行中斷返回指令;67中斷服務(wù)中斷服務(wù)6869Search for highest priority similar to schedulerHalf context switch

54、is done by interrupt response i.e. registers saved70中斷與時鐘節(jié)拍中斷與時鐘節(jié)拍n時鐘節(jié)拍(時鐘滴答)Tick,是一種定時器中斷,可通過編程方式實現(xiàn)n時鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先32位的整數(shù)OSTime加一。對任務(wù)列表進(jìn)行掃描,判斷是否有延時任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。71時鐘節(jié)拍中斷服務(wù)子程序時鐘節(jié)拍中斷服務(wù)子程序Void OSTickISR(void) 保存處理器寄存器的值; 調(diào)用OSIntEnter(),或是將OSIntNesting加1 if(OSIntNesting=1) OSTCBCur-OST

55、CBStkPtr=SP; 調(diào)用OSTimeTick(); 發(fā)出中斷設(shè)備的中斷; 重新允許中斷(可選用) 調(diào)用OSIntExit(); 恢復(fù)處理器寄存器的值; 執(zhí)行中斷返回指令;72void OSTimeTick (void) OS_TCB *ptcb; OSTimeTickHook(); (1) ptcb = OSTCBList; (2) while (ptcb-OSTCBPrio != OS_IDLE_PRIO) (3) OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) if (!(ptcb-OSTCBS

56、tat & 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) OS_EXIT_CRITICAL();時鐘節(jié)拍函數(shù)OSTimeTick()73n 系統(tǒng)總要建立一個空閑任務(wù),該任務(wù)在沒有其它任務(wù)進(jìn)入就緒狀系統(tǒng)總要建立一個空閑任務(wù),該任務(wù)在沒有其它任務(wù)進(jìn)

57、入就緒狀態(tài)時投入運行態(tài)時投入運行n 空閑任務(wù)永遠(yuǎn)設(shè)為最低優(yōu)先級空閑任務(wù)永遠(yuǎn)設(shè)為最低優(yōu)先級n 空閑任務(wù)不可能被應(yīng)用軟件刪除空閑任務(wù)不可能被應(yīng)用軟件刪除n void OSTaskIdle (void *pdata) pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); 空閑任務(wù)OSTaskIdle()74 C/OS-IIC/OS-II初始化初始化l首先調(diào)用系統(tǒng)初始化函數(shù)首先調(diào)用系統(tǒng)初始化函數(shù)OSIint()。OSIint()初始化初始化C/OS-所有的所有的變量和數(shù)據(jù)結(jié)構(gòu)(見變量和數(shù)據(jù)結(jié)構(gòu)(見OS_C

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

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

60、tart(); /* 開始多任務(wù)調(diào)度!OSStart()永遠(yuǎn)不會返回 */78啟動多任務(wù)void OSStart (void) INT8U y; INT8U x; if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y OS_LOWEST_PRIO) (1) return (OS_PRIO_INVALID); OS_ENTER_CRITICAL(); if (OSTCBPrioTblprio = (OS_TCB *)0) (2) OSTCBPrioTblprio = (OS_TCB *)1; (3)84 O

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論