資源描述:
《任哲--嵌入式實(shí)時(shí)操作系統(tǒng)uCOS-II講座2》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、μC/OS-II中的任務(wù)管理任務(wù)的狀態(tài)及其轉(zhuǎn)換正在運(yùn)行的任務(wù),需要等待一段時(shí)間或需要等待一個(gè)事件發(fā)生再運(yùn)行時(shí),該任務(wù)就會把CPU的使用權(quán)讓給別的任務(wù)而使任務(wù)進(jìn)入等待狀態(tài)。任務(wù)在沒有被配備任務(wù)控制塊或被剝奪了任務(wù)控制塊時(shí)的狀態(tài)叫做任務(wù)的睡眠狀態(tài)系統(tǒng)為任務(wù)配備了任務(wù)控制塊且在任務(wù)就緒表中進(jìn)行了就緒登記,這時(shí)任務(wù)的狀態(tài)叫做就緒狀態(tài)。處于就緒狀態(tài)的任務(wù)如果經(jīng)調(diào)度器判斷獲得了CPU的使用權(quán),則任務(wù)就進(jìn)入運(yùn)行狀態(tài)一個(gè)正在運(yùn)行的任務(wù)一旦響應(yīng)中斷申請就會中止運(yùn)行而去執(zhí)行中斷服務(wù)程序,這時(shí)任務(wù)的狀態(tài)叫做中斷服務(wù)狀態(tài)前面談到
2、,一個(gè)任務(wù)的任務(wù)控制塊的主要作用就是保存該任務(wù)的虛擬處理器的堆棧指針寄存器SP。其實(shí),隨著任務(wù)管理工作的復(fù)雜性的提高,它還應(yīng)該保存一些其他信息。任務(wù)控制塊——任務(wù)在系統(tǒng)中的身份證由于系統(tǒng)存在著多個(gè)任務(wù),于是系統(tǒng)如何來識別并管理一個(gè)任務(wù)就是一個(gè)需要解決的問題。識別一個(gè)任務(wù)的最直接的辦法是為每一個(gè)任務(wù)起一個(gè)名稱。由于μC/OS-II中的任務(wù)都有一個(gè)惟一的優(yōu)先級別,因此μC/OS-II是用任務(wù)的優(yōu)先級來作為任務(wù)的標(biāo)識的。所以,任務(wù)控制塊還要來保存該任務(wù)的優(yōu)先級別。另外,前面也談到,一個(gè)任務(wù)在不同的時(shí)刻還處于不同
3、的狀態(tài),顯然,記錄了任務(wù)狀態(tài)的數(shù)據(jù)也應(yīng)該保存到任務(wù)控制塊中?;谏鲜鲈颍到y(tǒng)必須為每個(gè)任務(wù)創(chuàng)建一個(gè)保存與該任務(wù)有關(guān)的相關(guān)信息的數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)就叫做該任務(wù)的任務(wù)控制塊(TCB)。任務(wù)控制塊結(jié)構(gòu)的主要成員typedefstructos_tcb{OS_STK*OSTCBStkPtr;//指向任務(wù)堆棧棧頂?shù)闹羔槨璉NT8UOSTCBStat;//任務(wù)的當(dāng)前狀態(tài)標(biāo)志INT8UOSTCBPrio;//任務(wù)的優(yōu)先級別……}OS_TCB;任務(wù)控制塊是不是像我們?nèi)嗽谝粋€(gè)國家中的身份證?(其實(shí),系統(tǒng)中的所有資源都
4、應(yīng)該有身份證。)任務(wù)在內(nèi)存中的結(jié)構(gòu)用戶任務(wù)代碼的一般結(jié)構(gòu)voidMyTask(void*pdata){for(;;){可以被中斷的用戶代碼;OS_ENTER_CRITICAL();//進(jìn)入臨界段(關(guān)中斷)不可以被中斷的用戶代碼;OS_EXIT_CRITICAL();//退出臨界段(開中斷)可以被中斷的用戶代碼;}}臨界段無限循環(huán)于是可以這樣說,μC/OS-II任務(wù)的代碼結(jié)構(gòu)是一個(gè)可以帶有臨界段的無限循環(huán)。系統(tǒng)提供的空閑任務(wù)在多任務(wù)系統(tǒng)運(yùn)行時(shí),系統(tǒng)經(jīng)常會在某個(gè)時(shí)間內(nèi)無用戶任務(wù)可運(yùn)行而處于所謂的空閑狀態(tài),為了
5、使CPU在沒有用戶任務(wù)可執(zhí)行的時(shí)候有事可做,μC/OS-II提供了一個(gè)叫做空閑任務(wù)OSTaskIdle()的系統(tǒng)任務(wù)voidOSTaskIdle(void*pdata){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;//防止某些編譯器報(bào)錯for(;;){OS_ENTER_CRITICAL();//關(guān)閉中斷OSdleCtr++;//計(jì)數(shù)OS_EXIT_CRITICAL();//開放中斷}}空閑任務(wù)只是做了一個(gè)計(jì)數(shù)工作注意!空閑任務(wù)中沒有調(diào)
6、用任務(wù)延時(shí)函數(shù)μC/OS-II規(guī)定,一個(gè)用戶應(yīng)用程序必須使用這個(gè)空閑任務(wù),而且這個(gè)任務(wù)是不能用軟件來刪除的系統(tǒng)提供的另一個(gè)任務(wù)——統(tǒng)計(jì)任務(wù)μC/OS-II提供的另一個(gè)系統(tǒng)任務(wù)是統(tǒng)計(jì)任務(wù)OSTaskStat()。這個(gè)統(tǒng)計(jì)任務(wù)每秒計(jì)算一次CPU在單位時(shí)間內(nèi)被使用的時(shí)間,并把計(jì)算結(jié)果以百分比的形式存放在變量OSCPUsage中,以便應(yīng)用程序通過訪問它來了解CPU的利用率,所以這個(gè)系統(tǒng)任務(wù)OSTaskStat()叫做統(tǒng)計(jì)任務(wù)任務(wù)的優(yōu)先權(quán)及優(yōu)先級別μC/OS_II把任務(wù)的優(yōu)先權(quán)分為64個(gè)優(yōu)先級別,每一個(gè)級別都用一個(gè)
7、數(shù)字來表示。數(shù)字0表示任務(wù)的優(yōu)先級別最高,數(shù)字越大則表示任務(wù)的優(yōu)先級別越低用戶可以根據(jù)應(yīng)用程序的需要,在文件OS_CFG.H中通過給表示最低優(yōu)先級別的常數(shù)OS_LOWEST_PRIO賦值的方法,來說明應(yīng)用程序中任務(wù)優(yōu)先級別的數(shù)目。該常數(shù)一旦被定義,則意味著系統(tǒng)中可供使用的優(yōu)先級別為:0,1,2,……,OS_LOWEST_PRIO,共OS_LOWEST_PRIO+1個(gè)固定地,系統(tǒng)總是把最低優(yōu)先級別OS_LOWEST_PRIO自動賦給空閑任務(wù)。如果應(yīng)用程序中還使用了統(tǒng)計(jì)任務(wù),系統(tǒng)則會把優(yōu)先級別OS_LOWES
8、T_PRIO-1自動賦給統(tǒng)計(jì)任務(wù),因此用戶任務(wù)可以使用的優(yōu)先級別是:0,1,2…OS_LOWEST_PRIO-2,共OS_LOWEST_PRIO-1個(gè)任務(wù)堆棧保存CPU寄存器中的內(nèi)容及存儲任務(wù)私有數(shù)據(jù)的需要,每個(gè)任務(wù)都應(yīng)該配有自己的堆棧,任務(wù)堆棧是任務(wù)的重要的組成部分在應(yīng)用程序中定義任務(wù)堆棧的棧區(qū)非常簡單,即定義一個(gè)OS_STK類型的一個(gè)數(shù)組并在創(chuàng)建一個(gè)任務(wù)時(shí)把這個(gè)數(shù)組的地址賦給該任務(wù)就可以了。例如://定義堆棧的長度#def