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

下載本文檔

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

文檔簡介

ARM原理及應(yīng)用第五講

實時操作系統(tǒng)C/OS-Ⅱ分析嵌入式實時操作系統(tǒng)分析詳解ppt課件實時操作系統(tǒng)

C/OS-II1324

C/OS-II概述任務(wù)管理中斷和時間管理任務(wù)之間的通信與同步5存儲管理實時操作系統(tǒng)C/OS-II1324C/OS-II概述任務(wù)通用操作系統(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)核、中間件);通用操作系統(tǒng)和嵌入式(實時)操作系統(tǒng)通用操作系統(tǒng):Windo嵌入式操作系統(tǒng)特點:可裝卸性。開放性、可伸縮性的體系結(jié)構(gòu)。強實時性。EOS實時性一般較強,可用于各種設(shè)備控制當中。統(tǒng)一的接口。提供各種設(shè)備驅(qū)動接口。操作方便、簡單、提供友好的圖形GUI,圖形界面,追求易學易用。提供強大的網(wǎng)絡(luò)功能,支持TCP/IP協(xié)議及其它協(xié)議,提供TCP/UDP/IP/PPP協(xié)議支持及統(tǒng)一的MAC訪問層接口,為各種移動計算設(shè)備預(yù)留接口。強穩(wěn)定性,弱交互性。嵌入式系統(tǒng)一旦開始運行就不需要用戶過多的干預(yù),這就要負責系統(tǒng)管理的EOS具有較強的穩(wěn)定性。嵌入式操作系統(tǒng)的用戶接口一般不提供操作命令,它通過系統(tǒng)的調(diào)用命令向用戶程序提供服務(wù)。固化代碼。在嵌入式系統(tǒng)中,嵌入式操作系統(tǒng)和應(yīng)用軟件被固化在嵌入式系統(tǒng)計算機的ROM中。輔助存儲器在嵌入式系統(tǒng)中很少使用,因此,嵌入式操作系統(tǒng)的文件管理功能應(yīng)該能夠很容易地拆卸,而用各種內(nèi)存文件系統(tǒng)。更好的硬件適應(yīng)性,也就是良好的移植性。嵌入式操作系統(tǒng)特點:嵌入式操作系統(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世紀嵌入式操作系統(tǒng)的發(fā)展操作系統(tǒng)內(nèi)核應(yīng)用程序驅(qū)動程序和固件操作系常見的嵌入式操作系統(tǒng)實時嵌入式操作系統(tǒng)的種類繁多,大體上可分為兩種,商用型和免費型。商用型的實操作系統(tǒng)功能穩(wěn)定、可靠,有完善的技術(shù)支持和售后服務(wù),但往往價格昂貴,如Vxworks、QNX、WinCE、PalmOS等。免費型的實時操作系統(tǒng)在價格方面具有優(yōu)勢,目前主要有Linux,μC/OS是一種源碼開放的商業(yè)RTOS;μC/OS是商業(yè)操作系統(tǒng)常見的嵌入式操作系統(tǒng)實時嵌入式操作系統(tǒng)的種類繁多,大體上RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺BSPKERNELFSTCP/IP設(shè)備驅(qū)動設(shè)備I/O調(diào)試工具其它組件應(yīng)用RTOSC/C++RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺BSPKERNELC/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)站www.ucos-II.com()C/OS簡介

1、C/OS——MicroControl公開源代碼可移植性(Portable)

絕大部分

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

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

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

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

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

可以只使用

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的性能特點(一)公開源代碼C/OS的性能特點(一)占先式(Preemptive)多任務(wù)

C/OS-II可以管理64個任務(wù),然而,目前這一版本保留8個給系統(tǒng)。應(yīng)用程序最多可以有256個任務(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的性能特點(二)占先式(Preemptive)C/OS的性能特點(二)μC/OS-II圖書描述了μC/OS-II內(nèi)部的工作原理隨書的CD中包含了源代碼工業(yè)界最清晰的源代碼除英文版外,有中文和韓文版ChineseKoreanEnglishISBN1-57820-103-9美國CMPBOOKISBN7-81077-290-2北京航空航天大學出版社ISBN89-951540-5-5μC/OS-II圖書描述了μC/OS-II內(nèi)部的工作原理ChμC/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:AvionicsMedicalCellphonesRoutersandswitchesHigh-endaudioequipmentWashingmachinesanddryersUPS(UninterruptiblePowerSupplies)IndustrialcontrollersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-saleterminals更多μC/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:μC/OS-II提供的系統(tǒng)服務(wù)信號量帶互斥機制的信號量減少優(yōu)先級倒置的問題事件標志消息信箱消息隊列內(nèi)存管理時鐘管理任務(wù)管理μC/OS-II提供的系統(tǒng)服務(wù)信號量μC/GUIandμC/FSμC/GUI嵌入式的用戶界面用ANSIC書寫支持任何8,16,32-bitsCPU彩色,灰、度,等級或黑白顯示代碼尺寸小μC/FS嵌入式的文件系統(tǒng)WritteninANSIC用ANSIC書寫支持任何8,16,32-bitsCPU支持SMC,MMC,SD,CF,IDE,Flash,RAM其他介質(zhì)μC/GUIandμC/FSμC/GUIC/OS-II的文件結(jié)構(gòu)C/OS-II的文件結(jié)構(gòu)多道程序技術(shù)為了提高計算機系統(tǒng)中各種資源的利用率,現(xiàn)代操作系統(tǒng)廣泛采用多道程序技術(shù)(multi-programming),使多個程序同時在系統(tǒng)中存在并運行。多道程序技術(shù)為了提高計算機系統(tǒng)中各種資源的利用率,CPUI/O單道程序:多道程序:CPUI/O作業(yè)甲(紅黃)作業(yè)乙(藍綠)CPUI/O單道程序:多道程序:CPUI/O作業(yè)甲(紅黃)作嵌入式實時操作系統(tǒng)分析詳解ppt課件進程、線程和任務(wù)在多道程序系統(tǒng)中,各個程序之間是并發(fā)執(zhí)行的,共享系統(tǒng)資源。CPU需要在各個運行的程序之間來回地切換,這樣的話,要想描述這些多道的并發(fā)活動過程就變得很困難。為此,操作系統(tǒng)設(shè)計者提出了進程的概念。進程、線程和任務(wù)在多道程序系統(tǒng)中,各個程序之間是并發(fā)執(zhí)什么是進程?Aprocess=aprograminexecution一個進程應(yīng)該包括:程序的代碼;程序的數(shù)據(jù);PC中的值,用來指示下一條將運行的指令;一組通用的寄存器的當前值,堆、棧;一組系統(tǒng)資源(如打開的文件)總之,進程包含了正在運行的一個程序的所有

狀態(tài)信息。什么是進程?Aprocess=aprogramain()

{…..}A()

{…..}

PROCESSAprogramisCstatementsorcommands

靜態(tài)的;Aprocessisprogram+runningcontext

動態(tài)的.main()

{…..}A()

{…..}

PROGRAMheap

StackAMainRegisters,PCProcess≠Programmain()

{AprogramisCstatem進程的特性動態(tài)性:程序的運行狀態(tài)在變,PC、寄存器、

堆和棧等;獨立性:是一個獨立的實體,是計算機系統(tǒng)資

源的使用單位。每個進程都有“自己”

的PC和內(nèi)部狀態(tài),運行時獨立于其他

的進程(邏輯PC和物理PC);并發(fā)性:從宏觀上看各進程是同時獨立運行的進程的特性動態(tài)性:程序的運行狀態(tài)在變,PC、寄存器、

四個進程在并發(fā)地運行(本圖摘自AndrewS.Tanenbaum:“ModernOperatingSystems”)四個進程在并發(fā)地運行(本圖摘自AndrewS.Tanen什么是線程?自從60年代提出進程概念以來,在操作系統(tǒng)中一直都是以進程作為獨立運行的基本單位,直到80年代中期,人們又提出了更小的能獨立運行的基本單位線程。什么是線程?自從60年代提出進程概念以來,在操作系統(tǒng)中Why線程?【案例】編寫一個MP3播放軟件。核心功能模塊有三個:(1)從MP3音頻文件當中讀取數(shù)據(jù);(2)對數(shù)據(jù)進行解壓縮;(3)把解壓縮后的音頻數(shù)據(jù)播放出來。Why線程?【案例】編寫一個MP3播放軟件。核心功能單進程的實現(xiàn)方法

main()

{

while(TRUE)

{Read();

Decompress();

Play();

}}Read(){…}

Decompress(){…}Play(){…}問題:播放出來的聲音能

否連貫?各個函數(shù)之間不是

并發(fā)執(zhí)行,影響資

源的使用效率;I/OCPU單進程的實現(xiàn)方法

main()

{

wh多進程的實現(xiàn)方法

程序1

main()

{

while(TRUE)

{Read();

}}Read(){…}問題:進程之間如何通信,共享數(shù)據(jù)?程序3

main()

{

while(TRUE)

{Play();

}}Play(){…}程序2

main()

{

while(TRUE)

{Decompress();

}}Decompress(){…}多進程的實現(xiàn)方法

程序1

main()

{

wh怎么辦?

需要提出一種新的實體,滿足以下特性:(1)實體之間可以并發(fā)地執(zhí)行;(2)實體之間共享相同的地址空間;這種實體就是:線程(Thread)怎么辦?

需要提出一種新的實體,滿足以下特性:這種實體就是什么是線程?

Thread:Asequentialexecutionstreamwithin

aprocess;Athreadofexecution;進程當中的一條執(zhí)行流程。什么是線程?

Thread:從兩個方面來理解進程:從資源組合的角度:進程把一組相關(guān)的

資源組合起來,構(gòu)成了一個資源平臺

(環(huán)境),包括地址空間(代碼段、數(shù)據(jù)

段)、打開的文件等各種資源;從運行的角度:代碼在這個資源平臺上的

一條執(zhí)行流程(線程)。資源平臺線程從兩個方面來理解進程:資源平臺線程進程=線程+資源平臺優(yōu)點:一個進程中可以同時存在多個線程;各個線程之間可以并發(fā)地執(zhí)行;各個線程之間可以共享地址空間。進程=線程+資源平臺優(yōu)點:線程所需的資源

(本圖摘自Silberschatz,GalvinandGagne:“OperatingSystemConcepts”)線程所需的資源

(本圖摘自Silberschatz,Gal1324

C/OS-II概述任務(wù)管理中斷和時間管理任務(wù)之間的通信與同步5存儲管理1324C/OS-II概述任務(wù)管理中斷和時間管理任務(wù)之間的什么是任務(wù)?

在許多嵌入式操作系統(tǒng)當中,一般把能夠獨立運行的實體稱為“任務(wù)”(Task),那么這里所說的任務(wù)到底是進程還是線程呢?什么是任務(wù)?

在許多嵌入式操作系統(tǒng)當中,一般把任務(wù)的實現(xiàn)在多道程序(多任務(wù))的嵌入式操作系統(tǒng)中,任務(wù)之間的結(jié)構(gòu)為層狀結(jié)構(gòu),存在著父子關(guān)系;當嵌入式內(nèi)核剛剛啟動時,只有一個任務(wù)存在,然后由該任務(wù)派生出所有其他的任務(wù)。任務(wù)的實現(xiàn)在多道程序(多任務(wù))的嵌入式操作系統(tǒng)中,任務(wù)之間的任務(wù)的層次結(jié)構(gòu)OS初始任務(wù)任務(wù)任務(wù)任務(wù)任務(wù)任務(wù)任務(wù)任務(wù)任務(wù)的層次結(jié)構(gòu)OS初始任務(wù)任務(wù)任務(wù)任務(wù)任務(wù)任務(wù)任任務(wù)的創(chuàng)建在嵌入式操作系統(tǒng)當中,任務(wù)的創(chuàng)建主要有兩種模型:fork/exec和spawn;fork/exec:符合IEEE/ISOPOSIX1003.1標準,先用fork系統(tǒng)調(diào)用創(chuàng)建與父任務(wù)完全相同的一份內(nèi)存空間,然后再用exec系統(tǒng)調(diào)用來移除父任務(wù)的內(nèi)容,并調(diào)入子任務(wù)的程序代碼。優(yōu)點:允許繼承;spawn:直接為子任務(wù)創(chuàng)建一個全新的地址空間,并裝入其程序代碼。任務(wù)的創(chuàng)建在嵌入式操作系統(tǒng)當中,任務(wù)的創(chuàng)建主要有兩種模型:f任務(wù)的描述問題:如果讓你來設(shè)計OS當中的任務(wù)

機制,那么你將如何來描述一個任務(wù)?描述任務(wù)的數(shù)據(jù)結(jié)構(gòu):任務(wù)控制塊(TaskControlBlock,TCB)。系統(tǒng)為每個任務(wù)都維護了一個TCB,用來保存與該任務(wù)有關(guān)的所有信息。任務(wù)的描述問題:如果讓你來設(shè)計OS當中的任務(wù)

機制,那么你將任務(wù)控制塊的內(nèi)容任務(wù)ID、任務(wù)的狀態(tài)、任務(wù)的優(yōu)先級;CPU上下文信息:通用寄存器的值、PC寄存器的值、程序狀態(tài)字、棧指針的值;如果在該OS中,任務(wù)描述的是進程,則還應(yīng)包括其他的一些內(nèi)容,如段表地址、頁表地址等存儲管理方面的信息;根目錄、文件描述字等文件管理方面的信息。任務(wù)控制塊的內(nèi)容任務(wù)ID、任務(wù)的狀態(tài)、任務(wù)的優(yōu)先級;任務(wù)的創(chuàng)建:為該任務(wù)生成一個TCB;任務(wù)的終止:回收它的TCB;任務(wù)的組織管理:通過對TCB的組織管理來實現(xiàn)。系統(tǒng)用TCB來描述任務(wù)的基本情況以及運行變化的過程,TCB是任務(wù)存在的唯一標志。任務(wù)的創(chuàng)建:為該任務(wù)生成一個TCB;系統(tǒng)用TCB來描述任務(wù)的任務(wù)的實現(xiàn)創(chuàng)建任務(wù)的系統(tǒng)服務(wù)OSTaskCreate()INT8UOSTaskCreate(

void(*task)(void*pd),//任務(wù)代碼指針

void*pdata,//任務(wù)參數(shù)指針

OS_STK*ptos,//任務(wù)棧的棧頂指針

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

);OSTaskCreateExt()提問:C/OS-II中的任務(wù)是進程還是線程?任務(wù)的實現(xiàn)創(chuàng)建任務(wù)的系統(tǒng)服務(wù)提問:C/OS-II中的任務(wù)是任務(wù)主函數(shù)一個任務(wù)通常是一個無限循環(huán)(返回值類型void)voidMyTask(void*pdata){while(1){dosomething;waiting; dosomething; }}Why?任務(wù)主函數(shù)一個任務(wù)通常是一個無限循環(huán)(返回值類型void)W任務(wù)也可以自我刪除(并非真的刪除,只是內(nèi)核不再知道該任務(wù))voidMyTask(void*pdata){....../*用戶代碼*/OSTaskDel(OS_PRIO_SELF);}任務(wù)也可以自我刪除(并非真的刪除,只是內(nèi)核不再知道該任務(wù))μC/OS-Ⅱ可以管理多達64個任務(wù);每個任務(wù)被賦以不同的優(yōu)先級,取值從0到OS_LOWEST_PRIO-2,數(shù)值越小,優(yōu)先級越高;系統(tǒng)保留了優(yōu)先級為0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0這8個任務(wù)以被將來使用,用戶可以有56個應(yīng)用任務(wù);任務(wù)的優(yōu)先級同樣也是它的標識號ID。OS_CFG.H

中定義=63μC/OS-Ⅱ可以管理多達64個任務(wù);OS_CFG.H

中定空閑任務(wù)和統(tǒng)計任務(wù)內(nèi)核總是創(chuàng)建一個空閑任務(wù)OSTaskIdle();總是設(shè)置為最低優(yōu)先級,OS_LOWEST_PRIOR;當所有其他任務(wù)都未在執(zhí)行時,空閑任務(wù)開始執(zhí)行;應(yīng)用程序不能刪除該任務(wù);空閑任務(wù)的工作就是把32位計數(shù)器OSIdleCtr加1,該計數(shù)器被統(tǒng)計任務(wù)所使用;統(tǒng)計任務(wù)OSTaskStat(),提供運行時間統(tǒng)計。每秒鐘運行一次,計算當前的CPU利用率。其優(yōu)先級是OS_LOWEST_PRIOR-1,可選??臻e任務(wù)和統(tǒng)計任務(wù)內(nèi)核總是創(chuàng)建一個空閑任務(wù)OSTaskIdl任務(wù)控制塊TCB任務(wù)控制塊OS_TCB是描述一個任務(wù)的核心數(shù)據(jù)結(jié)構(gòu),存放了它的各種管理信息,包括任務(wù)堆棧指針,任務(wù)的狀態(tài)、優(yōu)先級,任務(wù)鏈表指針等;一旦任務(wù)建立了,任務(wù)控制塊OS_TCB將被賦值。任務(wù)控制塊TCB任務(wù)控制塊OS_TCB是描述一個任務(wù)的核心任務(wù)控制塊TCBtypedefstructos_tcb{棧指針;INT16UOSTCBId;/*任務(wù)的ID*/鏈表指針;OS_EVENT*OSTCBEventPtr;/*事件指針*/void*OSTCBMsg;/*消息指針*/INT8UOSTCBStat;/*任務(wù)的狀態(tài)*/INT8UOSTCBPrio;/*任務(wù)的優(yōu)先級*/其他……}OS_TCB;任務(wù)控制塊TCBtypedefstructos_tcb任務(wù)的狀態(tài)-休眠休眠狀態(tài)(Dormant):任務(wù)存在于內(nèi)存空間中,但內(nèi)核不可見;可以通過以下函數(shù)通知內(nèi)核,使之變?yōu)榫途w狀態(tài):OSTaskCreate()或OSTaskCreateExt()可以通過以下函數(shù)返回到休眠狀態(tài):OSTaskDel()

任務(wù)的狀態(tài)-休眠休眠狀態(tài)(Dormant):任務(wù)存在于內(nèi)存空任務(wù)的狀態(tài)-就緒就緒狀態(tài)(Ready):萬事具備,只欠CPU;在所有的就緒任務(wù)當中,具有最高優(yōu)先級的任務(wù)被選中去運行;如果任務(wù)在運行的時候被搶占了CPU,則又回到就緒狀態(tài)。任務(wù)的狀態(tài)-就緒就緒狀態(tài)(Ready):萬事具備,只欠CPU任務(wù)的狀態(tài)-運行運行狀態(tài)(Running):任務(wù)在CPU上運行;當一個任務(wù)在運行時,如果沒有關(guān)閉中斷,則有可能被中斷所打斷;當一個任務(wù)在運行時,可能因為各種原因進入阻塞狀態(tài)。OSMBoxPend(),OSQPend(),OSSemPend()OSTaskSuspend(),OSTimeDly()任務(wù)的狀態(tài)-運行運行狀態(tài)(Running):任務(wù)在CPU上運任務(wù)的狀態(tài)-ISR中斷服務(wù)狀態(tài)(ISR):該任務(wù)原來在CPU上運行,后來被中斷所打斷,由中斷服務(wù)程序ISR接管了CPU;當中斷服務(wù)程序運行完畢后,內(nèi)核要判斷是否有新的、更高優(yōu)先級的任務(wù)就緒,如果有,則原有的任務(wù)被搶占;如果沒有,則原有的任務(wù)重新運行。任務(wù)的狀態(tài)-ISR中斷服務(wù)狀態(tài)(ISR):該任務(wù)原來在CPU任務(wù)的狀態(tài)-阻塞阻塞/等待狀態(tài)(Waiting):任務(wù)由于正在等待某個事件(信號量、郵箱或隊列)而被掛起;當任務(wù)等待的事件發(fā)生時,回到就緒狀態(tài)。OSMBoxpost(),OSQPost(),OSSemPost(),OSTaskResume(),OSTimeDlyResume()或OSTimeTick()任務(wù)的狀態(tài)-阻塞阻塞/等待狀態(tài)(Waiting):任務(wù)由于正狀態(tài)的轉(zhuǎn)換刪除任務(wù)狀態(tài)的轉(zhuǎn)換刪除任務(wù)任務(wù)就緒表每個任務(wù)的就緒態(tài)標志放入在就緒表中,就緒表中有兩個變量OSRdyGrp和OSRdyTbl[]。在OSRdyGrp中,任務(wù)按優(yōu)先級分組,8個任務(wù)為一組。OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進入就緒態(tài)的任務(wù)。任務(wù)進入就緒態(tài)時,就緒表OSRdyTbl[]中的相應(yīng)元素的相應(yīng)位也置位。任務(wù)就緒表每個任務(wù)的就緒態(tài)標志放入在就緒表中,就緒表中有兩個任務(wù)就緒表OSRdyGrp1207654300XXXYYY任務(wù)優(yōu)先級2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[8]XY優(yōu)先級最低任務(wù)(空閑任務(wù))優(yōu)先級最高任務(wù)任務(wù)優(yōu)先級號對于整數(shù)OSRdyTbl[i](0i7),若它的某一位

為1,則OSRdyGrp的第i位為1。任務(wù)的優(yōu)先級由X和Y確定任務(wù)就緒表OSRdyGrp1207654300XXXYYY根據(jù)優(yōu)先級確定就緒表(1)假設(shè)優(yōu)先級為12的任務(wù)進入就緒狀態(tài),12=1100b,則OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相應(yīng)的數(shù)學表達式為:

OSRdyGrp|=0x02;OSRdyTbl[1]|=0x10;而優(yōu)先級為21的任務(wù)就緒21=10101b,則OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相應(yīng)的數(shù)學表達式為:

OSRdyGrp|=0x04;OSRdyTbl[2]|=0x20;根據(jù)優(yōu)先級確定就緒表(1)假設(shè)優(yōu)先級為12的任務(wù)進入就緒狀態(tài)根據(jù)優(yōu)先級確定就緒表(2)從上面的計算可知:若OSRdyGrp及OSRdyBbl[]的第n位置1,則應(yīng)該把OSRdyGrp及OSRdyBbl[]的值與2n相或。uC/OS中,把2n的n=0-7的8個值先計算好存在數(shù)組OSMapTbl[7]中,也就是:

OSMapTbl[0]=20=0x01(00000001)OSMapTbl[1]=21=0x02(00000010)

……OSMapTbl[7]=27=0x80(10000000)根據(jù)優(yōu)先級確定就緒表(2)從上面的計算可知:若OSRdyGr使任務(wù)進入就緒態(tài)如果prio是任務(wù)的優(yōu)先級,即任務(wù)的標識號,則將任務(wù)放入就緒表,即使任務(wù)進入就緒態(tài)的方法是:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];假設(shè)優(yōu)先級為12——1100bOSRdyGrp|=OSMapTbl[12>>3](0x02);OSRdyTbl[1]|=0x10;使任務(wù)進入就緒態(tài)如果prio是任務(wù)的優(yōu)先級,即任務(wù)的標識號,使任務(wù)脫離就緒態(tài)將任務(wù)就緒表OSRdyTbl[prio>>3]相應(yīng)元素的相應(yīng)位清零,而且當OSRdyTbl[prio>>3]中的所有位都為零時,即該任務(wù)所在組的所有任務(wù)中沒有一個進入就緒態(tài)時,OSRdyGrp的相應(yīng)位才為零。if((OSRdyTbl[prio>>3]&=

OSMapTbl[prio&0x07])==0)OSRdyGrp&=

OSMapTbl[prio>>3];使任務(wù)脫離就緒態(tài)將任務(wù)就緒表OSRdyTbl[prio>>3任務(wù)的調(diào)度

C/OS是可搶占實時多任務(wù)內(nèi)核,它總是運行就緒任務(wù)中優(yōu)先級最高的那一個。

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)。任務(wù)的調(diào)度C/OS是可搶占實時多任務(wù)內(nèi)核,它總是運行就緒任確定哪個任務(wù)的優(yōu)先級最高,應(yīng)該選擇哪個任務(wù)去運行,這部分的工作是由調(diào)度器(Scheduler)來完成的。任務(wù)級的調(diào)度是由函數(shù)OSSched()完成的;中斷級的調(diào)度是由另一個函數(shù)OSIntExt()完成的。確定哪個任務(wù)的優(yōu)先級最高,應(yīng)該選擇哪個任務(wù)去運行,這部分的工根據(jù)就緒表確定最高優(yōu)先級兩個關(guān)鍵:將優(yōu)先級數(shù)分解為高三位和低三位分別確定;高優(yōu)先級有著小的優(yōu)先級號;根據(jù)就緒表確定最高優(yōu)先級兩個關(guān)鍵:根據(jù)就緒表確定最高優(yōu)先級通過OSRdyGrp值確定高3位,假設(shè)OSRdyGrp=0x08=

0x00001000,第3位為1,優(yōu)先級的高3位為011;通過OSRdyTbl[3]的值來確定低3位,假設(shè)OSRdyTbl[3]=0x3a,第1位為1,優(yōu)先級的低3位為001,3*8+1=25任務(wù)優(yōu)先級根據(jù)就緒表確定最高優(yōu)先級通過OSRdyGrp值確定高3位,假任務(wù)調(diào)度器voidOSSched(void){INT8Uy;

OS_ENTER_CRITICAL();if((OSLockNesting|OSIntNesting)==0){ y=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y<<3)+ OSUnMapTbl[OSRdyTbl[y]]); if(OSPrioHighRdy!=OSPrioCur){ OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;OS_TASK_SW();}}OS_EXIT_CRITICAL();}檢查是否中斷調(diào)用和允許任務(wù)調(diào)用找到優(yōu)先級最高的任務(wù)該任務(wù)是否正在運行任務(wù)調(diào)度器voidOSSched(void)檢查是否中斷源代碼中使用了查表法查表法具有確定的時間,增加了系統(tǒng)的可預(yù)測性,uC/OS中所有的系統(tǒng)調(diào)用時間都是確定的Y=OSUnMapTbl[OSRdyGrp];X=OSUnMapTbl[OSRdyTbl[Y]];Prio=(Y<<3)+X;參見OS_CORE.C源代碼中使用了查表法查表法具有確定的時間,增加了系統(tǒng)的可預(yù)測INT8UconstOSUnMapTbl[]={0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};優(yōu)先級判定表OSUnMapTbl[256]舉例:

如OSRdyGrp的值為01101000B,即0X68,則查得OSUnMapTbl[OSRdyGrp]的值是3,它相應(yīng)于OSRdyGrp中的第3位置1;如OSRdyTbl[3]的值是11100100B,即0XE4,則查OSUnMapTbl[OSRdyTbl[3]]的值是2,則進入就緒態(tài)的最高任務(wù)優(yōu)先級Prio=3*8+2=26

INT8UconstOSUnMapTbl[]={優(yōu)先任務(wù)的調(diào)度在操作系統(tǒng)中,負責去做這個選擇的那

部分程序,稱為調(diào)度程序或調(diào)度器(scheduler);調(diào)度程序在決策過程中所采用的算法,

稱為是調(diào)度算法;調(diào)度程序是CPU資源的管理者。任務(wù)的調(diào)度在操作系統(tǒng)中,負責去做這個選擇的那

部分程序,稱為何時進行調(diào)度?當一個新的任務(wù)被創(chuàng)建時,是執(zhí)行新任務(wù)還是繼續(xù)執(zhí)行父任務(wù)?當一個任務(wù)運行完畢時;當一個任務(wù)由于I/O、信號量或其他的某個原因被阻塞時;當一個I/O中斷發(fā)生時,表明某個I/O操作已經(jīng)完成,而等待該I/O操作的任務(wù)轉(zhuǎn)入就緒狀態(tài);在分時系統(tǒng)中,當一個時鐘中斷發(fā)生時。何時進行調(diào)度?當一個新的任務(wù)被創(chuàng)建時,是執(zhí)行新任務(wù)還是繼續(xù)執(zhí)兩種調(diào)度方式不可搶占(non-preemptive)調(diào)度方式:一個進程若被選中就一直運行下去,直到它被阻塞(I/O,或正在等待其他進程),或主動地交出CPU。以上的情形1-3均可發(fā)生調(diào)度;可搶占(preemptive)調(diào)度方式:當一個進程在運行時,調(diào)度程序可以打斷它。以上的情形1-5均可發(fā)生調(diào)度,另外,在其他一些情形下,如就緒隊列中有新進程的優(yōu)先級高于當前正運行的進程,也可能立即進行調(diào)度。兩種調(diào)度方式不可搶占(non-preemptive)調(diào)度方式嵌入式調(diào)度算法的評價指標響應(yīng)時間(responsetime):調(diào)度器為一個就緒任務(wù)進行上下文切換的時間,以及任務(wù)在就緒隊列中等待的時間;周轉(zhuǎn)時間(turnaroundtime):一個任務(wù)從提交到完成所經(jīng)歷的時間;調(diào)度開銷(overhead):調(diào)度算法在執(zhí)行時所需要的時間和空間開銷;公平(fairness):大致相當?shù)膬蓚€進程所得到的CPU時間也應(yīng)是大致相同的,防止饑餓(starvation);均衡:盡可能使整個系統(tǒng)的各部分(CPU、I/O)都忙起來,提高系統(tǒng)資源的使用效率;吞吐量(Throughput):單位時間內(nèi)完成的任務(wù)數(shù)。嵌入式調(diào)度算法的評價指標響應(yīng)時間(responsetime先來先服務(wù)調(diào)度算法先來先服務(wù)(FirstComeFirstServed,F(xiàn)CFS;

FirstInFirstOut,F(xiàn)IFO):按照任務(wù)到達就緒隊列的先后次序進行調(diào)度;不可搶占方式:當前任務(wù)占用CPU,直到執(zhí)行

完或被阻塞,才讓出CPU給另外一個任務(wù);在任務(wù)被喚醒后(如I/O完成),并不立即恢復

執(zhí)行,而是放在就緒隊列的末尾;優(yōu)點:簡單、公平,易于理解也易于實現(xiàn)。

現(xiàn)實生活中應(yīng)用廣泛:排隊。先來先服務(wù)調(diào)度算法先來先服務(wù)(FirstComeFirsFCFS算法的問題平均周轉(zhuǎn)時間取決于各任務(wù)到達的順序,若短任務(wù)位于長任務(wù)之后,將增大平均周轉(zhuǎn)時間。例如,三個任務(wù)A、B、C的運行時間為24、3、3時間242730ABC平均周轉(zhuǎn)時間=(24+27+30)/3=27時間3630ABC平均周轉(zhuǎn)時間=(3+6+30)/3=13FCFS算法的問題平均周轉(zhuǎn)時間取決于各任務(wù)到達的順序,若短任短作業(yè)優(yōu)先調(diào)度算法

短作業(yè)優(yōu)先(ShortestJobFirst,SJF),設(shè)計

目標是改進FCFS算法,減少平均周轉(zhuǎn)時間;SJF算法要求任務(wù)在開始執(zhí)行時預(yù)計執(zhí)行時間,

對預(yù)計執(zhí)行時間短的任務(wù)優(yōu)先分派處理器;兩種實現(xiàn)方案:不可搶占方式:當前任務(wù)在運行時不會被打

斷,只有運行完畢或阻塞時,才讓出CPU;可搶占方式:如果一個新的短任務(wù)到來,其

運行時間小于當前正在運行任務(wù)的剩余時間,

則搶占CPU運行,稱為SRTF(Shortest

RemainingTimeFirst)。短作業(yè)優(yōu)先調(diào)度算法短作業(yè)優(yōu)先(ShortestJob可以證明:對于一組同時到達的任務(wù),采用SJF

算法將得到一個最小的平均周轉(zhuǎn)時間。D時間ACaa+ba+b+ca+b+c+d例如,考察4個任務(wù)A、B、C、D,其運行時間分

別為a、b、c、dBA、B、C、D的周轉(zhuǎn)時間分別為a、a+b、a+b+c和a+b+c+d,因此平均周轉(zhuǎn)時間為:(4a+3b+2c+d)/4顯然,當abcd時,平均周轉(zhuǎn)時間最小??梢宰C明:對于一組同時到達的任務(wù),采用SJF

算法時間片輪轉(zhuǎn)調(diào)度算法在時間片輪轉(zhuǎn)算法(Round-Robin,RR)中,將

所有的就緒任務(wù)按照FCFS原則,排成一個隊列;每次調(diào)度時將處理器分派給隊首任務(wù),讓其執(zhí)行

一小段CPU時間(時間片,timeslice);在一個時間片結(jié)束時,如果任務(wù)還沒有執(zhí)行完的

話,將發(fā)生時鐘中斷,在時鐘中斷中,調(diào)度程序

將暫停當前任務(wù)的執(zhí)行,并將其送到就緒隊列的

末尾,然后執(zhí)行當前的隊首任務(wù);如果一個任務(wù)在它的時間片用完之前就已結(jié)束或

被阻塞,那么立即讓出CPU。時間片輪轉(zhuǎn)調(diào)度算法在時間片輪轉(zhuǎn)算法(Round-Robin開始時,任務(wù)B位于隊列之首,因此被調(diào)度執(zhí)行。當

它的時間片用完后,就把它送到就緒隊列的末尾。

同時,任務(wù)F成為新的隊首,被調(diào)度運行。開始時,任務(wù)B位于隊列之首,因此被調(diào)度執(zhí)行。當

它的時間片用Roundrobin,too….Roundrobin,too….時間片輪轉(zhuǎn)法的特點

優(yōu)點:

公平性:各個就緒任務(wù)平均地分配CPU的使用

時間。假設(shè)有n個就緒任務(wù),時間片大小為q,

那么每個任務(wù)將得到1/n的CPU時間;

活動性:每個任務(wù)最多等待(n-1)q時間就能夠

再次得到CPU去運行;缺點:q的大小難以確定(一般在20-50ms)。q太大:退化為FCFS算法,進程在一個時間片

內(nèi)都執(zhí)行完,響應(yīng)時間長。如q=100ms;q太?。好總€任務(wù)都需要更多的時間片才能處理

完,任務(wù)切換次數(shù)增加,增大系統(tǒng)開銷。如q=4ms時間片輪轉(zhuǎn)法的特點優(yōu)點:優(yōu)先級調(diào)度算法輪轉(zhuǎn)法有一個缺省的前提,即各任務(wù)同等重要;“人人生而平等”?恐怕不太現(xiàn)實!同樣,并

不是每個任務(wù)都同等重要,怎么辦?分等級!優(yōu)先級算法(PriorityScheduling):給每個任

務(wù)設(shè)置一個優(yōu)先級,然后在所有就緒任務(wù)中選擇

優(yōu)先級最高的那個任務(wù)去運行;SJF就是一個優(yōu)先級算法,每個任務(wù)的優(yōu)先級是

它的CPU運行時間(時間越短,優(yōu)先級越高);分為可搶占和不可搶占兩種方式;各任務(wù)優(yōu)先級

的確定方式可分為靜態(tài)和動態(tài)兩種。優(yōu)先級調(diào)度算法輪轉(zhuǎn)法有一個缺省的前提,即各任務(wù)同等重要;可搶占方式任務(wù)1任務(wù)2任務(wù)1優(yōu)先級高低時間任務(wù)2任務(wù)3表示搶占表示結(jié)束可搶占方式任務(wù)1任務(wù)2任務(wù)1優(yōu)先級高時間任務(wù)2任靜態(tài)優(yōu)先級方式:指在創(chuàng)建任務(wù)時即確定任務(wù)的優(yōu)先級,并保持不變到任務(wù)運行結(jié)束。缺點:如果一直有高優(yōu)先級的任務(wù)出現(xiàn),則它們一直占用著CPU,而低優(yōu)先級的任務(wù)“饑餓”。動態(tài)優(yōu)先級方式:指在創(chuàng)建任務(wù)時賦予給進程的優(yōu)先級,在任務(wù)運行過程中可以動態(tài)改變,以便獲得更好的調(diào)度性能。為防“饑餓”,根據(jù)任務(wù)的等待時間調(diào)整優(yōu)先級。在就緒隊列中,等待時間延長則優(yōu)先級提高,從而使優(yōu)先級較低的任務(wù)在等待足夠的時間后,其優(yōu)先級提高到可被調(diào)度執(zhí)行。靜態(tài)優(yōu)先級方式:指在創(chuàng)建任務(wù)時即確定任務(wù)的優(yōu)先級,并保持不變優(yōu)先級類別(本圖摘自AndrewS.Tanenbaum:“ModernOperatingSystems”)可以把進程按照不同的優(yōu)先級別分組,然后在不同

級別之間使用優(yōu)先級算法,而在同一級別的各個進

程之間使用時間片輪轉(zhuǎn)法。優(yōu)先級類別(本圖摘自AndrewS.Tanenbaum:實時系統(tǒng)調(diào)度對于RTOS調(diào)度器來說,公平性并不重要。例如:如果老師給你布置了五個家庭作業(yè),其中有一個作業(yè)必須在一個小時內(nèi)完成,顯然先做那個作業(yè);RTOS調(diào)度器的主要目標就是要使得每個任務(wù)都必須在其最終時間期限(deadline)之前完成。實時系統(tǒng)調(diào)度對于RTOS調(diào)度器來說,公平性并不重要。例如:如優(yōu)先級反轉(zhuǎn)優(yōu)先級反轉(zhuǎn)大多數(shù)RTOS調(diào)度器都采用基于優(yōu)先級的可搶占調(diào)度算法;但在具體實現(xiàn)上:如何設(shè)定各個任務(wù)的優(yōu)先級?優(yōu)先級是靜態(tài)設(shè)置的還是動態(tài)可變的?算法的性能如何,能否滿足實時要求?大多數(shù)RTOS調(diào)度器都采用基于優(yōu)先級的可搶占調(diào)度算法;任務(wù)模型(周期性任務(wù))啟動時間r(i,j):第i個任務(wù)的第j次執(zhí)行的開始時間;時間期限D(zhuǎn)eadline,D(i):第i個任務(wù)所允許的最大響應(yīng)時間(從任務(wù)啟動到運行結(jié)束所需的時間);周期Period,P(i):第i個任務(wù)的連續(xù)兩次運行之間的最小時間間隔;執(zhí)行時間ExecutionTime,E(i):對于第i個任務(wù),當它所需要的資源都已具備時,它的執(zhí)行所需要的最長時間。任務(wù)模型(周期性任務(wù))啟動時間r(i,j):第i個任務(wù)的第j典型的RTOS任務(wù)模型每個任務(wù)用一個三元組來表示(執(zhí)行時間、周期、deadline);一般來說,周期=deadline;任務(wù)可以一個周期內(nèi)的任何時刻被啟動;啟動時間執(zhí)行時間周期0

1

2

3

4

5

6

78p=(2,8,8)典型的RTOS任務(wù)模型每個任務(wù)用一個三元組來表示(執(zhí)行時間、單調(diào)速率調(diào)度算法單調(diào)速率調(diào)度(RateMonotonicScheduling,RMS)算法;RMS是一種靜態(tài)優(yōu)先級調(diào)度算法,也是最常用的一種確定任務(wù)優(yōu)先級的算法;思路:單位時間內(nèi)任務(wù)被執(zhí)行的次數(shù)越多,優(yōu)先級越高。即任務(wù)的周期越短,優(yōu)先級越高。周期 優(yōu)先級10 1(最高)

12 2

15 3

20 4(最低)例如:單調(diào)速率調(diào)度算法單調(diào)速率調(diào)度(RateMonotonicRMS算法是一種最優(yōu)算法:如果存在一種基于靜態(tài)優(yōu)先級的調(diào)度順序,使得每個任務(wù)都能夠在期限時間內(nèi)完成,那么RMS算法總能找到一種可行的調(diào)度方案;對于一組任務(wù),這種調(diào)度方案不一定存在;處理器的利用率:如果U

1,則RMS調(diào)度方案不存在(處理器不可能一天工作25小時);如果U

n(21/n

1),n為任務(wù)的個數(shù),則RMS調(diào)度方案一定存在。RMS算法是一種最優(yōu)算法:如果存在一種基于靜態(tài)優(yōu)先級的調(diào)度順Task1的優(yōu)先級高于Task2任務(wù)1任務(wù)2RMS算法超時Task1的優(yōu)先級任務(wù)1任務(wù)2RMS算法超時最早期限優(yōu)先調(diào)度算法最早期限優(yōu)先(EarliestDeadlineFirst,EDF)調(diào)度算法:EDF是一種動態(tài)優(yōu)先級調(diào)度算法,也是性能最好的一種調(diào)度算法;基本思路:對時間期限最近的任務(wù),分配最高的優(yōu)先級。最早期限優(yōu)先調(diào)度算法最早期限優(yōu)先(EarliestDeadTask1和Task2的優(yōu)先級是動態(tài)調(diào)整的。任務(wù)1任務(wù)2EDF算法未超時Task1和Task2任務(wù)1任務(wù)2EDF算法未超時任務(wù)切換將被掛起任務(wù)的寄存器內(nèi)容入棧;將較高優(yōu)先級任務(wù)的寄存器內(nèi)容出棧,恢復到硬件寄存器中。任務(wù)切換將被掛起任務(wù)的寄存器內(nèi)容入棧;任務(wù)級的任務(wù)切換OS_TASK_SW()通過sc系統(tǒng)調(diào)用指令完成保護當前任務(wù)的現(xiàn)場恢復新任務(wù)的現(xiàn)場執(zhí)行中斷返回指令開始執(zhí)行新的任務(wù)任務(wù)級的任務(wù)切換OS_TASK_SW()通過sc系統(tǒng)調(diào)用指令調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級任務(wù)OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務(wù)OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)調(diào)用OS_TASK_SW()前的數(shù)據(jù)結(jié)構(gòu)低優(yōu)先級任務(wù)OSTC保存當前CPU寄存器的值低優(yōu)先級任務(wù)OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務(wù)OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)保存當前CPU寄存器的值低優(yōu)先級任務(wù)OSTCBCurPSWP重新裝入要運行的任務(wù)低優(yōu)先級任務(wù)OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務(wù)OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)重新裝入要運行的任務(wù)低優(yōu)先級任務(wù)OSTCBCurPSWPCR任務(wù)切換OS_TASK_SW()的代碼VoidOSCtxSw(void){將R1,R2,R3及R4推入當前堆棧;OSTCBCurOSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdyOSTCBSTKPtr;將R4,R3,R2及R1從新堆棧中彈出;執(zhí)行中斷返回指令;}任務(wù)切換OS_TASK_SW()的代碼VoidOSCtxS給調(diào)度器上鎖OSSchedlock():給調(diào)度器上鎖函數(shù),用于禁止任務(wù)調(diào)度,保持對CPU的控制權(quán)(即使有優(yōu)先級更高的任務(wù)進入了就緒態(tài));OSSchedUnlock():給調(diào)度器開鎖函數(shù),當任務(wù)完成后調(diào)用此函數(shù),調(diào)度重新得到允許;當?shù)蛢?yōu)先級的任務(wù)要發(fā)消息給多任務(wù)的郵箱、消息隊列、信號量時,它不希望高優(yōu)先級的任務(wù)在郵箱、隊列和信號量還沒有得到消息之前就取得了CPU的控制權(quán),此時,可以使用調(diào)度器上鎖函數(shù)。給調(diào)度器上鎖OSSchedlock():給調(diào)度器上鎖函數(shù),用任務(wù)管理的系統(tǒng)服務(wù)創(chuàng)建任務(wù)刪除任務(wù)修改任務(wù)的優(yōu)先級掛起和恢復任務(wù)獲得一個任務(wù)的有關(guān)信息任務(wù)管理的系統(tǒng)服務(wù)創(chuàng)建任務(wù)創(chuàng)建任務(wù)創(chuàng)建任務(wù)的函數(shù)OSTaskCreate();OSTaskCreateExt();OSTaskCreateExt()是OSTaskCreate()的擴展版本,提供了一些附加的功能;任務(wù)可以在多任務(wù)調(diào)度開始(即調(diào)用OSStart())之前創(chuàng)建,也可以在其它任務(wù)的執(zhí)行過程中被創(chuàng)建。但在OSStart()被調(diào)用之前,用戶必須創(chuàng)建至少一個任務(wù);不能在中斷服務(wù)程序(ISR)中創(chuàng)建新任務(wù)。創(chuàng)建任務(wù)創(chuàng)建任務(wù)的函數(shù)OSTaskCreate()INT8UOSTaskCreate(

void(*task)(void*pd),//任務(wù)代碼指針

void*pdata,//任務(wù)參數(shù)指針

OS_STK*ptos,//任務(wù)棧的棧頂指針

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

);返回值 OS_NO_ERR:函數(shù)調(diào)用成功;

OS_PRIO_EXIT:任務(wù)優(yōu)先級已經(jīng)存在;

OS_PRIO_INVALID:任務(wù)優(yōu)先級無效。OSTaskCreate()INT8UOSTaskCreaOSTaskCreate()的實現(xiàn)過程任務(wù)優(yōu)先級檢查該優(yōu)先級是否在0到OS_LOWSEST_PRIO之間?該優(yōu)先級是否空閑?調(diào)用OSTaskStkInit(),創(chuàng)建任務(wù)的棧幀;調(diào)用OSTCBInit(),從空閑的OS_TCB池(即OSTCBFreeList鏈表)中獲得一個TCB并初始化其內(nèi)容,然后把它加入到OSTCBList鏈表的開頭,并把它設(shè)定為就緒狀態(tài);任務(wù)個數(shù)OSTaskCtr加1;調(diào)用用戶自定義的函數(shù)OSTaskCreateHook();判斷是否需要調(diào)度(調(diào)用者是正在執(zhí)行的任務(wù))OSTaskCreate()的實現(xiàn)過程任務(wù)優(yōu)先級檢查OSTaskCreateExt()INT8UOSTaskCreateExt(

前四個參數(shù)與OSTaskCreate相同,

INT16Uid,//任務(wù)的ID

OS_STK*pbos,//指向任務(wù)棧底的指針

INT32Ustk_size,//棧能容納的成員數(shù)目

void*pext,//指向用戶附加數(shù)據(jù)域的指針

INT16Uopt//一些選項信息

);返回值:與OSTaskCreate()相同。OSTaskCreateExt()INT8UOSTaskC任務(wù)的??臻g每個任務(wù)都有自己的??臻g(Stack),棧必須聲明為OS_STK類型,并且由連續(xù)的內(nèi)存空間組成;棧空間的分配方法靜態(tài)分配:在編譯的時候分配,例如:

staticOS_STKMyTaskStack[stack_size];

OS_STKMyTaskStack[stack_size];動態(tài)分配:在任務(wù)運行的時候使用malloc()函數(shù)來動態(tài)申請內(nèi)存空間;任務(wù)的??臻g每個任務(wù)都有自己的棧空間(Stack),棧必須聲OS_STK*pstk;

pstk=(OS_STK*)malloc(stack_size);/*確認malloc()能得到足夠的內(nèi)存空間*/

if(pstk!=(OS_STK*)0){Createthetask;}

動態(tài)分配OS_STK*pstk;動態(tài)分配內(nèi)存碎片問題在動態(tài)分配中,可能存在內(nèi)存碎片問題。特別是當用戶反復地建立和刪除任務(wù)時,內(nèi)存堆中可能會出現(xiàn)大量的碎片,導致沒有足夠大的一塊連續(xù)內(nèi)存區(qū)域可用作任務(wù)棧,這時malloc()便無法成功地為任務(wù)分配??臻g。3Kb堆初始狀態(tài)3個任務(wù)刪除A,C內(nèi)碎片/

外碎片?內(nèi)存碎片問題在動態(tài)分配中,可能存在內(nèi)存碎片問題。特別是當用戶棧的增長方向棧的增長方向的設(shè)置從低地址到高地址:在OS_CPU.H中,將常量OS_STK_GROWTH設(shè)定為0;從高地址到低地址:在OS_CPU.H中,將常量OS_STK_GROWTH設(shè)定為1;OS_STKTaskStack[TASK_STACK_SIZE];OSTaskCreate(task,pdata,

&TaskStack[TASK_STACK_SIZE-1],

prio);棧的增長方向棧的增長方向的設(shè)置OSTaskChangePrio():在程序運行期間,用戶可以通過調(diào)用本函數(shù)來改變某個任務(wù)的優(yōu)先級。 INT8UOSTaskChangePrio(INT8Uoldprio,

INT8Unewprio)OSTaskQuery():獲得一個任務(wù)的有關(guān)信息獲得的是對應(yīng)任務(wù)的OS_TCB中內(nèi)容的拷貝。OSTaskChangePrio():在程序運行期間,用戶可OSTaskSuspend():掛起一個任務(wù)如果任務(wù)處于就緒態(tài),把它從就緒表中移出;在任務(wù)的TCB中設(shè)置OS_STAT_SUSPEND標志,表明該任務(wù)正在被掛起。OSTaskResume():恢復一個任務(wù)恢復被OSTaskSuspend()掛起的任務(wù);清除TCB中OSTCBStat字段的OS_STAT_SUSPEND位掛起和恢復任務(wù)OSTaskSuspend():掛起一個任務(wù)掛起和恢復任務(wù)1324

C/OS-II概述任務(wù)管理中斷和時間管理任務(wù)之間的通信與同步5存儲管理6

C/OS-II的移植1324C/OS-II概述任務(wù)管理中斷和時間管理任務(wù)之間的中斷處理中斷:由于某種事件的發(fā)生而導致程序流程的改變。產(chǎn)生中斷的事件稱為中斷源。CPU響應(yīng)中斷的條件:至少有一個中斷源向CPU發(fā)出中斷信號;系統(tǒng)允許中斷,且對此中斷信號未予屏蔽。中斷處理中斷:由于某種事件的發(fā)生而導致程序流程的改變。產(chǎn)生中中斷服務(wù)程序ISR中斷一旦被識別,CPU會保存部分(或全部)運行上下文(context,即寄存器的值),然后跳轉(zhuǎn)到專門的子程序去處理此次事件,稱為中斷服務(wù)子程序(ISR)。μC/OS-Ⅱ中,中斷服務(wù)子程序要用匯編語言來編寫,然而,如果用戶使用的C語言編譯器支持在線匯編語言的話,用戶可以直接將中斷服務(wù)子程序代碼放在C語言的程序文件中。中斷服務(wù)程序ISR中斷一旦被識別,CPU會保存部分(或全部)(1)保存全部CPU寄存器的值;(2)調(diào)用OSIntEnter(),或直接把全局變量OSIntNesting(中斷嵌套層次)加1;(3)執(zhí)行用戶代碼做中斷服務(wù);(4)調(diào)用OSIntExit();(5)恢復所有CPU寄存器;(6)執(zhí)行中斷返回指令。用戶ISR的框架(1)保存全部CPU寄存器的值;用戶ISR的框架嵌入式實時操作系統(tǒng)分析詳解ppt課件OSIntEnter()/*在調(diào)用本函數(shù)之前必須先將中斷關(guān)閉*/voidOSIntEnter(void){if(OSRunning==TRUE){if(OSIntNesting<255){OSIntNesting++;}}}OSIntEnter()/*在調(diào)用本函數(shù)之前必須先將中斷關(guān)OSIntExit的意義OSIntExit的意義OSIntExit()voidOSIntExit(void){OS_ENTER_CRITICAL();//關(guān)中斷if((--OSIntNesting|OSLockNesting)==0)//判斷嵌套是否為零{//把高優(yōu)先級任務(wù)裝入OSIntExitY=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((OSIntExitY<<3)+OSUnMapTbl[OSRdyTbl[OSIntExitY]]);if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=

OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;

OSIntCtxSw();}}OS_EXIT_CRITICAL();//開中斷返回}OSIntExit()voidOSIntExit(voiOSIntCtxSw()在任務(wù)切換時,為什么使用OSIntCtxSw()而不是調(diào)度函數(shù)中的OS_TASK_SW()?原因有二點一半的任務(wù)切換工作,即CPU寄存器入棧,已經(jīng)在前面做完了;需要保證所有被掛起任務(wù)的棧結(jié)構(gòu)是一樣的。OSIntCtxSw()在任務(wù)切換時,為什么使用OSIntCOSIntExit的關(guān)鍵——OSIntCtxSw實現(xiàn)中斷級的任務(wù)切換ARM在棧指針調(diào)整過程中的優(yōu)勢OSIntExit的關(guān)鍵——OSIntCtxSw實現(xiàn)中斷級的調(diào)用中斷切換函數(shù)OSIntCtxSw()后的堆棧情況調(diào)用中斷切換函數(shù)OSIntCtxSw()后的堆棧情況時鐘節(jié)拍時鐘節(jié)拍是一種特殊的中斷,相當于操作系統(tǒng)的心臟起搏器;μC/OS需要用戶提供周期性信號源,用于實現(xiàn)時間延時和確認超時。節(jié)拍率應(yīng)在10到100Hz之間,時鐘節(jié)拍率越高,系統(tǒng)的額外負荷就越重;時鐘節(jié)拍的實際頻率取決于用戶應(yīng)用程序的精度。時鐘節(jié)拍源可以是專門的硬件定時器,或是來自50/60Hz交流電源的信號。時鐘節(jié)拍時鐘節(jié)拍是一種特殊的中斷,相當于操作系統(tǒng)的心臟起搏器時鐘節(jié)拍ISRvoidOSTickISR(void){

(1)保存處理器寄存器的值;

(2)調(diào)用OSIntEnter()或?qū)SIntNesting加1;

(3)調(diào)用OSTimeTick();/*檢查每個任務(wù)的時間延時*/

(4)調(diào)用OSIntExit();

(5)恢復處理器寄存器的值;

(6)執(zhí)行中斷返回指令;}時鐘節(jié)拍ISRvoidOSTickISR(void)時鐘節(jié)拍函數(shù)OSTimtick()時鐘節(jié)拍函數(shù)OSTimtick()時間管理與時間管理相關(guān)的系統(tǒng)服務(wù):OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()時間管理與時間管理相關(guān)的系統(tǒng)服務(wù):OSTimeDLY()OSTimeDLY():任務(wù)延時函數(shù),申請該服務(wù)的任務(wù)可以延時一段時間;調(diào)用OSTimeDLY后,任務(wù)進入等待狀態(tài);使用方法voidOSTimeDly(INT16Uticks);ticks表示需要延時的時間長度,用時鐘節(jié)拍的個數(shù)來表示。OSTimeDLY()OSTimeDLY():任務(wù)延時函數(shù),OSTimeDLY()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();}}OSTimeDLY()voidOSTimeDly(INTOSTimeDLY(1)的問題OSTimeDLY(1)的問題OSTimeDlyHMSM()OSTimeDlyHMSM():OSTimeDly()的另一個版本,即按時分秒延時函數(shù);使用方法INT8UOSTimeDlyHMSM(

INT8Uhours,//小時

INT8Uminutes,//分鐘

INT8Useconds,//秒

INT16Umilli//毫秒

);OSTimeDlyHMSM()OSTimeDlyHMSM()OSTimeDlyResume()OSTimeDlyResume():讓處在延時期的任務(wù)提前結(jié)束延時,進入就緒狀態(tài);使用方法INT8UOSTimeDlyResume(INT8U

prio);prio表示需要提前結(jié)束延時的任務(wù)的優(yōu)先級/任務(wù)ID。OSTimeDlyResume()OSTimeDlyResu系統(tǒng)時間每隔一個時鐘節(jié)拍,發(fā)生一個時鐘中斷,將一個32位的計數(shù)器OSTime加1;該計數(shù)器在用戶調(diào)用OSStart()初始化多任務(wù)和4,294,967,295個節(jié)拍執(zhí)行完一遍的時候從0開始計數(shù)。若時鐘節(jié)拍的頻率等于100Hz,該計數(shù)器每隔497天就重新開始計數(shù);OSTimeGet():獲得該計數(shù)器的當前值;INT32UOSTimeGet(void);OSTimeSet():設(shè)置該計數(shù)器的值。voidOSTimeSet(INT32Uticks);系統(tǒng)時間每隔一個時鐘節(jié)拍,發(fā)生一個時鐘中斷,將一個32位的計何時啟動系統(tǒng)定時器如果在OSStart之前啟動定時器,則系統(tǒng)可能無法正確執(zhí)行完OSStartHighRdyOSStart函數(shù)直接調(diào)用OSStartHighRdy去執(zhí)行最高優(yōu)先級的任務(wù),OSStart不返回。系統(tǒng)定時器應(yīng)該在系統(tǒng)的最高優(yōu)先級任務(wù)中啟動使用OSRunning變量來控制操作系統(tǒng)的運行在我們的移植版本中,使用了uCOS-II中的保留任務(wù)1作為系統(tǒng)任務(wù)。負責啟動定時器何時啟動系統(tǒng)定時器如果在OSStart之前啟動定時器,則系統(tǒng)時鐘節(jié)拍的啟動用戶必須在多任務(wù)系統(tǒng)啟動以后再開啟時鐘節(jié)拍器,也就是在調(diào)用OSStart()之后;在調(diào)用OSStart()之后做的第一件事是初始化定時器中斷。voidmain(void){...OSInit();/*初始化uC/OS-II*//*應(yīng)用程序初始化代碼...*//*調(diào)用OSTaskCreate()創(chuàng)建至少一個任務(wù)*/

允許時鐘節(jié)拍中斷;/*錯誤!可能crash!*/OSStart();/*開始多任務(wù)調(diào)度*/}時鐘節(jié)拍的啟動用戶必須在多任務(wù)系統(tǒng)啟動以后再開啟時鐘節(jié)拍器,系統(tǒng)的初始化與啟動在調(diào)用

C/OS-II的任何其它服務(wù)之前,用戶必須首先調(diào)用系統(tǒng)初始化函數(shù)OSInit()來初始化

C/OS的所有變量和數(shù)據(jù)結(jié)構(gòu);OSInit()建立空閑任務(wù)OSTaskIdle(),該任務(wù)總是處于就緒狀態(tài),其優(yōu)先級一般被設(shè)成最低,即OS_LOWEST_PRIO;如果需要,OSInit()還建立統(tǒng)計任務(wù)OSTaskStat(),并讓其進入就緒狀態(tài);OSInit()還初始化了4個空數(shù)據(jù)結(jié)構(gòu)緩沖區(qū):空閑TCB鏈表OSTCBFreeList、空閑事件鏈表OSEventFreeList、空閑隊列鏈表OSQFreeList和空閑存儲鏈表OSMemFreeList。系統(tǒng)的初始化與啟動在調(diào)用C/OS-II的任何其它服務(wù)之前,系統(tǒng)初始化后的狀態(tài)系統(tǒng)初始化后的狀態(tài)C/OS-II的啟動多任務(wù)的啟動是用戶通過調(diào)用OSStart()實現(xiàn)的。然而,啟動μC/OS-Ⅱ之前,用戶至少要建立一個應(yīng)用任務(wù)。voidmain(void){OSInit();/*初始化uC/OS-II*/...

通過調(diào)用OSTaskCreate()或OSTaskCreateExt()

創(chuàng)建至少一個任務(wù);...

OSStart();

/*開始多任務(wù)調(diào)度!永不返回*/

}C/OS-II的啟動多任務(wù)的啟動是用戶通過調(diào)用OSStarOSStart()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();}}OSStart()voidOSStart(void)統(tǒng)計任務(wù)初始化函數(shù)OSStatInit(void)統(tǒng)計任務(wù)初始化函數(shù)OSStatInit(void)統(tǒng)計任務(wù)初始化統(tǒng)計任務(wù)初始化系統(tǒng)啟動后的狀態(tài)假設(shè)用戶創(chuàng)建的任務(wù)優(yōu)先級為6系統(tǒng)啟動后的狀態(tài)假設(shè)用戶創(chuàng)建的1324

C/OS-II概述任務(wù)管理中斷和時間管理任務(wù)之間的通信與同步5存儲管理1324C/OS-II概述任務(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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論