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

下載本文檔

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

文檔簡(jiǎn)介

2CHAPTER嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-Ⅱ分析1主要內(nèi)容嵌入式操作系統(tǒng)C/OS-Ⅱ簡(jiǎn)介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時(shí)間管理C/OS-Ⅱ任務(wù)通信與同步2為什么需要操作系統(tǒng)3硬件抽象層的引入

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

4

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

6硬件抽象層接口定義和代碼設(shè)計(jì)特點(diǎn)

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

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

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

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

絕大部分

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

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

C/OS-II可以在絕大多數(shù)8位、16位、32位以至64位微處理器、微控制器、數(shù)字信號(hào)處理器(DSP)上運(yùn)行。可固化(ROMable)

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

C/OS-II可以嵌入到用戶(hù)的產(chǎn)品中成為產(chǎn)品的一部分??刹眉簦⊿calable)

可以只使用

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

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

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

C/OS-II所需的存儲(chǔ)器空間(RAM和ROM)。這種可剪裁性是靠條件編譯實(shí)現(xiàn)的。C/OS的性能特點(diǎn)(一)16占先式(Preemptive)多任務(wù)

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

全部

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

每個(gè)任務(wù)有自己?jiǎn)为?dú)的棧,

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

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

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

OS_EXIT_CRITICAL()(啟用中斷的宏)通常成對(duì)出現(xiàn)上述宏定義取決于使用的微處理器。在文件OS_CPU.H有相應(yīng)的宏定義在C/OS-II中,每種微處理器都有自己的OS_CPU.H文件25C/OS-II開(kāi)關(guān)中斷的方法(續(xù)2){..OS_ENTER_CRITICAL();/*C/OS-II臨界段代碼*/

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

27OS_CRITICAL_METHOD==1用最簡(jiǎn)單的方式來(lái)實(shí)現(xiàn)2個(gè)宏調(diào)用用處理器指令關(guān)中斷,完成OS_ENTER_CRITICAL()用開(kāi)中斷指令完成OS_EXIT_CRITICAL()問(wèn)題:如果調(diào)用C/OS-II功能函數(shù)時(shí),中斷是關(guān)掉的,則從C/OS-II函數(shù)返回時(shí),中斷就打開(kāi)了若調(diào)用C/OS-II功能函數(shù)之前已將中斷關(guān)掉,那么用戶(hù)往往希望從C/OS-II函數(shù)返回時(shí),中斷仍然是關(guān)著的。這時(shí),這種方法就不妥當(dāng)。對(duì)特定的處理器,這種辦法是唯一的選擇C/OS-II中采用了3種開(kāi)關(guān)中斷的方法28C/OS-II中采用了3種開(kāi)關(guān)中斷的方法(續(xù)1)OS_CRITICAL_METHOD==2在堆棧中保存中斷的開(kāi)/關(guān)狀態(tài),然后再關(guān)中斷實(shí)現(xiàn)OS_ENTER_CRITICAL()時(shí),先在堆棧中保存中斷的開(kāi)/關(guān)狀態(tài),然后再關(guān)中斷實(shí)現(xiàn)OS_EXIT_CRITICAL()時(shí),從堆棧中彈出原來(lái)中斷的開(kāi)/關(guān)狀態(tài)利用這種機(jī)制,不論用戶(hù)在調(diào)用C/OS-II功能函數(shù)之前中斷是開(kāi)或關(guān),函數(shù)的進(jìn)入和返回狀態(tài)都得到了保護(hù)。即:調(diào)用前中斷的開(kāi)/關(guān)狀態(tài),在調(diào)用之后保持不變29C/OS-II中采用了3種開(kāi)關(guān)中斷的方法(續(xù)2)OS_CRITICAL_METHOD==3把當(dāng)前處理器的狀態(tài)字(PSW)保存在C函數(shù)的局部變量中(如OS_CPU_SR)關(guān)中斷時(shí)保存,開(kāi)中斷時(shí)恢復(fù)30C/OS-II中采用了3種開(kāi)關(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);}31任務(wù)(task)

典型的任務(wù):一個(gè)無(wú)限循環(huán)voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}32TaskStructurevoidYourTask(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ù)代碼*/}}33

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

OSTaskCreate(MyTask1,……);

OSTaskCreate(MyTask2,……);……OSStart();……}35OSTaskCreate()函數(shù)原型:

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

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

void*pdata,

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

OS_STK*ptos,

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

INT8Uprio

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

)36OSTaskCreate()函數(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();}37任務(wù)的基本概念系統(tǒng)任務(wù)空閑任務(wù)(OSTaskIdel())統(tǒng)計(jì)任務(wù)(OSTaskStat())原型:voidOSTaskIdel(void*pdata)原型:voidOSTaskStat(void*pdata)38空閑任務(wù)(OSTaskIdel())使用說(shuō)明:

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

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

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

4、目的----使CPU在沒(méi)有用戶(hù)任務(wù)可執(zhí)行時(shí)也有事可 做。39統(tǒng)計(jì)任務(wù)(OSTaskStat())使用說(shuō)明:

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

中。

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

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

4、該任務(wù)固定擁有次末任務(wù)優(yōu)先級(jí)。40任務(wù)的優(yōu)先權(quán)和優(yōu)先級(jí)別uC/OS-II的每個(gè)任務(wù)都必須有唯一的優(yōu)先級(jí)。uC/OS-II最多可以管理64個(gè)優(yōu)先級(jí)別分配給64個(gè)任務(wù)。uC/OS-II中用一個(gè)8b的整型數(shù)來(lái)表示優(yōu)先級(jí)別,數(shù)字越小,優(yōu)先級(jí)越高,prio=0的任務(wù)優(yōu)先級(jí)最高。uC/OS-II中使用任務(wù)的優(yōu)先級(jí)(prio)作為任務(wù)句柄。用戶(hù)通過(guò)修改OS_CFG.H中的宏定義常數(shù)OS_LOWEST_PRIO的值,約定本用戶(hù)系統(tǒng)的最大優(yōu)先級(jí)數(shù)。41任務(wù)堆棧堆棧----FIFO訪問(wèn)原則組織的連續(xù)存儲(chǔ)器。任務(wù)堆棧在uC/OS-II中的應(yīng)用:任務(wù)堆棧是任務(wù)的三大組成部分之一。保存CPU寄存器現(xiàn)場(chǎng)(R0~R12、LR、SPSR等)。本Task的私有數(shù)據(jù)。42任務(wù)堆棧的創(chuàng)建-----在創(chuàng)建任務(wù)的同時(shí),任務(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ù)闹羔? INT8Uprio //任務(wù)的優(yōu)先級(jí)別 )43任務(wù)堆棧的使用注意事項(xiàng)__存在兩種堆棧形式遞增堆棧----進(jìn)棧操作向大地址方向發(fā)展。遞減堆棧----進(jìn)棧操作向小地址方向發(fā)展。OSTaskCreate( ……

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

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

要判定:被中斷的任務(wù)是否還是就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的如果中斷服務(wù)子程序使另一個(gè)優(yōu)先級(jí)更高的任務(wù)進(jìn)入了就緒態(tài),則新進(jìn)入就緒態(tài)的這個(gè)優(yōu)先級(jí)更高的任務(wù)將得以運(yùn)行;否則,原來(lái)被中斷了的任務(wù)將繼續(xù)運(yùn)行。53任務(wù)狀態(tài)當(dāng)所有的任務(wù)都在等待時(shí)間發(fā)生或等待延遲時(shí)間結(jié)束時(shí),C/OS–II執(zhí)行被稱(chēng)為空閑任務(wù)(IdleTask)的內(nèi)部函數(shù),即:OSTaskIdle()54任務(wù)狀態(tài)任務(wù)的CPU使用權(quán)被剝奪中斷恢復(fù)任務(wù)55任務(wù)控制塊(TCB)任務(wù)控制塊OS_TCB是一個(gè)數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針、狀態(tài)、優(yōu)先級(jí)、任務(wù)表位置、任務(wù)鏈表指針等所有的任務(wù)控制塊分為兩條鏈表:空閑鏈表使用鏈表當(dāng)任務(wù)的CPU使用權(quán)被剝奪時(shí),系統(tǒng)用它來(lái)保存該任務(wù)的狀態(tài)全部駐留在RAM中空任務(wù)控制塊鏈表----未被分配的TCB鏈OSTCBFreeList。任務(wù)控制塊鏈表----已分配的TCB鏈OSTCBList。56

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

OS_STK*OSTCBStkBottom;(指向任務(wù)堆棧棧底指針)INT32UOSTCBStkSize;(存有棧中可容納的指針元數(shù)目)INT16UOSTCBOpt;INT16UOSTCBId;(存儲(chǔ)任務(wù)的識(shí)別碼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;(指向事件控制塊的指針)#endif57#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_ENvoid*OSTCBMsg;(指向傳遞給任務(wù)的消息的指針)#endifINT16UOSTCBDly;INT8UOSTCBStat;(任務(wù)的狀態(tài)字)INT8UOSTCBPrio;(任務(wù)的優(yōu)先級(jí))INT8UOSTCBX;INT8UOSTCBY;INT8UOSTCBBitX;INT8UOSTCBBitY;#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;#endif}OS_TCB;58任務(wù)控制塊及任務(wù)控制塊鏈表任務(wù)控制塊鏈表空任務(wù)塊鏈表是在uC/OS-II初始化(OSInit())時(shí)系統(tǒng)自建的,用戶(hù)可依據(jù)目標(biāo)系統(tǒng)的實(shí)際需求,設(shè)定其鏈表長(zhǎng)度。OS_CFG.H文件中的宏常數(shù)OS_MAX_TASKS----用于定義最大用戶(hù)任務(wù)數(shù)。UCOS_II.H文件中的宏常數(shù)OS_N_SYS_TASKS----用于約定系統(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ù)控制塊,然后用任務(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)于是一些空白的身份證。59空任務(wù)列表所有的任務(wù)控制塊都被放置在任務(wù)控制塊列表數(shù)組OSTCBTbl[]中系統(tǒng)初始化時(shí),所有任務(wù)控制塊被鏈接成空任務(wù)控制塊的單向鏈表任務(wù)建立后,空任務(wù)控制塊指針OSTCBFreeList指向的任務(wù)控制塊就賦給了該任務(wù),然后OSTCBFreeList的值調(diào)整為指向鏈表中的下一個(gè)空任務(wù)控制塊任務(wù)一旦被刪除,任務(wù)控制塊就還給空任務(wù)鏈表60uC/OS-II中提供了系統(tǒng)函數(shù)OSTaskDel(),用于刪除一個(gè)任務(wù)----實(shí)質(zhì)就是將該任務(wù)的TCB從“任務(wù)控制塊列表”移到了“空任務(wù)控制塊列表”。任務(wù)控制塊及任務(wù)控制塊鏈表《任務(wù)控制塊》就相當(dāng)于是一個(gè)任務(wù)的身份證,沒(méi)有任務(wù)控制塊的任務(wù)是不能被系統(tǒng)承認(rèn)和管理。

任務(wù)控制塊鏈表6162任務(wù)控制塊及任務(wù)控制塊鏈表任務(wù)控制塊鏈表其他相關(guān)系統(tǒng)管理變量OSTCBPrioTbl[]

:OS_TCB*數(shù)據(jù)類(lèi)型的數(shù)組,以Prio

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

66根據(jù)優(yōu)先級(jí)找到任務(wù)在就緒任務(wù)表中的位置每個(gè)就緒的任務(wù)都放入就緒表中(readylist)中,就緒表用兩個(gè)變量表示:OSRdyGrp、OSRdyTbl[]OSRdyGrp1207654300XXXYYY任務(wù)優(yōu)先級(jí)2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY優(yōu)先級(jí)最低任務(wù)(空閑任務(wù))優(yōu)先級(jí)最高任務(wù)任務(wù)優(yōu)先級(jí)號(hào)0000110000101001122167采用查表法確定高優(yōu)先級(jí)任務(wù)

查表法具有確定的時(shí)間,增加了系統(tǒng)的可預(yù)測(cè)性,C/OS–II中所有的系統(tǒng)調(diào)用時(shí)間都是確定的High3=OSUnMapTbl[OSRdyGrp];Low3=OSUnMapTbl[OSRdyTbl[High3]];Prio=(High3<<3)+Low3;OSRdyGrp1207654300XXXYYY任務(wù)優(yōu)先級(jí)2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[7]XY68TaskschedulervoidOSSched(void){INT8Uy;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=OSUnMapTbl[OSRdyGrp];(否則,調(diào)度找出進(jìn)入就緒態(tài)且優(yōu)先級(jí)最高的任務(wù),就緒任務(wù)表相應(yīng)的位置位) OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]])if(OSPrioHighRdy!=OSPrioCur){(優(yōu)先級(jí)最高的任務(wù)是否是當(dāng)前正在運(yùn)行的任務(wù),若是不調(diào)度) OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];(若不是,為了實(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)放中斷的宏)

}69voidOSSchedLock(void){if(OSRunning==TRUE){OS_ENTER_CRITICAL();if(OSLockNesting<255){OSLockNesting++;}OS_EXIT_CRITICAL();}}給調(diào)度器上鎖70給調(diào)度器開(kāi)鎖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();}}}71任務(wù)切換將被掛起的任務(wù)寄存器入棧將較高優(yōu)先級(jí)任務(wù)的寄存器出棧72任務(wù)級(jí)的任務(wù)切換OS_TASK_SW()OS_TASK_SW()是宏調(diào)用,含有微處理器的軟中斷指令。因?yàn)椋到y(tǒng)假定任務(wù)切換是靠中斷級(jí)代碼完成的。OS_TASK_SW()將處理器相關(guān)的軟件中斷機(jī)制封裝起來(lái),便于操作系統(tǒng)移植73調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級(jí)任務(wù)OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級(jí)任務(wù)(切換后運(yùn)行的任務(wù))OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R4即將被掛起任務(wù)的棧頂(即將被掛起任務(wù))指向即將運(yùn)行的任務(wù)的棧頂74保存當(dāng)前CPU寄存器的值低優(yōu)先級(jí)任務(wù)OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級(jí)任務(wù)OS_TCBOSTCBHighRdy(2)CPU(1)(3)(3)75重新裝入要運(yùn)行的任務(wù)低優(yōu)先級(jí)任務(wù)OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級(jí)任務(wù)OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)復(fù)制76任務(wù)切換OS_TASK_SW()的代碼VoidOSCtxSw(void){將R1,R2,R3及R4推入當(dāng)前堆棧;OSTCBCurOSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdyOSTCBSTKPtr;將R4,R3,R2及R1從新堆棧中彈出;執(zhí)行中斷返回指令;}77C/OS-II中的中斷中斷:由于某種事件的發(fā)生,而導(dǎo)致程序流程的改變。產(chǎn)生中斷的事件稱(chēng)為中斷源。CPU響應(yīng)中斷的條件:至少有一個(gè)中斷源向CPU發(fā)出中斷信號(hào);系統(tǒng)允許中斷,且對(duì)此中斷信號(hào)未予屏蔽中斷類(lèi)型:硬件中斷外部中斷陷井中斷現(xiàn)場(chǎng)控制量的中斷78C/OS-II中的中斷服務(wù)子程序用戶(hù)中斷服務(wù)子程序:保存全部CPU寄存器;調(diào)用OSIntEnter()或OSIntNesting直接加1;if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}清中斷源;重新開(kāi)中斷;執(zhí)行用戶(hù)代碼做中斷服務(wù);調(diào)用OSIntExit();恢復(fù)所有CPU寄存器;執(zhí)行中斷返回指令;79中斷服務(wù)8081Searchforhighestpriority–similartoschedulerHalfcontextswitchisdonebyinterruptresponse–i.e.registerssaved82中斷與時(shí)鐘節(jié)拍時(shí)鐘節(jié)拍(時(shí)鐘滴答)Tick,是一種定時(shí)器中斷,可通過(guò)編程方式實(shí)現(xiàn)時(shí)鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。首先32位的整數(shù)OSTime加一。對(duì)任務(wù)列表進(jìn)行掃描,判斷是否有延時(shí)任務(wù)應(yīng)該處于準(zhǔn)備就緒狀態(tài),最后進(jìn)行上下文切換。83時(shí)鐘節(jié)拍中斷服務(wù)子程序VoidOSTickISR(void){保存處理器寄存器的值;調(diào)用OSIntEnter(),或是將OSIntNesting加1if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;}調(diào)用OSTimeTick();發(fā)出中斷設(shè)備的中斷;重新允許中斷(可選用)調(diào)用OSIntExit();恢復(fù)處理器寄存器的值;執(zhí)行中斷返回指令;}84voidOSTimeTick(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();}時(shí)鐘節(jié)拍函數(shù)OSTimeTick()85系統(tǒng)總要建立一個(gè)空閑任務(wù),該任務(wù)在沒(méi)有其它任務(wù)進(jìn)入就緒狀態(tài)時(shí)投入運(yùn)行空閑任務(wù)永遠(yuǎn)設(shè)為最低優(yōu)先級(jí)空閑任務(wù)不可能被應(yīng)用軟件刪除voidOSTaskIdle(void*pdata){pdata=pdata;for(;;){OS_ENTER_CRITICAL();OSIdleCtr++;OS_EXIT_CRITICAL();}}空閑任務(wù)OSTaskIdle()86C/OS-II初始化首先調(diào)用系統(tǒng)初始化函數(shù)OSIint()。OSIint()初始化μC/OS-Ⅱ所有的變量和數(shù)據(jù)結(jié)構(gòu)(見(jiàn)OS_CORE.C)。OSInit()建立空閑任務(wù)idletask,這個(gè)任務(wù)總是處于就緒態(tài)的??臻e任務(wù)OSTaskIdle()的優(yōu)先級(jí)總是設(shè)成最低,即OS_LOWEST_PRIO。如果統(tǒng)計(jì)任務(wù)允許OS_TASK_STAT_EN和任務(wù)建立擴(kuò)展允許都設(shè)為1,則OSInit()還得建立統(tǒng)計(jì)任務(wù)OSTaskStat()并且讓其進(jìn)入就緒態(tài)。OSTaskStat的優(yōu)先級(jí)總是設(shè)為OS_LOWEST_PRIO-1空閑和統(tǒng)計(jì)任務(wù)的任務(wù)控制塊(OS_TCBs)是用雙向鏈表鏈接在一起的。OSTCBList指向這個(gè)鏈表的起始處。當(dāng)建立一個(gè)任務(wù)時(shí),這個(gè)任務(wù)總是被放在這個(gè)鏈表的起始處。87調(diào)用OSInit()之后的數(shù)據(jù)結(jié)構(gòu)

88空閑緩沖區(qū)89μC/OS-Ⅱ的啟動(dòng)voidmain(void){OSInit();/*初始化uC/OS-II*/..通過(guò)調(diào)用OSTaskCreate()或OSTaskCreateExt()創(chuàng)建至少一個(gè)任務(wù);..OSStart();/*開(kāi)始多任務(wù)調(diào)度!OSStart()永遠(yuǎn)不會(huì)返回*/}90啟動(dòng)多任務(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(); }}91關(guān)于OSStartHighRdy

voidOSStartHighRdy(void){調(diào)用用戶(hù)定義的OSTaskSwHook();OSRunning=TRUE;得到將要恢復(fù)運(yùn)行任務(wù)的堆棧指針:Stackpointer=OSTCBHighRdyOSTCBStkPtr從新任務(wù)堆棧中恢復(fù)處理器的所有寄存器;執(zhí)行中斷返回指令;}92調(diào)用OSStart()之后的數(shù)據(jù)結(jié)構(gòu)

93主要內(nèi)容嵌入式操作系統(tǒng)C/OS-Ⅱ簡(jiǎn)介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時(shí)間管理C/OS-Ⅱ任務(wù)通信與同步94建立任務(wù)UseoneoftwoservicesOSTaskCreate()OSTaskCreateExt()95建立任務(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();96OSTaskCtr++; 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);}}97堆棧檢驗(yàn),OSTaskStkChk()刪除任務(wù),OSTaskDel()請(qǐng)求刪除任務(wù),OSTaskDelReq()改變?nèi)蝿?wù)的優(yōu)先級(jí),OSTaskChangePrio()掛起任務(wù),OSTaskSuspend()恢復(fù)任務(wù),OSTaskResume()

其它相關(guān)函數(shù)98主要內(nèi)容嵌入式操作系統(tǒng)C/OS-Ⅱ簡(jiǎn)介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時(shí)間管理C/OS-Ⅱ任務(wù)通信與同步99時(shí)間管理Fiveservices:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()100OSTimeDly()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();}}101OSTimeDlyHMSM()102主要內(nèi)容嵌入式操作系統(tǒng)C/OS-Ⅱ簡(jiǎn)介C/OS-Ⅱ內(nèi)核結(jié)構(gòu)C/OS-Ⅱ任務(wù)管理C/OS-Ⅱ時(shí)間管理C/OS-Ⅱ任務(wù)通信與同步103任務(wù)間通信手段C/OS中,采用多種方法保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL來(lái)對(duì)臨界資源進(jìn)行保護(hù)OSSchedLock()禁止調(diào)度保護(hù)任務(wù)級(jí)的共享資源。提供了經(jīng)典操作系統(tǒng)任務(wù)間通信方法:信號(hào)量、郵箱、消息隊(duì)列,事件標(biāo)志。104事件控制塊ECB

程序4.5ECB的結(jié)構(gòu)如下-----------------------

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論