嵌入式實時操作系統(tǒng)分析_第1頁
嵌入式實時操作系統(tǒng)分析_第2頁
嵌入式實時操作系統(tǒng)分析_第3頁
嵌入式實時操作系統(tǒng)分析_第4頁
嵌入式實時操作系統(tǒng)分析_第5頁
已閱讀5頁,還剩110頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

嵌入式實時操作系統(tǒng)分析第一頁,共一百一十五頁,2022年,8月28日1為什么需要操作系統(tǒng)第二頁,共一百一十五頁,2022年,8月28日2硬件抽象層的引入

嵌入式實時系統(tǒng)自底向上包含三個部分硬件環(huán)境嵌入式實時操作系統(tǒng)——RTOS嵌入式實時應(yīng)用程序由于嵌入式系統(tǒng)應(yīng)用的硬件環(huán)境差異較大新增加的中間層位于操作系統(tǒng)和硬件之間,包含了系統(tǒng)中與硬件相關(guān)的大部分功能,隱蔽了底層硬件的多樣性

第三頁,共一百一十五頁,2022年,8月28日3

嵌入式系統(tǒng)的體系結(jié)構(gòu)第四頁,共一百一十五頁,2022年,8月28日4HAL簡介硬件抽象層(HAL)是體系結(jié)構(gòu)相關(guān)的底層程序處理系統(tǒng)啟動、硬件初始化以及中斷與異常硬件抽象層對內(nèi)核其它部分提供統(tǒng)一的調(diào)用接口HAL可以提供BSP規(guī)范,提供跨平臺可移植性

第五頁,共一百一十五頁,2022年,8月28日5硬件抽象層接口定義和代碼設(shè)計特點

硬件抽象層具有與硬件密切相關(guān)性硬件抽象層具有與操作系統(tǒng)無關(guān)性接口定義的功能應(yīng)包含硬件或系統(tǒng)所需硬件支持的所有功能接口定義簡單明了,太多接口函數(shù)會增加軟件模擬的復(fù)雜性具有可測性的接口設(shè)計有利于系統(tǒng)的軟硬件測試和集成第六頁,共一百一十五頁,2022年,8月28日6HAL設(shè)計目標支持多種的國際主流嵌入式芯片支持數(shù)字電視機頂盒、智能手機、數(shù)字化音視頻、數(shù)字儀表等數(shù)字化產(chǎn)品中常見外設(shè)的驅(qū)動基于甚高端通訊設(shè)備的硬件抽象層,能夠支持多CPU體系結(jié)構(gòu)(SMP),以及基于網(wǎng)絡(luò)元素NE的甚高端通訊設(shè)備基于智能手機的硬件抽象層,能夠支持以IntelPCA體系結(jié)構(gòu)為內(nèi)核的智能手機、以IntelEIA體系結(jié)構(gòu)為內(nèi)核的智能手機,以及以Motorola的88000系列為內(nèi)核的PDA基于IC卡的匯編級硬件抽象層,能夠支持數(shù)字電視條件接收CA的8/16/32位CPUIC設(shè)計和機器碼級匯編抽象層第七頁,共一百一十五頁,2022年,8月28日7通用操作系統(tǒng)和嵌入式(實時)操作系統(tǒng)通用操作系統(tǒng):Windows/NT/XP、Linux、UNIX等,用于PC機、服務(wù)器,嵌入式(實時)操作系統(tǒng):用于嵌入式設(shè)備的操作系統(tǒng),具有通用操作系統(tǒng)的基本特點,又具有系統(tǒng)實時性、硬件的相關(guān)依賴性、軟件固態(tài)化以及應(yīng)用的專用性等特點;嵌入式(實時)操作系統(tǒng)通常包括與硬件相關(guān)的底層驅(qū)動軟件、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動接口、通信協(xié)議、圖形界面、標準化瀏覽器Browser等;嵌入式(實時)操作系統(tǒng)的重要指標:實時性(中斷響應(yīng)時間、任務(wù)切換時間等)、尺寸(可裁剪性)、可擴展性(內(nèi)核、中間件)第八頁,共一百一十五頁,2022年,8月28日8嵌入式操作系統(tǒng)的發(fā)展操作系統(tǒng)內(nèi)核應(yīng)用程序驅(qū)動程序和固件操作系統(tǒng)內(nèi)核文件系統(tǒng)驅(qū)動程序和固件APIGUI應(yīng)用程序操作系統(tǒng)內(nèi)核文件系統(tǒng)驅(qū)動程序和固件APIGUI應(yīng)用程序通信協(xié)議庫函數(shù)80年代初期80年代中期-90年代中期90年代末期-21世紀第九頁,共一百一十五頁,2022年,8月28日9常見的嵌入式操作系統(tǒng)

實時嵌入式操作系統(tǒng)的種類繁多,大體上可分為兩種,商用型和免費型。商用型的實操作系統(tǒng)功能穩(wěn)定、可靠,有完善的技術(shù)支持和售后服務(wù),但往往價格昂貴,如Vxworks、QNX、WinCE、PalmOS等。免費型的實時操作系統(tǒng)在價格方面具有優(yōu)勢,目前主要有Linux,μC/OS是一種源碼開放的商業(yè)RTOS第十頁,共一百一十五頁,2022年,8月28日10學(xué)習(xí)嵌入式操作系統(tǒng)

學(xué)習(xí)一種實時操作系統(tǒng)RTOS,如C/OS-Ⅱ,掌握實時系統(tǒng)的概念和設(shè)計方法嵌入式系統(tǒng)以應(yīng)用為中心,要選擇“適用”的操作系統(tǒng)嵌入式Linux自己嘗試“寫”RTOS第十一頁,共一百一十五頁,2022年,8月28日11RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺BSPKERNELFSTCP/IP設(shè)備驅(qū)動設(shè)備I/O調(diào)試工具其它組件應(yīng)用RTOSC/C++第十二頁,共一百一十五頁,2022年,8月28日12主要內(nèi)容嵌入式操作系統(tǒng)C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ任務(wù)通信與同步第十三頁,共一百一十五頁,2022年,8月28日13C/OS簡介

1、C/OS——MicroControllerOS,微控制器操作系統(tǒng)2、C/OS簡介美國人JeanLabrosse1992年完成應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機、醫(yī)療器械、音響設(shè)備、發(fā)動機控制、高速公路電話系統(tǒng)、自動提款機等1998年C/OS-II,目前的版本C/OS-IIV2.61,2.722000年,得到美國航空管理局(FAA)的認證,可以用于飛行器中網(wǎng)站()第十四頁,共一百一十五頁,2022年,8月28日14公開源代碼可移植性(Portable)

絕大部分

C/OS-II的源碼是用移植性很強的ANSIC寫的。和微處理器硬件相關(guān)的那部分是用匯編語言寫的。匯編語言寫的部分已經(jīng)壓到最低限度,使得

C/OS-II便于移植到其他微處理器上。

C/OS-II可以在絕大多數(shù)8位、16位、32位以至64位微處理器、微控制器、數(shù)字信號處理器(DSP)上運行??晒袒≧OMable)

C/OS-II是為嵌入式應(yīng)用而設(shè)計的,這就意味著,只要用戶有固化手段(C編譯、連接、下載和固化),

C/OS-II可以嵌入到用戶的產(chǎn)品中成為產(chǎn)品的一部分。可裁剪(Scalable)

可以只使用

C/OS-II中應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說某產(chǎn)品可以只使用很少幾個

C/OS-II調(diào)用,而另一個產(chǎn)品則使用了幾乎所有

C/OS-II的功能,這樣可以減少產(chǎn)品中的

C/OS-II所需的存儲器空間(RAM和ROM)。這種可剪裁性是靠條件編譯實現(xiàn)的。C/OS的性能特點(一)第十五頁,共一百一十五頁,2022年,8月28日15占先式(Preemptive)多任務(wù)

C/OS-II可以管理64個任務(wù),然而,目前這一版本保留8個給系統(tǒng)。應(yīng)用程序最多可以有56個任務(wù)可確定性

全部

C/OS-II的函數(shù)調(diào)用與服務(wù)的執(zhí)行時間具有可確定性。任務(wù)棧

每個任務(wù)有自己單獨的棧,

C/OS-II允許每個任務(wù)有不同的??臻g,以便壓低應(yīng)用程序?qū)AM的需求。系統(tǒng)服務(wù)

C/OS-II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊列、信號量、塊大小固定的內(nèi)存的申請與釋放、時間相關(guān)函數(shù)等。中斷管理

中斷可以使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被該中斷喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達255層。穩(wěn)定性與可靠性C/OS的性能特點(二)第十六頁,共一百一十五頁,2022年,8月28日16μC/OS-II圖籍描述了μC/OS-II內(nèi)部的工作原理隨書的CD中包含了源代碼工業(yè)界最清晰的源代碼除英文版外,有中文和韓文版ChineseKoreanEnglishISBN1-57820-103-9美國CMPBOOKISBN7-81077-290-2北京航空航天大學(xué)出版社ISBN89-951540-5-5第十七頁,共一百一十五頁,2022年,8月28日17μC/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:Avionics(航空電子設(shè)備)MedicalCellphonesRoutersandswitchesHigh-endaudioequipmentWashingmachinesanddryersUPS(UninterruptiblePowerSupplies)IndustrialcontrollersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-saleterminals更多第十八頁,共一百一十五頁,2022年,8月28日18μC/OS-II提供的系統(tǒng)服務(wù)信號量帶互斥機制的信號量減少優(yōu)先級倒置的問題事件標志消息信箱消息隊列內(nèi)存管理時鐘管理任務(wù)管理第十九頁,共一百一十五頁,2022年,8月28日19主要內(nèi)容嵌入式操作系統(tǒng)C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ任務(wù)通信與同步第二十頁,共一百一十五頁,2022年,8月28日20C/OS-II的文件結(jié)構(gòu)第二十一頁,共一百一十五頁,2022年,8月28日21內(nèi)核結(jié)構(gòu)任務(wù)管理時間管理任務(wù)之間通信與同步C/OS的移植C/OS-II分析第二十二頁,共一百一十五頁,2022年,8月28日22當處理臨界段代碼時,須關(guān)中斷,處理完畢后,再開中斷關(guān)中斷時間是實時內(nèi)核最重要的指標之一。它影響用戶系統(tǒng)對實時事件的相應(yīng)特性。在實際應(yīng)用中,關(guān)中斷的時間很大程度上取決于微處理器的結(jié)構(gòu)和編譯器生成的代碼質(zhì)量微處理器通常具有關(guān)中斷/開中斷操作。C編譯器須具有某種機制,能夠在c中直接實現(xiàn)關(guān)中斷/開中斷操作C源代碼中插入?yún)R編語言的語句,易實現(xiàn)關(guān)中斷/開中斷操作關(guān)中斷/開中斷操作作為語言的擴展部分,直接從C語言中可以關(guān)中斷/開中斷C/OS-II開關(guān)中斷的方法第二十三頁,共一百一十五頁,2022年,8月28日23C/OS-II開關(guān)中斷的方法(續(xù)1)C/OS-II定義了兩個宏調(diào)用來開關(guān)中斷:OS_ENTER_CRITICAL()(禁止中斷的宏)

OS_EXIT_CRITICAL()(啟用中斷的宏)通常成對出現(xiàn)上述宏定義取決于使用的微處理器。在文件OS_CPU.H有相應(yīng)的宏定義在C/OS-II中,每種微處理器都有自己的OS_CPU.H文件第二十四頁,共一百一十五頁,2022年,8月28日24C/OS-II開關(guān)中斷的方法(續(xù)2){..OS_ENTER_CRITICAL();/*C/OS-II臨界段代碼*/

OS_EXIT_CRITICAL();..}如果在所有掛起類(PEND)調(diào)用之前,如:調(diào)用OSTimeDel()(掛起時間)功能函數(shù)之前關(guān)中斷,會出現(xiàn)什么現(xiàn)象?通常,調(diào)用C/OS-II功能函數(shù)時,中斷總應(yīng)當是開放的。第二十五頁,共一百一十五頁,2022年,8月28日25C/OS-II開關(guān)中斷的方法(續(xù)3)OS_ENTER_CRITICAL()及OS_EXIT_CRITICAL()可以用3種不同的方法實現(xiàn)具體方法取決于用戶打算移植到的處理器的性能及所用的C編譯器用定義(#define)常數(shù)OS_CRITICAL_METHOD可以選擇具體使用哪種方法該常數(shù)在與CPU類型有關(guān)的移植文件OS_CPU.H中定義

第二十六頁,共一百一十五頁,2022年,8月28日26OS_CRITICAL_METHOD==1用最簡單的方式來實現(xiàn)2個宏調(diào)用用處理器指令關(guān)中斷,完成OS_ENTER_CRITICAL()用開中斷指令完成OS_EXIT_CRITICAL()問題:如果調(diào)用C/OS-II功能函數(shù)時,中斷是關(guān)掉的,則從C/OS-II函數(shù)返回時,中斷就打開了若調(diào)用C/OS-II功能函數(shù)之前已將中斷關(guān)掉,那么用戶往往希望從C/OS-II函數(shù)返回時,中斷仍然是關(guān)著的。這時,這種方法就不妥當。對特定的處理器,這種辦法是唯一的選擇C/OS-II中采用了3種開關(guān)中斷的方法第二十七頁,共一百一十五頁,2022年,8月28日27C/OS-II中采用了3種開關(guān)中斷的方法(續(xù)1)OS_CRITICAL_METHOD==2在堆棧中保存中斷的開/關(guān)狀態(tài),然后再關(guān)中斷實現(xiàn)OS_ENTER_CRITICAL()時,先在堆棧中保存中斷的開/關(guān)狀態(tài),然后再關(guān)中斷實現(xiàn)OS_EXIT_CRITICAL()時,從堆棧中彈出原來中斷的開/關(guān)狀態(tài)利用這種機制,不論用戶在調(diào)用C/OS-II功能函數(shù)之前中斷是開或關(guān),函數(shù)的進入和返回狀態(tài)都得到了保護。即:調(diào)用前中斷的開/關(guān)狀態(tài),在調(diào)用之后保持不變第二十八頁,共一百一十五頁,2022年,8月28日28C/OS-II中采用了3種開關(guān)中斷的方法(續(xù)2)OS_CRITICAL_METHOD==3把當前處理器的狀態(tài)字(PSW)保存在C函數(shù)的局部變量中(如OS_CPU_SR)關(guān)中斷時保存,開中斷時恢復(fù)第二十九頁,共一百一十五頁,2022年,8月28日29C/OS-II中采用了3種開關(guān)中斷的方法(續(xù)3)VoidSome_uCOS_II_Service(arguments){OS_CPU_SRcpu_sr;cpu_sr=get_processor_psw();disable_interrupts();/*臨界段代碼*/set_processor_psw(cpu_sr);}第三十頁,共一百一十五頁,2022年,8月28日30任務(wù)(task)

典型的任務(wù):一個無限循環(huán)voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}第三十一頁,共一百一十五頁,2022年,8月28日31TaskStructurevoidYourTask(void*pdata) (1){for(;;){ (2)/*用戶代碼*/

調(diào)用uC/OS-II的某種系統(tǒng)服務(wù):OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*用戶代碼*/}}第三十二頁,共一百一十五頁,2022年,8月28日32

用戶應(yīng)用程序的一般結(jié)構(gòu)“用戶任務(wù)”代碼形式上很像C函數(shù),但他不是函數(shù)!“任務(wù)”不能被主函數(shù)main()或其他函數(shù)調(diào)用,只能被主函數(shù)或已激活任務(wù)創(chuàng)建。任務(wù)的運行由操作系統(tǒng)調(diào)度管理。第三十三頁,共一百一十五頁,2022年,8月28日33voidMyTask1(void*pdata){……}voidMyTask2(void*pdata){……}voidmain(){……OSInit();……

OSTaskCreate(MyTask1,……);

OSTaskCreate(MyTask2,……);……OSStart();……}第三十四頁,共一百一十五頁,2022年,8月28日34OSTaskCreate()函數(shù)原型:

INT8UOSTaskCreate( void(*task)(void*pd),

//指向任務(wù)的指針

void*pdata,

//傳遞給任務(wù)的參數(shù)

OS_STK*ptos,

//任務(wù)堆棧棧頂?shù)闹羔?/p>

INT8Uprio

//任務(wù)的優(yōu)先級別

)第三十五頁,共一百一十五頁,2022年,8月28日35OSTaskCreate()函數(shù)使用舉例:定義任務(wù)task_Avoidtask_A(void*pdata){……;

//任務(wù)初始化部分

while(1){……;//任務(wù)功能代碼

}}在系統(tǒng)“創(chuàng)建”任務(wù)task_Avoidmain(void){OSInit();//系統(tǒng)初始化部分

……

OSTaskCreate(task_A,void*0,&MystackTop,8);OSStart();}第三十六頁,共一百一十五頁,2022年,8月28日36任務(wù)的基本概念系統(tǒng)任務(wù)空閑任務(wù)(OSTaskIdel())統(tǒng)計任務(wù)(OSTaskStat())原型:voidOSTaskIdel(void*pdata)原型:voidOSTaskStat(void*pdata)第三十七頁,共一百一十五頁,2022年,8月28日37

空閑任務(wù)(OSTaskIdel())使用說明:

1、uC/OS-II規(guī)定用戶程序中必須使用OSTaskIdel。

2、該任務(wù)不能用軟件刪除。

3、該任務(wù)是uC/OS-II初始化時自動創(chuàng)建,其任務(wù)優(yōu)先 級固定為最低級,用戶也可修改該任務(wù)的業(yè)務(wù)。

4、目的----使CPU在沒有用戶任務(wù)可執(zhí)行時也有事可 做。第三十八頁,共一百一十五頁,2022年,8月28日38

統(tǒng)計任務(wù)(OSTaskStat())使用說明:

1、功能完成用戶任務(wù)CPU使用率的統(tǒng)計,結(jié)果以百分 比的形式存放在變量OSCPUsage

中。

2、該任務(wù)用戶可選擇使用。OS_CFG.H文件中的常數(shù) OS_TASK_STAT_EN設(shè)置為1,使能該函數(shù)。

3、用戶在OS_CFG.H中使能該任務(wù)后,系統(tǒng)自動創(chuàng)建 該任務(wù),但在用戶使用統(tǒng)計數(shù)據(jù)前必須調(diào)用系統(tǒng) 函數(shù)OSStatInit()先進行初始化。

4、該任務(wù)固定擁有次末任務(wù)優(yōu)先級。第三十九頁,共一百一十五頁,2022年,8月28日39任務(wù)的優(yōu)先權(quán)和優(yōu)先級別uC/OS-II的每個任務(wù)都必須有唯一的優(yōu)先級。uC/OS-II最多可以管理64個優(yōu)先級別分配給64個任務(wù)。uC/OS-II中用一個8b的整型數(shù)來表示優(yōu)先級別,數(shù)字越小,優(yōu)先級越高,prio=0的任務(wù)優(yōu)先級最高。uC/OS-II中使用任務(wù)的優(yōu)先級(prio)作為任務(wù)句柄。用戶通過修改OS_CFG.H中的宏定義常數(shù)OS_LOWEST_PRIO的值,約定本用戶系統(tǒng)的最大優(yōu)先級數(shù)。第四十頁,共一百一十五頁,2022年,8月28日40任務(wù)堆棧堆棧----FIFO訪問原則組織的連續(xù)存儲器。任務(wù)堆棧在uC/OS-II中的應(yīng)用:任務(wù)堆棧是任務(wù)的三大組成部分之一。保存CPU寄存器現(xiàn)場(R0~R12、LR、SPSR等)。本Task的私有數(shù)據(jù)。第四十一頁,共一百一十五頁,2022年,8月28日41任務(wù)堆棧的創(chuàng)建-----在創(chuàng)建任務(wù)的同時,任務(wù)堆棧即被創(chuàng)建。舉例:#defineMyTaskStkSize64OS_STKMyTaskStk[MyTaskStkSize]//在OS_CPU.H中定義OS_STK…… //typedefINT32UOS_STKINT8UOSTaskCreate( void(*task)(void*pd),//指向任務(wù)的指針

void*pdata, //傳遞給任務(wù)的參數(shù)

MyTaskStk[MyTaskStkSize-1]

//任務(wù)堆棧棧頂?shù)闹羔?/p>

INT8Uprio //任務(wù)的優(yōu)先級別

)第四十二頁,共一百一十五頁,2022年,8月28日42任務(wù)堆棧的使用注意事項__存在兩種堆棧形式遞增堆棧----進棧操作向大地址方向發(fā)展。遞減堆棧----進棧操作向小地址方向發(fā)展。OSTaskCreate( ……

&MyTaskStk[StkSize-1], …… )OSTaskCreate( ……

&MyTaskStk[0], …… )備注:利用條件編譯技術(shù)和OS_CPU.H中的宏定義常數(shù)OS_STK_GROWTH編寫易移植用戶系統(tǒng);“1”---遞減堆棧forARMCPU。第四十三頁,共一百一十五頁,2022年,8月28日43任務(wù)完成后的自我刪除當任務(wù)完成后,任務(wù)可以自我刪除任務(wù)代碼并非真的刪除了,系統(tǒng)只是簡單地不再理會這個任務(wù)這個任務(wù)的代碼也不會再運行了,即使任務(wù)調(diào)用了OSTaskDel(),這個任務(wù)也絕不會返回voidYourTask(void*pdata){/*用戶代碼*/OSTaskDel(OS_PRIO_SELF);}第四十四頁,共一百一十五頁,2022年,8月28日44任務(wù)狀態(tài)在任一給定的時刻,任務(wù)的狀態(tài)一定是以下五種狀態(tài)之一:睡眠態(tài)(taskdormant)就緒態(tài)(taskready)運行態(tài)(taskrunning)等待狀態(tài)(taskwaiting)中斷服務(wù)態(tài)(ISRrunning)第四十五頁,共一百一十五頁,2022年,8月28日45睡眠態(tài)(taskdormant)指任務(wù)駐留在程序空間(ROM或RAM),還沒有交給系統(tǒng)來管理的狀態(tài)任務(wù)交給系統(tǒng)通過調(diào)用以下函數(shù)之一來實現(xiàn):OSTaskCreate()OSTaskCreateExt()告知系統(tǒng):任務(wù)的起始地址任務(wù)建立時,用戶給任務(wù)賦予的優(yōu)先級任務(wù)要使用的??臻g大小等第四十六頁,共一百一十五頁,2022年,8月28日46就緒態(tài)(taskready)任務(wù)一旦創(chuàng)建就進入就緒態(tài),準備運行任務(wù)的創(chuàng)建可以是在多任務(wù)開始之前,也可以動態(tài)地由一個運行著的任務(wù)創(chuàng)建若剛創(chuàng)建任務(wù)的優(yōu)先級高于創(chuàng)建它的任務(wù)的優(yōu)先級,它將立即獲得cpu的使用權(quán)任務(wù)可通過OSTaskDel()返回睡眠態(tài);或調(diào)用該函數(shù)讓另一個任務(wù)進入睡眠態(tài)第四十七頁,共一百一十五頁,2022年,8月28日47運行態(tài)(taskrunning)就緒的任務(wù)只有當所有優(yōu)先級高于它的任務(wù)都轉(zhuǎn)為等待狀態(tài),或被刪除后,才能進入運行態(tài)任何時刻只有一個任務(wù)處于運行態(tài)調(diào)用OSStart()可以啟動多任務(wù)。該函數(shù)只能在啟動時調(diào)用一次OSStart()運行用戶初始化代碼中已經(jīng)建立的、進入就緒態(tài)的優(yōu)先級最高的任務(wù)第四十八頁,共一百一十五頁,2022年,8月28日48等待狀態(tài)(taskwaiting)正在運行的任務(wù)可以通過下面的調(diào)用進入等待狀態(tài)。延遲時間到,立即強制執(zhí)行任務(wù)切換,讓下一個優(yōu)先級最高、并進入就緒態(tài)的任務(wù)執(zhí)行。OSTimeDly()OSTimeDlyHMSM()等待時間過去后,系統(tǒng)服務(wù)(內(nèi)部)函數(shù)OSTimeTick()使延遲了的任務(wù)進入就緒態(tài)用戶無需在應(yīng)用程序代碼中調(diào)用這個函數(shù)第四十九頁,共一百一十五頁,2022年,8月28日49等待狀態(tài)(續(xù))正在運行的任務(wù)可能需要通過調(diào)用函數(shù)等待某一事件發(fā)生。如果該事件并未發(fā)生,任務(wù)就進入等待狀態(tài)OSFlagPend();OSMutexPend()OSSemPend();OSMboxPend()當事件發(fā)生或等待超時,被掛起的任務(wù)就進入就緒態(tài)第五十頁,共一百一十五頁,2022年,8月28日50中斷服務(wù)態(tài)(ISRrunning)正在執(zhí)行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)閉,或系統(tǒng)將中斷關(guān)閉。被中斷的任務(wù)便進入了中斷服務(wù)態(tài)響應(yīng)中斷后,正在運行的任務(wù)被掛起,中斷服務(wù)子程序控制了CPU的使用權(quán)第五十一頁,共一百一十五頁,2022年,8月28日51中斷服務(wù)態(tài)(ISRrunning)中斷服務(wù)子程序可能會報告一個或多個事件的發(fā)生,而使一個或多個任務(wù)進入就緒態(tài)上述情況下,從中斷服務(wù)子程序返回之前,C/OS

–II

要判定:被中斷的任務(wù)是否還是就緒態(tài)任務(wù)中優(yōu)先級最高的如果中斷服務(wù)子程序使另一個優(yōu)先級更高的任務(wù)進入了就緒態(tài),則新進入就緒態(tài)的這個優(yōu)先級更高的任務(wù)將得以運行;否則,原來被中斷了的任務(wù)將繼續(xù)運行。第五十二頁,共一百一十五頁,2022年,8月28日52任務(wù)狀態(tài)當所有的任務(wù)都在等待時間發(fā)生或等待延遲時間結(jié)束時,C/OS

–II執(zhí)行被稱為空閑任務(wù)(IdleTask)的內(nèi)部函數(shù),即:OSTaskIdle()第五十三頁,共一百一十五頁,2022年,8月28日53任務(wù)狀態(tài)任務(wù)的CPU使用權(quán)被剝奪中斷恢復(fù)任務(wù)第五十四頁,共一百一十五頁,2022年,8月28日54任務(wù)控制塊(TCB)任務(wù)控制塊OS_TCB是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針、狀態(tài)、優(yōu)先級、任務(wù)表位置、任務(wù)鏈表指針等所有的任務(wù)控制塊分為兩條鏈表:空閑鏈表使用鏈表當任務(wù)的CPU使用權(quán)被剝奪時,系統(tǒng)用它來保存該任務(wù)的狀態(tài)全部駐留在RAM中空任務(wù)控制塊鏈表----未被分配的TCB鏈OSTCBFreeList。任務(wù)控制塊鏈表----已分配的TCB鏈OSTCBList。第五十五頁,共一百一十五頁,2022年,8月28日55

μC/OS-II任務(wù)控制塊.typedefstructos_tcb{OS_STK*OSTCBStkPtr(當前任務(wù)堆棧棧頂指針);#ifOS_TASK_CREATE_EXT_EN>0void*OSTCBExtPtr;(指向用戶定義的任務(wù)控制塊擴展)

OS_STK*OSTCBStkBottom;(指向任務(wù)堆棧棧底指針)INT32UOSTCBStkSize;(存有棧中可容納的指針元數(shù)目)INT16UOSTCBOpt;INT16UOSTCBId;(存儲任務(wù)的識別碼ID,備用)#endifstructos_tcb*OSTCBNext;(任務(wù)控制塊OS-TCB雙向鏈表的后鏈接)structos_tcb*OSTCBPrev;(任務(wù)控制塊OS-TCB雙向鏈表的前鏈接)#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_ENOS_EVENT*OSTCBEventPtr;(指向事件控制塊的指針)#endif第五十六頁,共一百一十五頁,2022年,8月28日56#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_ENvoid*OSTCBMsg;(指向傳遞給任務(wù)的消息的指針)#endifINT16UOSTCBDly;INT8UOSTCBStat;(任務(wù)的狀態(tài)字)INT8UOSTCBPrio;(任務(wù)的優(yōu)先級)INT8UOSTCBX;INT8UOSTCBY;INT8UOSTCBBitX;INT8UOSTCBBitY;#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;#endif}OS_TCB;第五十七頁,共一百一十五頁,2022年,8月28日57任務(wù)控制塊及任務(wù)控制塊鏈表任務(wù)控制塊鏈表

空任務(wù)塊鏈表是在uC/OS-II初始化(OSInit())時系統(tǒng)自建的,用戶可依據(jù)目標系統(tǒng)的實際需求,設(shè)定其鏈表長度。OS_CFG.H文件中的宏常數(shù)OS_MAX_TASKS----用于定義最大用戶任務(wù)數(shù)。UCOS_II.H文件中的宏常數(shù)OS_N_SYS_TASKS----用于約定系統(tǒng)任務(wù)數(shù),其值固定為2。當應(yīng)用程序調(diào)用函數(shù)OSTaskCreate()創(chuàng)建一個任務(wù)時,這個函數(shù)會調(diào)用系統(tǒng)函數(shù)OSTCBInit()來為任務(wù)控制塊進行初始化。這個函數(shù)首先為被創(chuàng)建任務(wù)從空任務(wù)控制塊鏈表獲取一個任務(wù)控制塊,然后用任務(wù)的屬性對任務(wù)控制塊各個成員進行賦值,最后再把這個任務(wù)控制塊鏈入到任務(wù)控制塊鏈表的頭部。

當進行系統(tǒng)初始化時,初始化函數(shù)會按用戶提供的任務(wù)數(shù)為系統(tǒng)創(chuàng)建具有相應(yīng)數(shù)量的任務(wù)控制塊并把它們鏈接為一個鏈表。由于這些任務(wù)控制塊還沒有對應(yīng)的任務(wù),故這個鏈表叫做空任務(wù)塊鏈表。即相當于是一些空白的身份證。第五十八頁,共一百一十五頁,2022年,8月28日58空任務(wù)列表所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組OSTCBTbl[]中系統(tǒng)初始化時,所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表任務(wù)建立后,空任務(wù)控制塊指針OSTCBFreeList指向的任務(wù)控制塊就賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向鏈表中的下一個空任務(wù)控制塊任務(wù)一旦被刪除,任務(wù)控制塊就還給空任務(wù)鏈表第五十九頁,共一百一十五頁,2022年,8月28日59uC/OS-II中提供了系統(tǒng)函數(shù)OSTaskDel(),用于刪除一個任務(wù)----實質(zhì)就是將該任務(wù)的TCB從“任務(wù)控制塊列表”移到了“空任務(wù)控制塊列表”。任務(wù)控制塊及任務(wù)控制塊鏈表《任務(wù)控制塊》就相當于是一個任務(wù)的身份證,沒有任務(wù)控制塊的任務(wù)是不能被系統(tǒng)承認和管理。

任務(wù)控制塊鏈表第六十頁,共一百一十五頁,2022年,8月28日60第六十一頁,共一百一十五頁,2022年,8月28日61任務(wù)控制塊及任務(wù)控制塊鏈表任務(wù)控制塊鏈表其他相關(guān)系統(tǒng)管理變量OSTCBPrioTbl[]

:OS_TCB*數(shù)據(jù)類型的數(shù)組,以Prio為下標存放已使能的TCB指針。用于加速TCB的訪問。OSTCBCur:全局系統(tǒng)變量,指向當前正在運行的任務(wù)的TCB。OSTCBFreeList、OSTCBListOSTCBTbl[]----OSInit()建立的任務(wù)控制塊數(shù)組OSTCBPrioTbl[]----任務(wù)控制塊優(yōu)先級數(shù)組OSTCBCur第六十二頁,共一百一十五頁,2022年,8月28日62任務(wù)控制塊鏈表空任務(wù)控制塊鏈表第六十三頁,共一百一十五頁,2022年,8月28日63任務(wù)級的任務(wù)調(diào)度--OSSchedC/OS是占先式實時多任務(wù)內(nèi)核,優(yōu)先級最高的任務(wù)一旦準備就緒,則擁有CPU的所有權(quán)即開始投入運行。C/OS中不支持時間片輪轉(zhuǎn)法,每個任務(wù)的優(yōu)先級要求不一樣且是唯一的。因此,任務(wù)調(diào)度就是:查找準備就緒的最高優(yōu)先級的任務(wù)并進行上下文切換。C/OS任務(wù)調(diào)度所花的時間為常數(shù),與應(yīng)用程序中建立的任務(wù)數(shù)無關(guān)。第六十四頁,共一百一十五頁,2022年,8月28日64就緒表根據(jù)就緒表確定最高優(yōu)先級兩個關(guān)鍵:優(yōu)先級數(shù)分解為高三位和低三位分別確定高優(yōu)先級有著小的優(yōu)先級號

第六十五頁,共一百一十五頁,2022年,8月28日65根據(jù)優(yōu)先級找到任務(wù)在就緒任務(wù)表中的位置每個就緒的任務(wù)都放入就緒表中(readylist)中,就緒表用兩個變量表示:OSRdyGrp、OSRdyTbl[]OSRdyGrp1207654300XXXYYY任務(wù)優(yōu)先級2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY優(yōu)先級最低任務(wù)(空閑任務(wù))優(yōu)先級最高任務(wù)任務(wù)優(yōu)先級號00001100001010011221第六十六頁,共一百一十五頁,2022年,8月28日66采用查表法確定高優(yōu)先級任務(wù)

查表法具有確定的時間,增加了系統(tǒng)的可預(yù)測性,C/OS

–II中所有的系統(tǒng)調(diào)用時間都是確定的High3=OSUnMapTbl[OSRdyGrp];Low3=OSUnMapTbl[OSRdyTbl[High3]];Prio=(High3<<3)+Low3;OSRdyGrp1207654300XXXYYY任務(wù)優(yōu)先級2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY第六十七頁,共一百一十五頁,2022年,8月28日67TaskschedulervoidOSSched(void){INT8Uy;OS_ENTER_CRITICAL();(禁止中斷的宏)

if((OSLockNesting=0)&&(OSIntNesting=0))(如果調(diào)用來自中斷服務(wù)程序,或者至少調(diào)用了一次給任務(wù)調(diào)度上鎖函數(shù),任務(wù)調(diào)度函數(shù)將退出,不做調(diào)度){ y=OSUnMapTbl[OSRdyGrp];(否則,調(diào)度找出進入就緒態(tài)且優(yōu)先級最高的任務(wù),就緒任務(wù)表相應(yīng)的位置位) OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]])if(OSPrioHighRdy!=OSPrioCur){(優(yōu)先級最高的任務(wù)是否是當前正在運行的任務(wù),若是不調(diào)度) OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];(若不是,為了實現(xiàn)任務(wù)切換,指向優(yōu)先級最高的任務(wù)控制塊) OSCtxSwCtr++;(統(tǒng)計計數(shù),跟蹤任務(wù)切換次數(shù))

OS_TASK_SW();(任務(wù)切換)

}}OS_EXIT_CRITICAL();(開放中斷的宏)

}第六十八頁,共一百一十五頁,2022年,8月28日68voidOSSchedLock(void){if(OSRunning==TRUE){OS_ENTER_CRITICAL();if(OSLockNesting<255){OSLockNesting++;}OS_EXIT_CRITICAL();}}給調(diào)度器上鎖第六十九頁,共一百一十五頁,2022年,8月28日69給調(diào)度器開鎖voidOSSchedUnlock(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();}}}第七十頁,共一百一十五頁,2022年,8月28日70任務(wù)切換將被掛起的任務(wù)寄存器入棧將較高優(yōu)先級任務(wù)的寄存器出棧第七十一頁,共一百一十五頁,2022年,8月28日71任務(wù)級的任務(wù)切換OS_TASK_SW()OS_TASK_SW()是宏調(diào)用,含有微處理器的軟中斷指令。因為,系統(tǒng)假定任務(wù)切換是靠中斷級代碼完成的。OS_TASK_SW()將處理器相關(guān)的軟件中斷機制封裝起來,便于操作系統(tǒng)移植第七十二頁,共一百一十五頁,2022年,8月28日72調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級任務(wù)

OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務(wù)(切換后運行的任務(wù))

OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R4即將被掛起任務(wù)的棧頂(即將被掛起任務(wù))指向即將運行的任務(wù)的棧頂?shù)谄呤?,共一百一十五頁?022年,8月28日73保存當前CPU寄存器的值低優(yōu)先級任務(wù)

OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務(wù)

OS_TCBOSTCBHighRdy(2)CPU(1)(3)(3)第七十四頁,共一百一十五頁,2022年,8月28日74重新裝入要運行的任務(wù)低優(yōu)先級任務(wù)

OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務(wù)

OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)復(fù)制第七十五頁,共一百一十五頁,2022年,8月28日75任務(wù)切換OS_TASK_SW()的代碼VoidOSCtxSw(void){

將R1,R2,R3及R4推入當前堆棧;

OSTCBCurOSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdyOSTCBSTKPtr;

將R4,R3,R2及R1從新堆棧中彈出;執(zhí)行中斷返回指令;}第七十六頁,共一百一十五頁,2022年,8月28日76C/OS-II中的中斷中斷:由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的事件稱為中斷源。CPU響應(yīng)中斷的條件:至少有一個中斷源向CPU發(fā)出中斷信號;系統(tǒng)允許中斷,且對此中斷信號未予屏蔽中斷類型:硬件中斷外部中斷陷井中斷現(xiàn)場控制量的中斷第七十七頁,共一百一十五頁,2022年,8月28日77C/OS-II中的中斷服務(wù)子程序用戶中斷服務(wù)子程序:保存全部CPU寄存器;調(diào)用OSIntEnter()或OSIntNesting直接加1;

if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}

清中斷源;重新開中斷;執(zhí)行用戶代碼做中斷服務(wù);調(diào)用OSIntExit();

恢復(fù)所有CPU寄存器;執(zhí)行中斷返回指令;第七十八頁,共一百一十五頁,2022年,8月28日78中斷服務(wù)第七十九頁,共一百一十五頁,2022年,8月28日79第八十頁,共一百一十五頁,2022年,8月28日80Searchforhighestpriority–similartoschedulerHalfcontextswitchisdonebyinterruptresponse–i.e.registerssaved第八十一頁,共一百一十五頁,2022年,8月28日81中斷與時鐘節(jié)拍時鐘節(jié)拍(時鐘滴答)Tick,是一種定時器中斷,可通過編程方式實現(xiàn)時鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先32位的整數(shù)OSTime加一。對任務(wù)列表進行掃描,判斷是否有延時任務(wù)應(yīng)該處于準備就緒狀態(tài),最后進行上下文切換。第八十二頁,共一百一十五頁,2022年,8月28日82時鐘節(jié)拍中斷服務(wù)子程序VoidOSTickISR(void){

保存處理器寄存器的值;調(diào)用OSIntEnter(),或是將OSIntNesting加1if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}

調(diào)用OSTimeTick();

發(fā)出中斷設(shè)備的中斷;重新允許中斷(可選用)調(diào)用OSIntExit();

恢復(fù)處理器寄存器的值;執(zhí)行中斷返回指令;}第八十三頁,共一百一十五頁,2022年,8月28日83voidOSTimeTick(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->OSTCBStat&OS_STAT_SUSPEND)){ (4)OSRdyGrp|=ptcb->OSTCBBitY; (5)OSRdyTbl[ptcb->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()第八十四頁,共一百一十五頁,2022年,8月28日84系統(tǒng)總要建立一個空閑任務(wù),該任務(wù)在沒有其它任務(wù)進入就緒狀態(tài)時投入運行空閑任務(wù)永遠設(shè)為最低優(yōu)先級空閑任務(wù)不可能被應(yīng)用軟件刪除voidOSTaskIdle(void*pdata){pdata=pdata;for(;;){OS_ENTER_CRITICAL();OSIdleCtr++;OS_EXIT_CRITICAL();}}空閑任務(wù)OSTaskIdle()第八十五頁,共一百一十五頁,2022年,8月28日85C/OS-II初始化首先調(diào)用系統(tǒng)初始化函數(shù)OSIint()。OSIint()初始化μC/OS-Ⅱ所有的變量和數(shù)據(jù)結(jié)構(gòu)(見OS_CORE.C)。OSInit()建立空閑任務(wù)idletask,這個任務(wù)總是處于就緒態(tài)的??臻e任務(wù)OSTaskIdle()的優(yōu)先級總是設(shè)成最低,即OS_LOWEST_PRIO。如果統(tǒng)計任務(wù)允許OS_TASK_STAT_EN和任務(wù)建立擴展允許都設(shè)為1,則OSInit()還得建立統(tǒng)計任務(wù)OSTaskStat()并且讓其進入就緒態(tài)。OSTaskStat的優(yōu)先級總是設(shè)為OS_LOWEST_PRIO-1空閑和統(tǒng)計任務(wù)的任務(wù)控制塊(OS_TCBs)是用雙向鏈表鏈接在一起的。OSTCBList指向這個鏈表的起始處。當建立一個任務(wù)時,這個任務(wù)總是被放在這個鏈表的起始處。第八十六頁,共一百一十五頁,2022年,8月28日86調(diào)用OSInit()之后的數(shù)據(jù)結(jié)構(gòu)

第八十七頁,共一百一十五頁,2022年,8月28日87空閑緩沖區(qū)第八十八頁,共一百一十五頁,2022年,8月28日88μC/OS-Ⅱ的啟動voidmain(void){OSInit();/*初始化uC/OS-II*/..

通過調(diào)用OSTaskCreate()或OSTaskCreateExt()創(chuàng)建至少一個任務(wù);..OSStart();/*開始多任務(wù)調(diào)度!OSStart()永遠不會返回*/}第八十九頁,共一百一十五頁,2022年,8月28日89啟動多任務(wù)voidOSStart(void){INT8Uy;INT8Ux;if(OSRunning==FALSE){y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];OSPrioHighRdy=(INT8U)((y<<3)+x);OSPrioCur=OSPrioHighRdy;OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSTCBCur=OSTCBHighRdy;OSStartHighRdy(); }}第九十頁,共一百一十五頁,2022年,8月28日90關(guān)于OSStartHighRdy

voidOSStartHighRdy(void){

調(diào)用用戶定義的OSTaskSwHook();OSRunning=TRUE;

得到將要恢復(fù)運行任務(wù)的堆棧指針:

Stackpointer=OSTCBHighRdyOSTCBStkPtr

從新任務(wù)堆棧中恢復(fù)處理器的所有寄存器;執(zhí)行中斷返回指令;}第九十一頁,共一百一十五頁,2022年,8月28日91調(diào)用OSStart()之后的數(shù)據(jù)結(jié)構(gòu)

第九十二頁,共一百一十五頁,2022年,8月28日92主要內(nèi)容嵌入式操作系統(tǒng)C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ任務(wù)通信與同步第九十三頁,共一百一十五頁,2022年,8月28日93建立任務(wù)UseoneoftwoservicesOSTaskCreate()OSTaskCreateExt()第九十四頁,共一百一十五頁,2022年,8月28日94建立任務(wù),OSTaskCreate()INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio){void*psp;INT8Uerr;if(prio>OS_LOWEST_PRIO){(1)return(OS_PRIO_INVALID);}OS_ENTER_CRITICAL();if(OSTCBPrioTbl[prio]==(OS_TCB*)0){ (2)OSTCBPrioTbl[prio]=(OS_TCB*)1;(3)OS_EXIT_CRITICAL();(4)psp=(void*)OSTaskStkInit(task,pdata,ptos,0);err=OSTCBInit(prio,psp,(void*)0,0,0,(void*)0,0);if(err==OS_NO_ERR){ OS_ENTER_CRITICAL();第九十五頁,共一百一十五頁,2022年,8月28日95OSTaskCtr++; OSTaskCreateHook(OSTCBPrioTbl[prio]); OS_EXIT_CRITICAL();if(OSRunning){ OSSched(); }}else{OS_ENTER_CRITICAL();OSTCBPrioTbl[prio]=(OS_TCB*)0; OS_EXIT_CRITICAL();}return(err);}else{OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);}}第九十六頁,共一百一十五頁,2022年,8月28日96堆棧檢驗,OSTaskStkChk()刪除任務(wù),OSTaskDel()請求刪除任務(wù),OSTaskDelReq()改變?nèi)蝿?wù)的優(yōu)先級,OSTaskChangePrio()掛起任務(wù),OSTaskSuspend()恢復(fù)任務(wù),OSTaskResume()其它相關(guān)函數(shù)第九十七頁,共一百一十五頁,2022年,8月28日97主要內(nèi)容嵌入式操作系統(tǒng)C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ任務(wù)通信與同步第九十八頁,共一百一十五頁,2022年,8月28日98時間管理Fiveservices:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()第九十九頁,共一百一十五頁,2022年,8月28日99OSTimeDly()voidOSTimeDly(INT16Uticks){if(ticks>0){OS_ENTER_CRITICAL();if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){OSRdyGrp&=~OSTCBCur->OSTCBBitY;}OSTCBCur->OSTCBDly=ticks;OS_EXIT_CRITICAL();OSSched();}}第一百頁,共一百一十五頁,2022年,8月28日100OSTimeDlyHMSM()第一百零一頁,共一百一十五頁,2022年,8月28日101主要內(nèi)容嵌入式操作系統(tǒng)C/OS-Ⅱ簡介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時間管理C/OS-Ⅱ任務(wù)通信與同步第一百零二頁,共一百一十五頁,2022年,8月28日102任務(wù)間通信手段C/OS中,采用多種方法保護任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL來對臨界資源進行保護OSSchedLock()禁止調(diào)度保護任務(wù)級的共享資源。提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號量、郵箱、消息隊列,事件標志

溫馨提示

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

評論

0/150

提交評論