版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、12C H A P T E R嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-分析2主要內(nèi)容n嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)n C/OS-簡(jiǎn)介簡(jiǎn)介n C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)n C/OS-任務(wù)管理任務(wù)管理n C/OS-時(shí)間管理時(shí)間管理n C/OS-任務(wù)通信與同步任務(wù)通信與同步3為什么需要操作系統(tǒng)嵌入式嵌入式微處理器微處理器SDRAMSDRAMROMROMI/OI/OA/DA/DD/AD/A人機(jī)交互接口人機(jī)交互接口通用接口通用接口實(shí)時(shí)操作系統(tǒng)(實(shí)時(shí)操作系統(tǒng)(RTOS)RTOS)圖形用戶(hù)圖形用戶(hù)接口接口BSP/HAL 硬件抽象層/板極支持包BSP/HAL 硬件抽象層/板極支持包任務(wù)管理任務(wù)管理文件系統(tǒng)文件系統(tǒng)應(yīng)用程序
2、應(yīng)用程序嵌入式計(jì)算機(jī)系統(tǒng)嵌入式計(jì)算機(jī)系統(tǒng)硬件層硬件層軟件層軟件層中間層中間層功能層功能層4硬件抽象層的引入硬件抽象層的引入 n嵌入式實(shí)時(shí)系統(tǒng)自底向上包含三個(gè)部分 n硬件環(huán)境n嵌入式實(shí)時(shí)操作系統(tǒng)RTOSn嵌入式實(shí)時(shí)應(yīng)用程序n由于嵌入式系統(tǒng)應(yīng)用的硬件環(huán)境差異較大 n新增加的中間層中間層位于操作系統(tǒng)和硬件之間,包含了系統(tǒng)中與硬件相關(guān)的大部分功能 ,隱蔽了底層硬件的多樣性 5 嵌入式系統(tǒng)的體系結(jié)構(gòu)嵌入式系統(tǒng)的體系結(jié)構(gòu)嵌入式嵌入式微處理器微處理器SDRAMSDRAMROMROMI/OI/OA/DA/DD/AD/A人機(jī)交互接口人機(jī)交互接口通用接口通用接口實(shí)時(shí)操作系統(tǒng)(實(shí)時(shí)操作系統(tǒng)(RTOS)RTOS)圖形
3、用戶(hù)圖形用戶(hù)接口接口BSP/HAL 硬件抽象層/板極支持包BSP/HAL 硬件抽象層/板極支持包任務(wù)管理任務(wù)管理文件系統(tǒng)文件系統(tǒng)應(yīng)用程序應(yīng)用程序嵌入式計(jì)算機(jī)系統(tǒng)嵌入式計(jì)算機(jī)系統(tǒng)硬件層硬件層軟件層軟件層中間層中間層功能層功能層6HAL簡(jiǎn)介n硬件抽象層(硬件抽象層(HALHAL)是體系結(jié)構(gòu)相關(guān)的底層程序)是體系結(jié)構(gòu)相關(guān)的底層程序n處理系統(tǒng)啟動(dòng)、硬件初始化以及中斷與異常處理系統(tǒng)啟動(dòng)、硬件初始化以及中斷與異常n硬件抽象層對(duì)內(nèi)核其它部分提供統(tǒng)一的調(diào)用接口硬件抽象層對(duì)內(nèi)核其它部分提供統(tǒng)一的調(diào)用接口 nHALHAL可以提供可以提供BSPBSP規(guī)范,提供跨平臺(tái)可移植性規(guī)范,提供跨平臺(tái)可移植性 7硬件抽象層接口
4、定義和代碼設(shè)計(jì)特點(diǎn)硬件抽象層接口定義和代碼設(shè)計(jì)特點(diǎn) n硬件抽象層具有與硬件密切相關(guān)性硬件抽象層具有與硬件密切相關(guān)性n硬件抽象層具有與操作系統(tǒng)無(wú)關(guān)性硬件抽象層具有與操作系統(tǒng)無(wú)關(guān)性n接口定義的功能應(yīng)包含硬件或系統(tǒng)所需硬件支接口定義的功能應(yīng)包含硬件或系統(tǒng)所需硬件支持的所有功能持的所有功能n接口定義簡(jiǎn)單明了,太多接口函數(shù)會(huì)增加軟件接口定義簡(jiǎn)單明了,太多接口函數(shù)會(huì)增加軟件模擬的復(fù)雜性模擬的復(fù)雜性n具有可測(cè)性的接口設(shè)計(jì)有利于系統(tǒng)的軟硬件測(cè)具有可測(cè)性的接口設(shè)計(jì)有利于系統(tǒng)的軟硬件測(cè)試和集成試和集成 8HAL設(shè)計(jì)目標(biāo)n支持多種的國(guó)際主流嵌入式芯片支持多種的國(guó)際主流嵌入式芯片n支持?jǐn)?shù)字電視機(jī)頂盒、智能手機(jī)、數(shù)字化
5、音視頻、數(shù)字儀表等數(shù)字化產(chǎn)支持?jǐn)?shù)字電視機(jī)頂盒、智能手機(jī)、數(shù)字化音視頻、數(shù)字儀表等數(shù)字化產(chǎn)品中常見(jiàn)外設(shè)的驅(qū)動(dòng)品中常見(jiàn)外設(shè)的驅(qū)動(dòng) n基于甚高端通訊設(shè)備的硬件抽象層,能夠支持多基于甚高端通訊設(shè)備的硬件抽象層,能夠支持多CPUCPU體系結(jié)構(gòu)(體系結(jié)構(gòu)(SMPSMP),),以及基于網(wǎng)絡(luò)元素以及基于網(wǎng)絡(luò)元素NENE的甚高端通訊設(shè)備的甚高端通訊設(shè)備n基于智能手機(jī)的硬件抽象層,能夠支持以基于智能手機(jī)的硬件抽象層,能夠支持以Intel PCAIntel PCA體系結(jié)構(gòu)為內(nèi)核的體系結(jié)構(gòu)為內(nèi)核的智能手機(jī)、以智能手機(jī)、以Intel EIAIntel EIA體系結(jié)構(gòu)為內(nèi)核的智能手機(jī),以及以體系結(jié)構(gòu)為內(nèi)核的智能手機(jī),以及
6、以MotorolaMotorola的的8800088000系列為內(nèi)核的系列為內(nèi)核的PDAPDAn基于基于ICIC卡的匯編級(jí)硬件抽象層,能夠支持?jǐn)?shù)字電視條件接收卡的匯編級(jí)硬件抽象層,能夠支持?jǐn)?shù)字電視條件接收CACA的的8/16/328/16/32位位CPU ICCPU IC設(shè)計(jì)和機(jī)器碼級(jí)匯編抽象層設(shè)計(jì)和機(jī)器碼級(jí)匯編抽象層 9通用操作系統(tǒng)和嵌入式(實(shí)時(shí))操作系統(tǒng)通用操作系統(tǒng)和嵌入式(實(shí)時(shí))操作系統(tǒng)n通用操作系統(tǒng):Windows/NT/XP、Linux、UNIX等,用于PC機(jī)、服務(wù)器,n嵌入式(實(shí)時(shí))操作系統(tǒng):用于嵌入式設(shè)備的操作系統(tǒng),具有通用操作系統(tǒng)的基本特點(diǎn),又具有系統(tǒng)實(shí)時(shí)性、硬件的相關(guān)依賴(lài)性、
7、軟件固態(tài)化以及應(yīng)用的專(zhuān)用性等特點(diǎn);n嵌入式(實(shí)時(shí))操作系統(tǒng)通常包括與硬件相關(guān)的底層驅(qū)動(dòng)軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動(dòng)接口、通信協(xié)議、圖形界面、標(biāo)準(zhǔn)化瀏覽器Browser等;n嵌入式(實(shí)時(shí))操作系統(tǒng)的重要指標(biāo):實(shí)時(shí)性(中斷響應(yīng)時(shí)間、任務(wù)切換時(shí)間等)、尺寸(可裁剪性 )、可擴(kuò)展性(內(nèi)核、中間件)10嵌入式操作系統(tǒng)的發(fā)展操作系統(tǒng)內(nèi)核操作系統(tǒng)內(nèi)核應(yīng)用程序應(yīng)用程序驅(qū)動(dòng)程序和固件驅(qū)動(dòng)程序和固件操作系統(tǒng)內(nèi)核操作系統(tǒng)內(nèi)核文件系統(tǒng)文件系統(tǒng)驅(qū)動(dòng)程序和固件驅(qū)動(dòng)程序和固件API GUI應(yīng)用程序應(yīng)用程序操作系統(tǒng)內(nèi)核操作系統(tǒng)內(nèi)核文件系統(tǒng)文件系統(tǒng)驅(qū)動(dòng)程序和固件驅(qū)動(dòng)程序和固件API GUI應(yīng)用程序應(yīng)用程序通信協(xié)議通信協(xié)議庫(kù)函數(shù)庫(kù)函
8、數(shù)80年代初期年代初期80年代中期年代中期-90年代中年代中期期90年代末期年代末期-21世紀(jì)世紀(jì)11常見(jiàn)的嵌入式操作系統(tǒng) 實(shí)時(shí)嵌入式操作系統(tǒng)的種類(lèi)繁多,大體上可分為兩種,商用型和免費(fèi)型。n商用型的實(shí)操作系統(tǒng)功能穩(wěn)定、可靠,有完善的技術(shù)支持和售后服務(wù),但往往價(jià)格昂貴,如Vxworks、QNX、WinCE、Palm OS等。n免費(fèi)型的實(shí)時(shí)操作系統(tǒng)在價(jià)格方面具有優(yōu)勢(shì),目前主要有Linux,C/OS是一種源碼開(kāi)放的商業(yè)RTOS12學(xué)習(xí)嵌入式操作系統(tǒng) n學(xué)習(xí)一種實(shí)時(shí)操作系統(tǒng)RTOS,如 C/OS-,掌握實(shí)時(shí)系統(tǒng)的概念和設(shè)計(jì)方法n嵌入式系統(tǒng)以應(yīng)用為中心,要選擇“適用”的操作系統(tǒng)n嵌入式Linuxn自己嘗
9、試“寫(xiě)”RTOS13RTOS在嵌入式系統(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+14主要內(nèi)容n嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)n C/OS-簡(jiǎn)介簡(jiǎn)介n C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)n C/OS-任務(wù)管理任務(wù)管理n C/OS-時(shí)間管理時(shí)間管理n C/OS-任務(wù)通信與同步任務(wù)通信與同步15 C/OSC/OS簡(jiǎn)介簡(jiǎn)介1、C/OSMicro Controller O S,微控制器操作系統(tǒng)2、 C/OS簡(jiǎn)介簡(jiǎn)介n美國(guó)人Jean Labrosse 1992年完成n應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、
10、發(fā)動(dòng)機(jī)控制、高速公路電話(huà)系統(tǒng)、自動(dòng)提款機(jī)等 n1998年C/OS-II,目前的版本C/OS -II V2.61,2.72n2000年,得到美國(guó)航空管理局(FAA)的認(rèn)證,可以用于飛行器中n網(wǎng)站www.ucos-II.com()16u公開(kāi)源代碼u可移植性(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)行。u可固化(ROMable
11、) C/OS-II是為嵌入式應(yīng)用而設(shè)計(jì)的,這就意味著,只要用戶(hù)有固化手段(C編譯、連接、下載和固化), C/OS-II可以嵌入到用戶(hù)的產(chǎn)品中成為產(chǎn)品的一部分。u可裁剪(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/OSC/OS的性能特點(diǎn)(一)的性能特點(diǎn)(一)17u占先式(Preemptive)u多任務(wù) C/OS-II可以管理64個(gè)任務(wù),然而,目前這一版
12、本保留8個(gè)給系統(tǒng)。應(yīng)用程序最多可以有56個(gè)任務(wù)u可確定性 全部 C/OS-II的函數(shù)調(diào)用與服務(wù)的執(zhí)行時(shí)間具有可確定性。u任務(wù)棧 每個(gè)任務(wù)有自己?jiǎn)为?dú)的棧, C/OS-II允許每個(gè)任務(wù)有不同的??臻g,以便壓低應(yīng)用程序?qū)AM的需求。u系統(tǒng)服務(wù) C/OS-II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊(duì)列、信號(hào)量、塊大小固定的內(nèi)存的申請(qǐng)與釋放、時(shí)間相關(guān)函數(shù)等。u中斷管理 中斷可以使正在執(zhí)行的任務(wù)暫時(shí)掛起,如果優(yōu)先級(jí)更高的任務(wù)被該中斷喚醒,則高優(yōu)先級(jí)的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)255層。u穩(wěn)定性與可靠性 C/OSC/OS的性能特點(diǎn)(二)的性能特點(diǎn)(二)18C/OS-II圖籍n描述了C/O
13、S-II內(nèi)部的工作原理n隨書(shū)的CD中包含了源代碼n工業(yè)界最清晰的源代碼n除英文版外,有中文和韓文版ChineseKoreanEnglishISBN 1-57820-103-9美國(guó)CMP BOOK ISBN 7-81077-290-2北京航空航天大學(xué)出版社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)用: :nAvionics(航空電子設(shè)備)(航空電子設(shè)備)nMedicalnCell phonesnRouters and switchesnHigh-end audio equipmentnWashi
14、ng machines and dryersnUPS (Uninterruptible Power Supplies)nIndustrial controllersnGPS Navigation SystemsnMicrowave RadiosnInstrumentationnPoint-of-sale terminalsn更多20C/OS-IIC/OS-II提供的系統(tǒng)服務(wù)提供的系統(tǒng)服務(wù)n信號(hào)量n帶互斥機(jī)制的信號(hào)量n減少優(yōu)先級(jí)倒置的問(wèn)題n事件標(biāo)志n消息信箱n消息隊(duì)列n內(nèi)存管理n時(shí)鐘管理n任務(wù)管理21主要內(nèi)容n嵌入式操作系統(tǒng)嵌入式操作系統(tǒng)n C/OS-簡(jiǎn)介簡(jiǎn)介n C/OS-內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)n C
15、/OS-任務(wù)管理任務(wù)管理n C/OS-時(shí)間管理時(shí)間管理n C/OS-任務(wù)通信與同步任務(wù)通信與同步22 C/OSC/OS-II-II的文件結(jié)構(gòu)的文件結(jié)構(gòu)23n內(nèi)核結(jié)構(gòu)n任務(wù)管理n時(shí)間管理n任務(wù)之間通信與同步nC/OS的移植 C/OSC/OS-II-II分析分析24n當(dāng)處理臨界段代碼時(shí),須關(guān)中斷,處理完畢后,再開(kāi)中斷當(dāng)處理臨界段代碼時(shí),須關(guān)中斷,處理完畢后,再開(kāi)中斷n關(guān)中斷時(shí)間關(guān)中斷時(shí)間是實(shí)時(shí)內(nèi)核最重要的指標(biāo)之一。它影響用戶(hù)系是實(shí)時(shí)內(nèi)核最重要的指標(biāo)之一。它影響用戶(hù)系統(tǒng)對(duì)實(shí)時(shí)事件的相應(yīng)特性。統(tǒng)對(duì)實(shí)時(shí)事件的相應(yīng)特性。n在實(shí)際應(yīng)用中,關(guān)中斷的時(shí)間很大程度上取決于微處理器在實(shí)際應(yīng)用中,關(guān)中斷的時(shí)間很大程度
16、上取決于微處理器的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量n微處理器通常具有關(guān)中斷微處理器通常具有關(guān)中斷/ /開(kāi)中斷操作。開(kāi)中斷操作。C C編譯器須具有某編譯器須具有某種機(jī)制,能夠在種機(jī)制,能夠在c c中直接實(shí)現(xiàn)關(guān)中斷中直接實(shí)現(xiàn)關(guān)中斷/ /開(kāi)中斷操作開(kāi)中斷操作nC C源代碼中插入?yún)R編語(yǔ)言的語(yǔ)句,易實(shí)現(xiàn)關(guān)中斷源代碼中插入?yún)R編語(yǔ)言的語(yǔ)句,易實(shí)現(xiàn)關(guān)中斷/ /開(kāi)中斷操作開(kāi)中斷操作n關(guān)中斷關(guān)中斷/ /開(kāi)中斷操作作為語(yǔ)言的擴(kuò)展部分,直接從開(kāi)中斷操作作為語(yǔ)言的擴(kuò)展部分,直接從C C語(yǔ)言中可以語(yǔ)言中可以 關(guān)中斷關(guān)中斷/ /開(kāi)中斷開(kāi)中斷 C/OSC/OS-II-II開(kāi)關(guān)中斷的方法開(kāi)關(guān)中斷的方法25
17、 C/OSC/OS-II-II開(kāi)關(guān)中斷的方法(續(xù)開(kāi)關(guān)中斷的方法(續(xù)1 1)n C/OSC/OS-II-II定義了兩個(gè)宏調(diào)用來(lái)開(kāi)關(guān)中斷定義了兩個(gè)宏調(diào)用來(lái)開(kāi)關(guān)中斷: :nOS_ENTER_CRITICAL( ) OS_ENTER_CRITICAL( ) (禁止中斷的宏(禁止中斷的宏) ) nOS_EXIT_CRITICAL( ) OS_EXIT_CRITICAL( ) ( (啟用中斷的宏)啟用中斷的宏)n通常成對(duì)出現(xiàn)通常成對(duì)出現(xiàn)n上述宏定義取決于使用的微處理器。在文件上述宏定義取決于使用的微處理器。在文件OS_CPU.HOS_CPU.H有相應(yīng)的宏定義有相應(yīng)的宏定義n在在 C/OSC/OS-II-I
18、I中,每種微處理器都有自己的中,每種微處理器都有自己的OS_CPU.HOS_CPU.H文件文件26 C/OSC/OS-II-II開(kāi)關(guān)中斷的方法(續(xù)開(kāi)關(guān)中斷的方法(續(xù)2 2)27 C/OSC/OS-II-II開(kāi)關(guān)中斷的方法(續(xù)開(kāi)關(guān)中斷的方法(續(xù)3 3)可以選擇可以選擇具體使用哪種方法具體使用哪種方法n該常數(shù)在與該常數(shù)在與CPUCPU類(lèi)型有關(guān)的移植文件類(lèi)型有關(guān)的移植文件OS_CPU.HOS_CPU.H中定義中定義28nOS_CRITICAL_METHOD=1OS_CRITICAL_METHOD=1n用最簡(jiǎn)單的方式來(lái)實(shí)現(xiàn)用最簡(jiǎn)單的方式來(lái)實(shí)現(xiàn)2 2個(gè)宏調(diào)用個(gè)宏調(diào)用n用處理器指令關(guān)中斷,完成用處理器指令
19、關(guān)中斷,完成OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()n用開(kāi)中斷指令完成用開(kāi)中斷指令完成OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()n問(wèn)題:?jiǎn)栴}:n如果調(diào)用如果調(diào)用 C/OSC/OS-II-II功能函數(shù)時(shí),中斷是關(guān)掉的,則從功能函數(shù)時(shí),中斷是關(guān)掉的,則從 C/OSC/OS-II-II函數(shù)返回時(shí),函數(shù)返回時(shí),中斷就打開(kāi)了中斷就打開(kāi)了n若調(diào)用若調(diào)用 C/OSC/OS-II-II功能函數(shù)之前已將中斷關(guān)掉,那么功能函數(shù)之前已將中斷關(guān)掉,那么用戶(hù)往往希望用戶(hù)往往希望從從 C/OSC/OS-II-II函數(shù)返回時(shí),中斷仍然是關(guān)著的。函數(shù)返回時(shí),中
20、斷仍然是關(guān)著的。這時(shí),這種方法就不妥當(dāng)。這時(shí),這種方法就不妥當(dāng)。n對(duì)特定的處理器,這種辦法是唯一的選擇對(duì)特定的處理器,這種辦法是唯一的選擇 C/OSC/OS-II-II中采用了中采用了3 3種開(kāi)關(guān)中斷的方法種開(kāi)關(guān)中斷的方法29 C/OSC/OS-II-II中采用了中采用了3 3種開(kāi)關(guān)中斷的方法(續(xù)種開(kāi)關(guān)中斷的方法(續(xù)1 1)nOS_CRITICAL_METHOD=2OS_CRITICAL_METHOD=2n在堆棧中保存中斷的開(kāi)在堆棧中保存中斷的開(kāi)/ /關(guān)狀態(tài),然后再關(guān)中斷關(guān)狀態(tài),然后再關(guān)中斷n實(shí)現(xiàn)實(shí)現(xiàn)OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()時(shí),先在堆棧中保存
21、中斷的開(kāi)時(shí),先在堆棧中保存中斷的開(kāi)/ /關(guān)狀態(tài),然后再關(guān)中斷關(guān)狀態(tài),然后再關(guān)中斷n實(shí)現(xiàn)實(shí)現(xiàn)OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()時(shí),從堆棧中彈出原來(lái)中斷的開(kāi)時(shí),從堆棧中彈出原來(lái)中斷的開(kāi)/ /關(guān)狀態(tài)關(guān)狀態(tài)n利用這種機(jī)制,不論用戶(hù)在調(diào)用利用這種機(jī)制,不論用戶(hù)在調(diào)用 C/OSC/OS-II-II功能函數(shù)功能函數(shù)之前中斷是開(kāi)或關(guān),函數(shù)的進(jìn)入和返回狀態(tài)都得到之前中斷是開(kāi)或關(guān),函數(shù)的進(jìn)入和返回狀態(tài)都得到了保護(hù)。即:調(diào)用前中斷的開(kāi)了保護(hù)。即:調(diào)用前中斷的開(kāi)/ /關(guān)狀態(tài),在調(diào)用之關(guān)狀態(tài),在調(diào)用之后保持不變后保持不變30 C/OSC/OS-II-II中采用了中采用了3 3種開(kāi)關(guān)
22、中斷的方法(續(xù)種開(kāi)關(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)中斷時(shí)保存,開(kāi)中斷時(shí)恢復(fù)關(guān)中斷時(shí)保存,開(kāi)中斷時(shí)恢復(fù)31 C/OSC/OS-II-II中采用了中采用了3 3種開(kāi)關(guān)中斷的方法(續(xù)種開(kāi)關(guān)中斷的方法(續(xù)3 3)Void Some_ uCOSuCOS_II_Service(arguments)_II_Service(arguments) OS_CPU_SR cpu_sr
23、; OS_CPU_SR cpu_sr; cpu_sr=get_processor_psw(); cpu_sr=get_processor_psw(); disable_interrupts(); disable_interrupts(); / /* *臨界段代碼臨界段代碼* */ / set_processor_psw(cpu_sr); set_processor_psw(cpu_sr); 32任務(wù)(任務(wù)(tasktask) 典型的任務(wù):一個(gè)無(wú)限循環(huán)典型的任務(wù):一個(gè)無(wú)限循環(huán)void mytask(void *pdata) for (;) do something; waiting; do so
24、mething; 33Task Structure void YourTask (void *pdata) (1) for (;) (2) /* 用戶(hù)代碼 */ 調(diào)用uC/OS-II的某種系統(tǒng)服務(wù): OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用戶(hù)代碼 */ 34n 用戶(hù)應(yīng)用程序的一般結(jié)構(gòu)n“用戶(hù)任務(wù)用戶(hù)任務(wù)” 代碼形式上很像代碼形式上很像 C函數(shù),但他不是函數(shù),但他不是函數(shù)!函數(shù)!n“任務(wù)
25、任務(wù)” 不能被主函數(shù)不能被主函數(shù) main( ) 或其他函數(shù)調(diào)用,或其他函數(shù)調(diào)用,只能被主函數(shù)或已激活任務(wù)只能被主函數(shù)或已激活任務(wù)創(chuàng)建創(chuàng)建。n任務(wù)的運(yùn)行由操作系統(tǒng)調(diào)度管理。任務(wù)的運(yùn)行由操作系統(tǒng)調(diào)度管理。35void MyTask1(void *pdata) void MyTask2(void *pdata) void main( ) OSInit( ); OSTaskCreate( MyTask1, ); OSTaskCreate( MyTask2, ); OSStart( ); 36nOSTaskCreate( ) 函數(shù)原型:函數(shù)原型: INT8U OSTaskCreate( void (*
26、task)(void *pd) , /指向任務(wù)的指針指向任務(wù)的指針 void *pdata , /傳遞給任務(wù)的參數(shù)傳遞給任務(wù)的參數(shù) OS_STK *ptos , /任務(wù)堆棧棧頂?shù)闹羔樔蝿?wù)堆棧棧頂?shù)闹羔?INT8U prio /任務(wù)的優(yōu)先級(jí)別任務(wù)的優(yōu)先級(jí)別 )37OSTaskCreate( ) 函數(shù)使用舉例:定義任務(wù)定義任務(wù) task_Avoid task_A(void* pdata) ; /任務(wù)初始化部分 while (1) ; /任務(wù)功能代碼 在系統(tǒng)在系統(tǒng) “創(chuàng)建創(chuàng)建” 任務(wù)任務(wù) task_Avoid main(void) OSInit(); /系統(tǒng)初始化部分 OSTaskCreate( t
27、ask_A, void * 0, &MystackTop, 8 ); OSStart();38任務(wù)的基本概念任務(wù)的基本概念n系統(tǒng)任務(wù)n空閑任務(wù)(空閑任務(wù)(OSTaskIdel( ))n統(tǒng)計(jì)任務(wù)(統(tǒng)計(jì)任務(wù)(OSTaskStat( ))原型:原型:void OSTaskIdel(void* pdata)原型:原型:void OSTaskStat(void* pdata)39n 空閑任務(wù)(空閑任務(wù)(OSTaskIdel( ))使用說(shuō)明:)使用說(shuō)明: 1、uC/OS-II規(guī)定用戶(hù)程序中必須使用規(guī)定用戶(hù)程序中必須使用OSTaskIdel。 2、該任務(wù)不能用軟件刪除。、該任務(wù)不能用軟件刪除。 3、
28、該任務(wù)是、該任務(wù)是uC/OS-II初始化時(shí)自動(dòng)創(chuàng)建,其任務(wù)優(yōu)先初始化時(shí)自動(dòng)創(chuàng)建,其任務(wù)優(yōu)先級(jí)固定為最低級(jí),用戶(hù)也可修改該任務(wù)的業(yè)務(wù)。級(jí)固定為最低級(jí),用戶(hù)也可修改該任務(wù)的業(yè)務(wù)。 4、目的、目的 - 使使 CPU 在沒(méi)有用戶(hù)任務(wù)可執(zhí)行時(shí)也有事可在沒(méi)有用戶(hù)任務(wù)可執(zhí)行時(shí)也有事可做。做。40n 統(tǒng)計(jì)任務(wù)(統(tǒng)計(jì)任務(wù)(OSTaskStat( ))使用說(shuō)明:)使用說(shuō)明: 1、功能完成用戶(hù)任務(wù)、功能完成用戶(hù)任務(wù) CPU 使用率的統(tǒng)計(jì),結(jié)果以百分使用率的統(tǒng)計(jì),結(jié)果以百分比的形式存放在變量比的形式存放在變量 OSCPUsage 中。中。 2、該任務(wù)用戶(hù)可選擇使用。、該任務(wù)用戶(hù)可選擇使用。OS_CFG.H文件中的常數(shù)
29、文件中的常數(shù)OS_TASK_STAT_EN 設(shè)置為設(shè)置為 1,使能該函數(shù)。,使能該函數(shù)。 3、用戶(hù)在、用戶(hù)在OS_CFG.H中使能該任務(wù)后,系統(tǒng)自動(dòng)創(chuàng)建中使能該任務(wù)后,系統(tǒng)自動(dòng)創(chuàng)建該任務(wù),但在用戶(hù)使用統(tǒng)計(jì)數(shù)據(jù)前必須調(diào)用系統(tǒng)該任務(wù),但在用戶(hù)使用統(tǒng)計(jì)數(shù)據(jù)前必須調(diào)用系統(tǒng)函數(shù)函數(shù) OSStatInit() 先進(jìn)行初始化。先進(jìn)行初始化。 4、該任務(wù)固定擁有次末任務(wù)優(yōu)先級(jí)。、該任務(wù)固定擁有次末任務(wù)優(yōu)先級(jí)。41n任務(wù)的優(yōu)先權(quán)和優(yōu)先級(jí)別任務(wù)的優(yōu)先權(quán)和優(yōu)先級(jí)別nuC/OS-II 的每個(gè)任務(wù)都必須有唯一的優(yōu)先級(jí)。nuC/OS-II 最多可以管理64個(gè)優(yōu)先級(jí)別分配給64個(gè)任務(wù)。nuC/OS-II 中用一個(gè)8b的整型
30、數(shù)來(lái)表示優(yōu)先級(jí)別,數(shù)字越小,優(yōu)先級(jí)越高,prio = 0 的任務(wù)優(yōu)先級(jí)最高。nuC/OS-II 中使用任務(wù)的優(yōu)先級(jí)(prio)作為任務(wù)句柄。n用戶(hù)通過(guò)修改 OS_CFG.H 中的宏定義常數(shù) OS_LOWEST_PRIO 的值,約定本用戶(hù)系統(tǒng)的最大優(yōu)先級(jí)數(shù)。42任務(wù)堆棧任務(wù)堆棧n堆棧堆棧 - FIFO訪(fǎng)問(wèn)原則組織的連續(xù)存儲(chǔ)器。訪(fǎng)問(wèn)原則組織的連續(xù)存儲(chǔ)器。n任務(wù)堆棧在任務(wù)堆棧在 uC/OS-II 中的應(yīng)用:中的應(yīng)用:n任務(wù)堆棧是任務(wù)的三大組成部分之一。任務(wù)堆棧是任務(wù)的三大組成部分之一。n保存保存 CPU 寄存器現(xiàn)場(chǎng)(寄存器現(xiàn)場(chǎng)(R0R12、LR、SPSR 等)。等)。n本本 Task 的私有數(shù)據(jù)。的
31、私有數(shù)據(jù)。43n任務(wù)堆棧的創(chuàng)建任務(wù)堆棧的創(chuàng)建- 在創(chuàng)建任務(wù)的同時(shí),任務(wù)堆棧即被創(chuàng)建。在創(chuàng)建任務(wù)的同時(shí),任務(wù)堆棧即被創(chuàng)建。舉例舉例:#define MyTaskStkSize 64OS_STK MyTaskStk MyTaskStkSize /在在 OS_CPU.H中定義中定義 OS_STK / typedef INT32U OS_STKINT8U OSTaskCreate( void (*task) (void *pd), /指向任務(wù)的指針指向任務(wù)的指針 void * pdata, /傳遞給任務(wù)的參數(shù)傳遞給任務(wù)的參數(shù) MyTaskStk MyTaskStkSize 1 /任務(wù)堆棧任務(wù)堆棧棧頂棧
32、頂?shù)闹羔樀闹羔?INT8U prio /任務(wù)的優(yōu)先級(jí)別任務(wù)的優(yōu)先級(jí)別 )44n任務(wù)堆棧的使用注意事項(xiàng)任務(wù)堆棧的使用注意事項(xiàng) _ 存在兩種堆棧形式存在兩種堆棧形式n遞增堆棧遞增堆棧 - 進(jìn)棧操作進(jìn)棧操作向大地址方向發(fā)展。向大地址方向發(fā)展。n遞減堆棧遞減堆棧 - 進(jìn)棧操作進(jìn)棧操作向小地址方向發(fā)展。向小地址方向發(fā)展。OSTaskCreate( &MyTaskStkStkSize - 1, )OSTaskCreate( &MyTaskStk 0 , )備注:利用條件編譯技術(shù)和備注:利用條件編譯技術(shù)和 OS_CPU.H 中的宏定義常數(shù)中的宏定義常數(shù)OS_STK_GROWTH 編寫(xiě)易移植用
33、戶(hù)系統(tǒng);編寫(xiě)易移植用戶(hù)系統(tǒng);“1” - 遞減堆棧遞減堆棧 for ARM CPU。45任務(wù)完成后的自我刪除任務(wù)完成后的自我刪除n當(dāng)任務(wù)完成后,任務(wù)可以自我刪除當(dāng)任務(wù)完成后,任務(wù)可以自我刪除n任務(wù)代碼并非真的刪除了,系統(tǒng)只是簡(jiǎn)單地不再理會(huì)任務(wù)代碼并非真的刪除了,系統(tǒng)只是簡(jiǎn)單地不再理會(huì)這個(gè)任務(wù)這個(gè)任務(wù)n這個(gè)任務(wù)的代碼也不會(huì)再運(yùn)行了,即使任務(wù)調(diào)用了這個(gè)任務(wù)的代碼也不會(huì)再運(yùn)行了,即使任務(wù)調(diào)用了OSTaskDelOSTaskDel(),這個(gè)任務(wù)也絕不會(huì)返回(),這個(gè)任務(wù)也絕不會(huì)返回 void YourTask (void *pdata) /* 用戶(hù)代碼 */ OSTaskDel(OS_PRIO_SELF
34、);46任務(wù)狀態(tài)任務(wù)狀態(tài)n在任一給定的時(shí)刻,任務(wù)的狀態(tài)一定是在任一給定的時(shí)刻,任務(wù)的狀態(tài)一定是以下五種狀態(tài)之一:以下五種狀態(tài)之一:n睡眠態(tài)(睡眠態(tài)(task dormanttask dormant)n就緒態(tài)(就緒態(tài)(task readytask ready)n運(yùn)行態(tài)(運(yùn)行態(tài)(task runningtask running)n等待狀態(tài)(等待狀態(tài)(task waitingtask waiting)n中斷服務(wù)態(tài)(中斷服務(wù)態(tài)(ISR running)ISR running)47睡眠態(tài)(睡眠態(tài)(task dormanttask dormant)n指任務(wù)駐留在程序空間(指任務(wù)駐留在程序空間(ROMROM
35、或或RAMRAM),還沒(méi)有),還沒(méi)有交給系統(tǒng)來(lái)管理的狀態(tài)交給系統(tǒng)來(lái)管理的狀態(tài)n任務(wù)交給系統(tǒng)通過(guò)調(diào)用以下函數(shù)之一來(lái)實(shí)現(xiàn):任務(wù)交給系統(tǒng)通過(guò)調(diào)用以下函數(shù)之一來(lái)實(shí)現(xiàn): nOSTaskCreateOSTaskCreate()()nOSTaskCreateExtOSTaskCreateExt()()n告知系統(tǒng):告知系統(tǒng):n任務(wù)的起始地址任務(wù)的起始地址n任務(wù)建立時(shí),用戶(hù)給任務(wù)賦予的優(yōu)先級(jí)任務(wù)建立時(shí),用戶(hù)給任務(wù)賦予的優(yōu)先級(jí)n任務(wù)要使用的??臻g大小等任務(wù)要使用的??臻g大小等48就緒態(tài)(就緒態(tài)(task readytask ready)n任務(wù)一旦創(chuàng)建就進(jìn)入就緒態(tài),準(zhǔn)備運(yùn)行任務(wù)一旦創(chuàng)建就進(jìn)入就緒態(tài),準(zhǔn)備運(yùn)行n任務(wù)的
36、創(chuàng)建可以是在多任務(wù)開(kāi)始之前,也可以任務(wù)的創(chuàng)建可以是在多任務(wù)開(kāi)始之前,也可以動(dòng)態(tài)地由一個(gè)運(yùn)行著的任務(wù)創(chuàng)建動(dòng)態(tài)地由一個(gè)運(yùn)行著的任務(wù)創(chuàng)建n若剛創(chuàng)建任務(wù)的優(yōu)先級(jí)高于創(chuàng)建它的任務(wù)的優(yōu)若剛創(chuàng)建任務(wù)的優(yōu)先級(jí)高于創(chuàng)建它的任務(wù)的優(yōu)先級(jí),它將立即獲得先級(jí),它將立即獲得cpucpu的使用權(quán)的使用權(quán)n任務(wù)可通過(guò)任務(wù)可通過(guò)OSTaskDelOSTaskDel()返回睡眠態(tài);或調(diào)()返回睡眠態(tài);或調(diào)用該函數(shù)讓另一個(gè)任務(wù)進(jìn)入睡眠態(tài)用該函數(shù)讓另一個(gè)任務(wù)進(jìn)入睡眠態(tài)49運(yùn)行態(tài)(運(yùn)行態(tài)(task runningtask running)n就緒的任務(wù)只有當(dāng)所有優(yōu)先級(jí)高于它的任務(wù)都轉(zhuǎn)為等就緒的任務(wù)只有當(dāng)所有優(yōu)先級(jí)高于它的任務(wù)都轉(zhuǎn)為等待
37、狀態(tài),或被刪除后,才能進(jìn)入運(yùn)行態(tài)待狀態(tài),或被刪除后,才能進(jìn)入運(yùn)行態(tài)n任何時(shí)刻只有一個(gè)任務(wù)處于運(yùn)行態(tài)任何時(shí)刻只有一個(gè)任務(wù)處于運(yùn)行態(tài)n調(diào)用調(diào)用OSStartOSStart()可以啟動(dòng)多任務(wù)。該函數(shù)只能在啟動(dòng)()可以啟動(dòng)多任務(wù)。該函數(shù)只能在啟動(dòng)時(shí)調(diào)用一次時(shí)調(diào)用一次nOSStartOSStart()運(yùn)行用戶(hù)初始化代碼中已經(jīng)建立的、進(jìn)入()運(yùn)行用戶(hù)初始化代碼中已經(jīng)建立的、進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)50等待狀態(tài)(等待狀態(tài)(task waitingtask waiting)n正在運(yùn)行的任務(wù)可以通過(guò)下面的調(diào)用進(jìn)入等待狀態(tài)。延遲時(shí)間到,正在運(yùn)行的任務(wù)可以通過(guò)下面的調(diào)用進(jìn)入等待狀態(tài)。延遲
38、時(shí)間到,立即強(qiáng)制執(zhí)行任務(wù)切換,讓下一個(gè)優(yōu)先級(jí)最高、并進(jìn)入就緒態(tài)的任立即強(qiáng)制執(zhí)行任務(wù)切換,讓下一個(gè)優(yōu)先級(jí)最高、并進(jìn)入就緒態(tài)的任務(wù)執(zhí)行。務(wù)執(zhí)行。nOSTimeDlyOSTimeDly()()nOSTimeDlyHMSMOSTimeDlyHMSM()()n等待時(shí)間過(guò)去后,系統(tǒng)服務(wù)(內(nèi)部)函數(shù)等待時(shí)間過(guò)去后,系統(tǒng)服務(wù)(內(nèi)部)函數(shù)OSTimeTickOSTimeTick()使延遲了()使延遲了的任務(wù)進(jìn)入就緒態(tài)的任務(wù)進(jìn)入就緒態(tài)n用戶(hù)無(wú)需在應(yīng)用程序代碼中調(diào)用這個(gè)函數(shù)用戶(hù)無(wú)需在應(yīng)用程序代碼中調(diào)用這個(gè)函數(shù)51等待狀態(tài)(續(xù))等待狀態(tài)(續(xù))n正在運(yùn)行的任務(wù)可能需要通過(guò)調(diào)用函數(shù)等待某正在運(yùn)行的任務(wù)可能需要通過(guò)調(diào)用函數(shù)
39、等待某一事件發(fā)生。如果該事件并未發(fā)生,任務(wù)就進(jìn)一事件發(fā)生。如果該事件并未發(fā)生,任務(wù)就進(jìn)入等待狀態(tài)入等待狀態(tài)nOSFlagPendOSFlagPend();();OSMutexPendOSMutexPend()()nOSSemPendOSSemPend();();OSMboxPendOSMboxPend()()n當(dāng)事件發(fā)生或等待超時(shí),被掛起的任務(wù)就進(jìn)入當(dāng)事件發(fā)生或等待超時(shí),被掛起的任務(wù)就進(jìn)入就緒態(tài)就緒態(tài)52中斷服務(wù)態(tài)(中斷服務(wù)態(tài)(ISR running)ISR running)n正在執(zhí)行的任務(wù)是可以被中斷的正在執(zhí)行的任務(wù)是可以被中斷的,除非該,除非該任務(wù)將中斷關(guān)閉,或系統(tǒng)將中斷關(guān)閉。被任務(wù)將中斷
40、關(guān)閉,或系統(tǒng)將中斷關(guān)閉。被中斷的任務(wù)便進(jìn)入了中斷服務(wù)態(tài)中斷的任務(wù)便進(jìn)入了中斷服務(wù)態(tài)n響應(yīng)中斷后,正在運(yùn)行的任務(wù)被掛起,中響應(yīng)中斷后,正在運(yùn)行的任務(wù)被掛起,中斷服務(wù)子程序控制了斷服務(wù)子程序控制了CPUCPU的使用權(quán)的使用權(quán)53中斷服務(wù)態(tài)(中斷服務(wù)態(tài)(ISR running)ISR running)n中斷服務(wù)子程序可能會(huì)報(bào)告一個(gè)或多個(gè)事件的發(fā)生,中斷服務(wù)子程序可能會(huì)報(bào)告一個(gè)或多個(gè)事件的發(fā)生,而使一個(gè)或多個(gè)任務(wù)進(jìn)入就緒態(tài)而使一個(gè)或多個(gè)任務(wù)進(jìn)入就緒態(tài)n上述情況下,從中斷服務(wù)子程序返回之前,上述情況下,從中斷服務(wù)子程序返回之前, C/OSC/OS IIII 要判定:要判定:n被中斷的任務(wù)是否還是就緒態(tài)任
41、務(wù)中優(yōu)先級(jí)最高的被中斷的任務(wù)是否還是就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的n如果中斷服務(wù)子程序使另一個(gè)優(yōu)先級(jí)更高的任務(wù)進(jìn)入了如果中斷服務(wù)子程序使另一個(gè)優(yōu)先級(jí)更高的任務(wù)進(jìn)入了就緒態(tài),則新進(jìn)入就緒態(tài)的這個(gè)優(yōu)先級(jí)更高的任務(wù)將得就緒態(tài),則新進(jìn)入就緒態(tài)的這個(gè)優(yōu)先級(jí)更高的任務(wù)將得以運(yùn)行;否則,原來(lái)被中斷了的任務(wù)將繼續(xù)運(yùn)行。以運(yùn)行;否則,原來(lái)被中斷了的任務(wù)將繼續(xù)運(yùn)行。54任務(wù)狀態(tài)任務(wù)狀態(tài)n當(dāng)所有的任務(wù)都在等待時(shí)間發(fā)生或等待延遲時(shí)間結(jié)束時(shí),C/OS II 執(zhí)行被稱(chēng)為空閑任務(wù)(Idle Task)的內(nèi)部函數(shù),即:OSTaskIdle()55任務(wù)狀態(tài)任務(wù)的任務(wù)的CPU使用權(quán)使用權(quán)被剝奪被剝奪中斷中斷恢復(fù)恢復(fù)任務(wù)任務(wù)56任務(wù)控制
42、塊(任務(wù)控制塊(TCBTCB)n任務(wù)控制塊任務(wù)控制塊 OS_TCBOS_TCB是一個(gè)數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)是一個(gè)數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針、狀態(tài)、優(yōu)先級(jí)、任務(wù)表位置、參數(shù),包括任務(wù)堆棧指針、狀態(tài)、優(yōu)先級(jí)、任務(wù)表位置、任務(wù)鏈表指針等任務(wù)鏈表指針等n所有的任務(wù)控制塊分為兩條鏈表:所有的任務(wù)控制塊分為兩條鏈表:n空閑鏈表空閑鏈表n使用鏈表使用鏈表n當(dāng)任務(wù)的當(dāng)任務(wù)的CPUCPU使用權(quán)被剝奪時(shí),系統(tǒng)用它來(lái)保存該任務(wù)的使用權(quán)被剝奪時(shí),系統(tǒng)用它來(lái)保存該任務(wù)的狀態(tài)狀態(tài)n全部駐留在全部駐留在RAMRAM中中n空任務(wù)控制塊鏈表空任務(wù)控制塊鏈表 - - 未被分配的未被分配的 TCB TCB
43、 鏈鏈 OSTCBFreeListOSTCBFreeList。n任務(wù)控制塊鏈表任務(wù)控制塊鏈表 - - 已分配的已分配的 TCB TCB 鏈鏈 OSTCBListOSTCBList。57 C/OS-II任務(wù)控制塊.typedef struct os_tcb OS_STK *OSTCBStkPtr(當(dāng)前任務(wù)堆棧棧頂指針);#if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; (指向用戶(hù)定義的任務(wù)控制塊擴(kuò)展) OS_STK *OSTCBStkBottom;(指向任務(wù)堆棧棧底指針) INT32U OSTCBStkSize;(存有棧中可容納的指針元數(shù)目) INT16
44、U OSTCBOpt; INT16U OSTCBId; (存儲(chǔ)任務(wù)的識(shí)別碼ID,備用)#endif struct os_tcb *OSTCBNext; (任務(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;(指向事件控制塊的指針)#endif58#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN voi
45、d *OSTCBMsg;(指向傳遞給任務(wù)的消息的指針)#endif INT16U OSTCBDly; INT8U OSTCBStat;(任務(wù)的狀態(tài)字) INT8U OSTCBPrio; (任務(wù)的優(yōu)先級(jí)) INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;59任務(wù)控制塊及任務(wù)控制塊鏈表任務(wù)控制塊及任務(wù)控制塊鏈表n任務(wù)控制塊鏈表任務(wù)控制塊鏈表 空任務(wù)塊鏈表是在空任務(wù)塊鏈表是在 uC/OS-II 初始化(初始化(OSInit
46、())時(shí)系)時(shí)系統(tǒng)自建的,用戶(hù)可依據(jù)目標(biāo)系統(tǒng)的實(shí)際需求,設(shè)定其鏈表統(tǒng)自建的,用戶(hù)可依據(jù)目標(biāo)系統(tǒng)的實(shí)際需求,設(shè)定其鏈表長(zhǎng)度。長(zhǎng)度。nOS_CFG.H 文件中的宏常數(shù)文件中的宏常數(shù) OS_MAX_TASKS - 用于用于定義最大用戶(hù)任務(wù)數(shù)。定義最大用戶(hù)任務(wù)數(shù)。nUCOS_II.H 文件中的宏常數(shù)文件中的宏常數(shù) OS_N_SYS_TASKS - 用用于約定系統(tǒng)任務(wù)數(shù),其值固定為于約定系統(tǒng)任務(wù)數(shù),其值固定為 2 。當(dāng)應(yīng)用程序調(diào)用函數(shù)OSTaskCreate( )創(chuàng)建一個(gè)任務(wù)時(shí),這個(gè)函數(shù)會(huì)調(diào)用系統(tǒng)函數(shù)OSTCBInit( )來(lái)為任務(wù)控制塊進(jìn)行初始化。這個(gè)函數(shù)首先為被創(chuàng)建任務(wù)從空任務(wù)控制塊鏈表獲取一個(gè)任務(wù)
47、控制塊,然后用任務(wù)的屬性對(duì)任務(wù)控制塊各個(gè)成員進(jìn)行賦值,最后再把這個(gè)任務(wù)控制塊鏈入到任務(wù)控制塊鏈表的頭部。 當(dāng)進(jìn)行系統(tǒng)初始化時(shí),初始化函數(shù)會(huì)按用戶(hù)提供的任務(wù)數(shù)為系統(tǒng)創(chuàng)建具有相應(yīng)數(shù)量的任務(wù)控制塊并把它們鏈接為一個(gè)鏈表。 由于這些任務(wù)控制塊還沒(méi)有對(duì)應(yīng)的任務(wù),故這個(gè)鏈表叫做空任務(wù)塊鏈表。即相當(dāng)于是一些空白的身份證。60空任務(wù)列表n所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組OSTCBTbl 中中n系統(tǒng)初始化時(shí),所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表系統(tǒng)初始化時(shí),所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表n任務(wù)建立后,任務(wù)建立后,空任務(wù)控制塊指針空任務(wù)
48、控制塊指針OSTCBFreeList指向的任務(wù)控制塊就指向的任務(wù)控制塊就賦給了該任務(wù),然后賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向鏈表中的下一個(gè)空的值調(diào)整為指向鏈表中的下一個(gè)空任務(wù)控制塊任務(wù)控制塊n任務(wù)一旦被刪除,任務(wù)控制塊就還給空任務(wù)鏈表任務(wù)一旦被刪除,任務(wù)控制塊就還給空任務(wù)鏈表61uC/OS-II 中提供了系統(tǒng)函數(shù) OSTaskDel( ),用于刪除一個(gè)任務(wù) - 實(shí)質(zhì)就是將該任務(wù)的TCB從“任務(wù)控制塊列表” 移到了“空任務(wù)控制塊列表” 。 任務(wù)控制塊及任務(wù)控制塊鏈表任務(wù)控制塊及任務(wù)控制塊鏈表任務(wù)控制塊就相當(dāng)于是一個(gè)任務(wù)的身份證,沒(méi)有任務(wù)控制塊的任務(wù)是不能被系統(tǒng)承認(rèn)和管理。
49、 n任務(wù)控制塊鏈表任務(wù)控制塊鏈表6263任務(wù)控制塊及任務(wù)控制塊鏈表任務(wù)控制塊及任務(wù)控制塊鏈表n任務(wù)控制塊鏈表其他相關(guān)系統(tǒng)管理變量任務(wù)控制塊鏈表其他相關(guān)系統(tǒng)管理變量nOSTCBPrioTbl :OS_TCB* 數(shù)據(jù)類(lèi)型的數(shù)組,數(shù)據(jù)類(lèi)型的數(shù)組,以以 Prio 為下標(biāo)存放已使能的為下標(biāo)存放已使能的 TCB 指針。用指針。用于加速于加速 TCB 的訪(fǎng)問(wèn)。的訪(fǎng)問(wèn)。nOSTCBCur:全局系統(tǒng)變量,指向當(dāng)前正在:全局系統(tǒng)變量,指向當(dāng)前正在運(yùn)行的任務(wù)的運(yùn)行的任務(wù)的 TCB 。OSTCBFreeList、OSTCBListOSTCBTbl - OSInit()建立的任務(wù)控制塊數(shù)組建立的任務(wù)控制塊數(shù)組OSTCB
50、PrioTbl - 任務(wù)控制塊優(yōu)先級(jí)數(shù)組任務(wù)控制塊優(yōu)先級(jí)數(shù)組OSTCBCur64任務(wù)控制塊鏈表空任務(wù)控制塊鏈表65任務(wù)級(jí)的任務(wù)調(diào)度任務(wù)級(jí)的任務(wù)調(diào)度-OSSched-OSSchedn C/OSC/OS是是占先式實(shí)時(shí)多任務(wù)內(nèi)核占先式實(shí)時(shí)多任務(wù)內(nèi)核,優(yōu)先級(jí)最高的任務(wù)一,優(yōu)先級(jí)最高的任務(wù)一旦準(zhǔn)備就緒,則擁有旦準(zhǔn)備就緒,則擁有CPUCPU的所有權(quán)即開(kāi)始投入運(yùn)行。的所有權(quán)即開(kāi)始投入運(yùn)行。n C/OSC/OS中中不支持時(shí)間片輪轉(zhuǎn)法不支持時(shí)間片輪轉(zhuǎn)法,每個(gè)任務(wù)的優(yōu)先級(jí)要求,每個(gè)任務(wù)的優(yōu)先級(jí)要求不一樣且是唯一的。因此,任務(wù)調(diào)度就是:查找準(zhǔn)備不一樣且是唯一的。因此,任務(wù)調(diào)度就是:查找準(zhǔn)備就緒的最高優(yōu)先級(jí)的任務(wù)并進(jìn)
51、行上下文切換。就緒的最高優(yōu)先級(jí)的任務(wù)并進(jìn)行上下文切換。n C/OSC/OS任務(wù)調(diào)度所花的時(shí)間為常數(shù)任務(wù)調(diào)度所花的時(shí)間為常數(shù),與應(yīng)用程序中建立,與應(yīng)用程序中建立的任務(wù)數(shù)無(wú)關(guān)。的任務(wù)數(shù)無(wú)關(guān)。66就緒表就緒表根據(jù)就緒表確定最高優(yōu)先級(jí)根據(jù)就緒表確定最高優(yōu)先級(jí)兩個(gè)關(guān)鍵:n優(yōu)先級(jí)數(shù)分解為高三位和低三位分別確定n高優(yōu)先級(jí)有著小的優(yōu)先級(jí)號(hào)著小的優(yōu)先級(jí)號(hào) 67根據(jù)優(yōu)先級(jí)找到任務(wù)在就緒任務(wù)表中的位置根據(jù)優(yōu)先級(jí)找到任務(wù)在就緒任務(wù)表中的位置每個(gè)就緒的任務(wù)都放入就緒表中(每個(gè)就緒的任務(wù)都放入就緒表中(ready listready list)中,就緒表用兩個(gè)變)中,就緒表用兩個(gè)變量表示:量表示:OSRdyGrpOSRd
52、yGrp、OSRdyTblOSRdyTblOSRdyGrpOSRdyGrp1207 6 5 4 300X XX XX XY YY Y Y Y任務(wù)優(yōu)先級(jí)20 0176543108915 14 13 1212 1118161723 22 2121 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 515856576363 62 61 60 5901234567OSRdyTbl7OSRdyTbl7X XY優(yōu)先級(jí)最低任務(wù)優(yōu)先級(jí)最低任務(wù)(空閑任務(wù))優(yōu)先級(jí)最高任務(wù)優(yōu)先級(jí)最高任務(wù)任務(wù)優(yōu)先級(jí)號(hào)任
53、務(wù)優(yōu)先級(jí)號(hào)000 00 01 10 0 0 0001 10 01 10 00 0 1 1122168采用查表法確定高優(yōu)先級(jí)任務(wù)采用查表法確定高優(yōu)先級(jí)任務(wù) 查表法具有確定的時(shí)間,增加了系統(tǒng)的可預(yù)測(cè)性, C/OS II中所有的系統(tǒng)調(diào)用時(shí)間都是確定的High3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Prio =(High33)+Low3;OSRdyGrp1207 6 5 4 300XXXYY Y任務(wù)優(yōu)先級(jí)20176543108915 14 13 12 1118161723 22 21 20 1926242531 30 29 28 2734
54、323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY69Task schedulervoid OSSched (void) INT8U y; OS_ENTER_CRITICAL(); (禁止中斷的宏(禁止中斷的宏) ) if (OSLockNesting =0)&(OSIntNesting= 0) (如果調(diào)用來(lái)自中斷服務(wù)程序,或者至少調(diào)用了一次給任務(wù)調(diào)度上鎖函數(shù),任務(wù)調(diào)度函數(shù)將退出,不做調(diào)度) y = OSUnMapTblOSRdyGrp; (否
55、則,調(diào)度找出進(jìn)入就緒態(tài)且優(yōu)先級(jí)最高的任務(wù),就緒任務(wù)表相應(yīng)的位置位) OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly) if (OSPrioHighRdy != OSPrioCur) (優(yōu)先級(jí)最高的任務(wù)是否是當(dāng)前正在運(yùn)行的任務(wù),若是不調(diào)度) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;(若不是,為了實(shí)現(xiàn)任務(wù)切換,指向優(yōu)先級(jí)最高的任務(wù)控制塊) OSCtxSwCtr+; (統(tǒng)計(jì)計(jì)數(shù),跟蹤任務(wù)切換次數(shù)) OS_TASK_SW(); (任務(wù)切換) OS_EXIT_CRITICAL(); (開(kāi)放中斷的宏(開(kāi)放中斷的
56、宏) ) 70void OSSchedLock (void) if (OSRunning = TRUE) OS_ENTER_CRITICAL(); if(OSLockNesting 0) OSLockNesting-; if (OSLockNesting=0)&(OSIntNesting=0) OS_EXIT_CRITICAL(); OSSched(); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 72任務(wù)切換任務(wù)切換n將被掛起的任務(wù)寄存器入棧n將較高優(yōu)先級(jí)任務(wù)的寄存器出棧73任務(wù)級(jí)的任務(wù)切換任務(wù)級(jí)的任務(wù)切換OS_TASK_SW(
57、)OS_TASK_SW()nOS_TASK_SW()是宏調(diào)用,含有微處理器的軟中斷指令。因?yàn)?,系統(tǒng)假定任務(wù)切換是靠中斷級(jí)代碼完成的。nOS_TASK_SW()將處理器相關(guān)的軟件中斷機(jī)制封裝起來(lái),便于操作系統(tǒng)移植74調(diào)用調(diào)用OS_TASK_SW()OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級(jí)任務(wù)(切換(切換后運(yùn)行的任務(wù))后運(yùn)行的任務(wù)) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R4即將被掛起任務(wù)的棧
58、頂(即將被掛起任務(wù))(即將被掛起任務(wù))指向即將運(yùn)行的任務(wù)的棧頂75保存當(dāng)前保存當(dāng)前CPUCPU寄存器的值寄存器的值低優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級(jí)任務(wù) OS_TCBOSTCBHighRdy(2)CPU(1)(3)(3)76重新裝入要運(yùn)行的任務(wù)重新裝入要運(yùn)行的任務(wù)低優(yōu)先級(jí)任務(wù) OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地
59、址存貯器高地址高優(yōu)先級(jí)任務(wù) OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)復(fù)制77任務(wù)切換任務(wù)切換OS_TASK_SW()OS_TASK_SW()的代碼的代碼Void OSCtxSw(void)Void OSCtxSw(void) 將將R1,R2,R3R1,R2,R3及及R4R4推入當(dāng)前堆棧;推入當(dāng)前堆棧; OSTCBCurOSTCBCurOSTCBStkPtr = SP;OSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; OSTCBCur = OSTCBHighRdy; SP = OSTCBHigh
60、Rdy SP = OSTCBHighRdy OSTCBSTKPtr;OSTCBSTKPtr; 將將R4,R3,R2R4,R3,R2及及R1R1從新堆棧中彈出;從新堆棧中彈出; 執(zhí)行中斷返回指令;執(zhí)行中斷返回指令; 78 C/OSC/OS-II-II中的中斷中的中斷l(xiāng)中斷:中斷:由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的事件稱(chēng)為中斷源。事件稱(chēng)為中斷源。lCPU響應(yīng)中斷的條件:響應(yīng)中斷的條件:n至少有一個(gè)中斷源向至少有一個(gè)中斷源向CPU發(fā)出中斷信號(hào);發(fā)出中斷信號(hào);n系統(tǒng)允許中斷,且對(duì)此中斷信號(hào)未予屏蔽系統(tǒng)允許中斷,且對(duì)此中斷信號(hào)未予屏蔽l中斷類(lèi)型:中斷類(lèi)型:n硬件中斷硬件中斷 n外部中斷外部中
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年公司會(huì)議紀(jì)要標(biāo)準(zhǔn)模板
- 酒店反恐演練方案
- 廣西壯族自治區(qū)貴港市覃塘區(qū)水系連通及水美鄉(xiāng)村建設(shè)項(xiàng)目環(huán)境影響報(bào)告表
- 2024年鹽山縣招教考試備考題庫(kù)帶答案解析
- 2025年哈爾濱華德學(xué)院馬克思主義基本原理概論期末考試模擬題帶答案解析(奪冠)
- 2025年中山職業(yè)技術(shù)學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析(奪冠)
- 2025年重慶信息技術(shù)職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析(必刷)
- 2025年西安思源學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析
- 2024年湖南稅務(wù)高等專(zhuān)科學(xué)校馬克思主義基本原理概論期末考試題及答案解析(奪冠)
- 2025年興山縣幼兒園教師招教考試備考題庫(kù)含答案解析(必刷)
- GB/T 19894-2025數(shù)碼照相機(jī)光電轉(zhuǎn)換函數(shù)(OECFs)的測(cè)量方法
- 2025年北京市物業(yè)管理行業(yè)市場(chǎng)深度分析及發(fā)展前景預(yù)測(cè)報(bào)告
- 旅游景區(qū)商戶(hù)管理辦法
- 2025年甘肅省中考物理、化學(xué)綜合試卷真題(含標(biāo)準(zhǔn)答案)
- DLT5210.1-2021電力建設(shè)施工質(zhì)量驗(yàn)收規(guī)程第1部分-土建工程
- 機(jī)械設(shè)備租賃服務(wù)方案
- 樂(lè)理考試古今音樂(lè)對(duì)比試題及答案
- 電影放映年度自查報(bào)告
- 水泥窯協(xié)同處置危廢可行性研究報(bào)告
- 心內(nèi)介入治療護(hù)理
- 初中畢業(yè)學(xué)業(yè)考試命題規(guī)范、原則、與教學(xué)建議
評(píng)論
0/150
提交評(píng)論