版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 實(shí)驗(yàn)六 uC/OS-II在ARM上的移植一、 實(shí)驗(yàn)?zāi)康?.了解UC/OS-II內(nèi)核的主要結(jié)構(gòu)。2.掌握將UC/OS-II內(nèi)核移植到ARM9處理器上的基本方法。二、 預(yù)備知識(shí)1.掌握在ADS1.2集成開(kāi)發(fā)環(huán)境中編寫(xiě)和調(diào)試程序的基本過(guò)程。2.會(huì)使用UltraEdit編輯C語(yǔ)言源程序。3.了解ARM9處理器的結(jié)構(gòu)。4.了解UC/OS-II系統(tǒng)結(jié)構(gòu)。三、 uc/os簡(jiǎn)介uC/OS-II是支持微處理器和微控制器的具有可移植性,可剪裁,搶先實(shí)時(shí),多任務(wù)管理的微內(nèi)核實(shí)時(shí)操作系統(tǒng)。z可移植性體現(xiàn)在絕大部分的uC/OS-II的源代碼是用移植性很強(qiáng)的標(biāo)準(zhǔn)C語(yǔ)言寫(xiě)的;源程序中只有和微處理器硬件相關(guān)的那部分使用匯編
2、語(yǔ)言寫(xiě),并且這些匯編代碼已經(jīng)壓縮到最低限度;uC/OS-II可在絕大多數(shù)8位、16位、32位、64位微處理器、微控制器、數(shù)字信號(hào)處理器(DSP上運(yùn)行。z可剪裁當(dāng)用戶不需要使用uC/OS-II的全部功能模塊時(shí),可以在應(yīng)用程序中通過(guò)語(yǔ)句來(lái)定義所需的uC/OS-II功能模塊,以減少不必要的存儲(chǔ)器空間的開(kāi)支。z搶先實(shí)時(shí)總是運(yùn)行就緒條件下優(yōu)先級(jí)最高的任務(wù)。大多數(shù)商業(yè)操作系統(tǒng)內(nèi)核都是占先式的。z多任務(wù)管理uC/OS-II可以管理64個(gè)任務(wù),其中8個(gè)系統(tǒng)任務(wù),應(yīng)用程序最多可以有56個(gè)任務(wù)。它的每個(gè)任務(wù)的優(yōu)先級(jí)都不相同。z中斷管理中斷可以使正在執(zhí)行的任務(wù)暫時(shí)掛起,如果優(yōu)先級(jí)更高的任務(wù)被該中斷喚醒,則高優(yōu)先級(jí)的
3、任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)255層。除以上介紹的特點(diǎn)外,uC/OS-II還包括其它一些特點(diǎn),如:公開(kāi)源代碼、可固化、可確定性、任務(wù)棧、提供很多系統(tǒng)服務(wù)、穩(wěn)定性和可靠性強(qiáng)等。 四、uC/OS-II的體系結(jié)構(gòu)uC/OS-II包括三個(gè)部分,應(yīng)用軟件基于uC/OS-II之上,uC/OS-II的第一部分是核心代碼部分,這部分代碼與處理器無(wú)關(guān),包括七個(gè)源代碼文件和一個(gè)頭文件,七個(gè)源代碼文件分別是核心部分,包括事件的管理,消息隊(duì)列的管理,存儲(chǔ)管理,消息管理,信號(hào)量處理,任務(wù)調(diào)度和定時(shí)管理。uC/OS-II的第二部分是設(shè)置代碼部分,包括兩個(gè)頭文件,用戶在設(shè)置代碼中可以配置事件控制塊的數(shù)
4、目以及是否包含消息管理相關(guān)的代碼等。uC/OS-II的第三部分是與處理器的移植代碼部分,這一部分包括一個(gè)頭文件,一個(gè)匯編文件和一個(gè)C代碼文件,在uC/OS-II的移植過(guò)程中,用戶所需要關(guān)注的就是這三個(gè)文件。 五、uC/OS-II的移植條件移植uC/OS-II到處理器上必須滿足以下幾個(gè)條件:處理器的C編譯器能產(chǎn)生可重入代碼,可重入代碼指的是可以被多個(gè)任務(wù)同時(shí)調(diào)用,而不會(huì)破壞數(shù)據(jù)的一段代碼,或者說(shuō)代碼具有在執(zhí)行過(guò)程中打斷后再次被調(diào)用的能力。用C語(yǔ)言就可以打開(kāi)和關(guān)閉中斷。uC/OS-II在C語(yǔ)言代碼中通過(guò)使用以下兩個(gè)宏OS_ENTER_CRITICAL ( OS_EXIT_CRITICAL(打開(kāi)和關(guān)
5、閉中斷,從而保護(hù)臨界代碼,這是uC/OS-II要求用C語(yǔ)言可以打開(kāi)關(guān)閉中斷的原因。處理器支持中斷并且能產(chǎn)生定時(shí)中斷; 處理器支持容納一定量數(shù)據(jù)的硬件堆棧,比如說(shuō)有些8位控制器只有10根地址線,最多可訪問(wèn)1K存儲(chǔ)單元,這樣的條件下移植就很困難;處理器有將堆棧指針和其他CPU寄存器讀出和存儲(chǔ)到堆棧或內(nèi)存中的指令,ARM處理器中匯編指令stmfd可以將所有寄存器壓棧,對(duì)應(yīng)也有一個(gè)出棧的指令ldmfd;六、移植工作包括以下幾個(gè)內(nèi)容:1.用#define設(shè)置一個(gè)常量的值(OS_CPU.H。2.聲明10個(gè)數(shù)據(jù)類(lèi)型(OS_CPU.H。3.用#define聲明三個(gè)宏(OS_CPU.H。4.用C語(yǔ)言編寫(xiě)六個(gè)簡(jiǎn)單
6、的函數(shù)(OS_CPU_C.C。5.編寫(xiě)四個(gè)匯編語(yǔ)言函數(shù)(OS_CPU_A.ASM。移植uCOS分三個(gè)步驟,依次是常量和宏定義、移植匯編代碼文件 OS_CPU_A.ASM、移植C語(yǔ)言源代碼文件OS_CPU_C.C。(1常量和宏定義首先是定義與編譯器相關(guān)的數(shù)據(jù)類(lèi)型,uC/OS-II為了保證可移植性,程序中沒(méi)有直接使用int,unsinged int等定義,而是自己定義了一套數(shù)據(jù)類(lèi)型,如INT16U表示16位無(wú)符號(hào)整型,對(duì)于ARM這樣的32位內(nèi)核,INT16U是unsigned short型,如果是16位的處理器,則是unsigned int型。其次是定義允許和禁止中斷。然后是定義棧的增長(zhǎng)方向。最后
7、是定義OS_TASK_SW宏,這個(gè)宏是uC/OS-II從低優(yōu)先級(jí)任務(wù)切換到高優(yōu)先級(jí)任務(wù)時(shí)調(diào)用,可以采用下面兩種方式定義,如果處理器支持軟中斷,可以使用軟中斷將中斷向量指向OSCtxSw函數(shù),或者直接調(diào)用OSCrxSw函數(shù)。關(guān)于OSCtxSW函數(shù),我們將在下一節(jié)提到。OS_CPU_A.ASM文件里面有四個(gè)函數(shù)需要移植。第一個(gè)函數(shù)是OSStartHighRdy,這個(gè)函數(shù)由OSStart函數(shù)調(diào)用,OSStart( 負(fù)責(zé)使就緒狀態(tài)的任務(wù)開(kāi)始運(yùn)行,其中OSStartHighRdy負(fù)責(zé)獲取新任務(wù)的堆棧指針并從堆棧指針中恢復(fù)新任務(wù)的所有處理器寄存器。這個(gè)函數(shù)要移植的原因就是因?yàn)樗婕暗奖4嫣幚砥骷拇嫫鞯蕉褩?/p>
8、,這是我們前面提到的處理器支持移植的條件。第二個(gè)函數(shù)是OSCtxSw,這個(gè)函數(shù)由OS_TASK_SW宏調(diào)用,OS_TASK_SW由OSSched( 調(diào)用,OSSched( 負(fù)責(zé)任務(wù)之間的切換;OSCtxSw( 在OSSched( 函數(shù)中負(fù)責(zé)保存當(dāng)前任務(wù)對(duì)應(yīng)的處理器寄存器到堆棧中,并將需要恢復(fù)的任務(wù)對(duì)應(yīng)的處理器寄存器從堆棧中恢復(fù)出來(lái)。 第三個(gè)函數(shù)是OSIntCtxSw,這個(gè)函數(shù)由OSIntExit( 調(diào)用,OSTickISR由OSTickISR調(diào)用,負(fù)責(zé)在定時(shí)中斷中的任務(wù)之間的切換,剛才講的函數(shù)OSCtxSw和本函數(shù)都時(shí)負(fù)責(zé)任務(wù)之間的切換,區(qū)別主要就在于一個(gè)在定時(shí)中斷中間負(fù)責(zé),一個(gè)不是。OSIn
9、tCtxSw( 主要保存當(dāng)前任務(wù)堆棧指針,并將新任務(wù)對(duì)應(yīng)的處理器寄存器從堆棧中恢復(fù)出來(lái)。源文件OS_CPU_C.C中有六個(gè)函數(shù)需要移植,對(duì)于其中五個(gè)HooK函數(shù),它們又稱(chēng)為鉤子函數(shù),主要用來(lái)擴(kuò)展uC/OS-II功能,必須聲明,但并不一定要包含任何代碼。所以唯一必需移植的函數(shù)只有OSTaskStkInit函數(shù),這個(gè)函數(shù)在任務(wù)創(chuàng)建時(shí)調(diào)用,負(fù)責(zé)初始化任務(wù)的堆棧結(jié)構(gòu)。這個(gè)函數(shù)在幾乎所有型號(hào)的ARM處理器中移植時(shí)都可以采用一種形式,大家在移植中可以使用。完成了上述工作以后,COS-II就可以正常運(yùn)行在ARM處理器上了。附錄1.0 uC/OS-II實(shí)時(shí)系統(tǒng)的概念實(shí)時(shí)系統(tǒng)的特點(diǎn)是,如果邏輯和時(shí)序出現(xiàn)偏差將會(huì)
10、引起嚴(yán)重后果的系統(tǒng)。有兩種類(lèi)型的實(shí)時(shí)系統(tǒng):軟實(shí)時(shí)系統(tǒng)和硬實(shí)時(shí)系統(tǒng)。在軟實(shí)時(shí)系統(tǒng)中系統(tǒng)的宗旨是使各個(gè)任務(wù)運(yùn)行得越快越好,并不要求限定某一任務(wù)必須在多長(zhǎng)時(shí)間內(nèi)完成。在硬實(shí)時(shí)系統(tǒng)中,各任務(wù)不僅要執(zhí)行無(wú)誤而且要做到準(zhǔn)時(shí)。大多數(shù)實(shí)時(shí)系統(tǒng)是二者的結(jié)合。實(shí)時(shí)系統(tǒng)的應(yīng)用涵蓋廣泛的領(lǐng)域,而多數(shù)實(shí)時(shí)系統(tǒng)又是嵌入式的。這意味著計(jì)算機(jī)建在系統(tǒng)內(nèi)部,用戶看不到有個(gè)計(jì)算機(jī)在系統(tǒng)里面。2.0 前后臺(tái)系統(tǒng)(Foreground/Background System不復(fù)雜的小系統(tǒng)一般設(shè)計(jì)成如圖2.1所示的樣子。這種系統(tǒng)可稱(chēng)為前后臺(tái)系統(tǒng)或超循環(huán)系統(tǒng)(Super-Loops。應(yīng)用程序是一個(gè)無(wú)限的循環(huán),循環(huán)中調(diào)用相應(yīng)的函數(shù)完成相應(yīng)的操
11、作,這部分可以看成后臺(tái)行為(background。中斷服務(wù)程序處理異步事件,這部分可以看成前臺(tái)行為(foreground。后臺(tái)也可以叫做任務(wù)級(jí)。前臺(tái)也叫中斷級(jí)。時(shí)間相關(guān)性很強(qiáng)的關(guān)鍵操作(Critical operation一定是靠中斷服務(wù)來(lái)保證的。因?yàn)橹袛喾?wù)提供的信息一直要等到后臺(tái)程序走到該處理這個(gè)信息這一步時(shí)才能得到處理,這種系統(tǒng)在處理信息的及時(shí)性上,比實(shí)際可以做到的要差。這個(gè)指標(biāo)稱(chēng)作任務(wù)級(jí)響應(yīng)時(shí)間。最壞情況下的任務(wù)級(jí)響應(yīng)時(shí)間取決于整個(gè)循環(huán)的執(zhí)行時(shí)間。因?yàn)檠h(huán)的執(zhí)行時(shí)間不是常數(shù),程序經(jīng)過(guò)某一特定部分的準(zhǔn)確時(shí)間也是不能確定的。進(jìn)而,如果程序修改了,循環(huán)的時(shí)序也會(huì)受到影響。 圖2-1前后臺(tái)系統(tǒng)
12、很多基于微處理器的產(chǎn)品采用前后臺(tái)系統(tǒng)設(shè)計(jì),例如微波爐、電話機(jī)、玩具等。在另外一些基于微處理器的應(yīng)用中,從省電的角度出發(fā),平時(shí)微處理器處在停機(jī)狀態(tài)(halt,所有的事都靠中斷服務(wù)來(lái)完成。代碼的臨界段也稱(chēng)為臨界區(qū),指處理時(shí)不可分割的代碼。一旦這部分代碼開(kāi)始執(zhí)行,則不允許任何中斷打入。為確保臨界段代碼的執(zhí)行,在進(jìn)入臨界段之前要關(guān)中斷,而臨界段代碼執(zhí)行完以后要立即開(kāi)中斷。2.1 資源任何為任務(wù)所占用的實(shí)體都可稱(chēng)為資源。資源可以是輸入輸出設(shè)備,例如打印機(jī)、鍵盤(pán)、顯示器,資源也可以是一個(gè)變量,一個(gè)結(jié)構(gòu)或一個(gè)數(shù)組等。可以被一個(gè)以上任務(wù)使用的資源叫做共享資源。為了防止數(shù)據(jù)被破壞,每個(gè)任務(wù)在與共享資源打交道時(shí),
13、必須獨(dú)占該資源。這叫做互斥(mutual exclusion。在2.18節(jié)“互斥”中,將對(duì)技術(shù)上如何保證互斥條件做進(jìn)一步討論。多任務(wù)運(yùn)行的實(shí)現(xiàn)實(shí)際上是靠CPU(中央處理單元在許多任務(wù)之間轉(zhuǎn)換、調(diào)度。CPU只有一個(gè),輪番服務(wù)于一系列任務(wù)中的某一個(gè)。多任務(wù)運(yùn)行很像前后臺(tái)系統(tǒng),但后臺(tái)任務(wù)有多個(gè)。多任務(wù)運(yùn)行使CPU的利用率得到最大的發(fā)揮,并使應(yīng)用程序模塊化。在實(shí)時(shí)應(yīng)用中,多任務(wù)化的最大特點(diǎn)是,開(kāi)發(fā)人員可以將很復(fù)雜的應(yīng)用程序?qū)哟位?。使用多任?wù),應(yīng)用程序?qū)⒏菀自O(shè)計(jì)與維護(hù)。 一個(gè)任務(wù),也稱(chēng)作一個(gè)線程,是一個(gè)簡(jiǎn)單的程序,該程序可以認(rèn)為CPU完全只屬該程序自己。實(shí)時(shí)應(yīng)用程序的設(shè)計(jì)過(guò)程,包括如何把問(wèn)題分割成多個(gè)
14、任務(wù),每個(gè)任務(wù)都是整個(gè)應(yīng)用的某一部分,每個(gè)任務(wù)被賦予一定的優(yōu)先級(jí),有它自己的一套CPU寄存器和自己的??臻g(如圖2.2所示。 典型地、每個(gè)任務(wù)都是一個(gè)無(wú)限的循環(huán)。每個(gè)任務(wù)都處在以下5種狀態(tài)之一的狀態(tài)下,這5種狀態(tài)是休眠態(tài),就緒態(tài)、運(yùn)行態(tài)、掛起態(tài)(等待某一事件發(fā)生和被中斷態(tài)(參見(jiàn)圖2.3休眠態(tài)相當(dāng)于該任務(wù)駐留在內(nèi)存中,但并不被多任務(wù)內(nèi)核所調(diào)度。就緒意味著該任務(wù)已經(jīng)準(zhǔn)備好,可以運(yùn)行了,但由于該任務(wù)的優(yōu)先級(jí)比正在運(yùn)行的任務(wù)的優(yōu)先級(jí)低,還暫時(shí)不能運(yùn)行。運(yùn)行態(tài)的任務(wù)是指該任務(wù)掌握了CPU的控制權(quán),正在運(yùn)行中。掛起狀態(tài)也可以叫做等待事件態(tài)WAITING,指該任務(wù)在等待,等待某一事件的發(fā)生,(例如等待某外設(shè)
15、的I/O操作,等待某共享資源由暫不能使用變成能使用狀態(tài),等待定時(shí)脈沖的到來(lái)或等待超時(shí)信號(hào)的到來(lái)以結(jié)束目前的等待,等等。最后,發(fā)生中斷時(shí),CPU提供相應(yīng)的中斷服務(wù),原來(lái)正在運(yùn)行的任務(wù)暫不能運(yùn)行,就進(jìn)入了被中斷狀態(tài)。圖2.3表示C/OS-中一些函數(shù)提供的服務(wù),這些函數(shù)使任務(wù)從一種狀態(tài)變到另一種狀態(tài)。 2.5任務(wù)切換(Context Switch or Task SwitchContext Switch 在有的書(shū)中翻譯成上下文切換,實(shí)際含義是任務(wù)切換,或CPU寄存器內(nèi)容切換。當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí),它保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài)(Context,即CPU寄存器中的全部?jī)?nèi)容。這些內(nèi)容保存在任務(wù)
16、的當(dāng)前狀況保存區(qū)(Tasks Context Storage area,也就是任務(wù)自己的棧區(qū)之中。(見(jiàn)圖2.2。入棧工作完成以后,就是把下一個(gè)將要運(yùn)行的任務(wù)的當(dāng)前狀況從該任務(wù)的棧中重新裝入CPU的寄存器,并開(kāi)始下一個(gè)任務(wù)的運(yùn)行。這個(gè)過(guò)程叫做任務(wù)切換。任務(wù)切換過(guò)程增加了應(yīng)用程序的額外負(fù)荷。CPU的內(nèi)部寄存器越多,額外負(fù)荷就越重。做任務(wù)切換所需要的時(shí)間取決于CPU有多少寄存器要入棧。實(shí)時(shí)內(nèi)核的性能不應(yīng)該以每秒鐘能做多少次任務(wù)切換來(lái)評(píng)價(jià)。2.6內(nèi)核(Kernel多任務(wù)系統(tǒng)中,內(nèi)核負(fù)責(zé)管理各個(gè)任務(wù),或者說(shuō)為每個(gè)任務(wù)分配CPU時(shí)間,并且負(fù)責(zé)任務(wù)之間的通訊。內(nèi)核提供的基本服務(wù)是任務(wù)切換。之所以使用實(shí)時(shí)內(nèi)核
17、可以大大簡(jiǎn)化應(yīng)用系統(tǒng)的設(shè)計(jì),是因?yàn)閷?shí)時(shí)內(nèi)核允許將應(yīng)用分成若干個(gè)任務(wù),由實(shí)時(shí)內(nèi)核來(lái)管理它們。內(nèi)核本身也增加了應(yīng)用程序的額外負(fù)荷,代碼空間增加ROM的用量,內(nèi)核本身的數(shù)據(jù)結(jié)構(gòu)增加了RAM 的用量。但更主要的是,每個(gè)任務(wù)要有自己的棧空間,這一塊吃起內(nèi)存來(lái)是相當(dāng)厲害的。內(nèi)核本身對(duì)CPU的占用時(shí)間一般在2到5個(gè)百分點(diǎn)之間。單片機(jī)一般不能運(yùn)行實(shí)時(shí)內(nèi)核,因?yàn)閱纹瑱C(jī)的RAM很有限。通過(guò)提供必不可缺少的系統(tǒng)服務(wù),諸如信號(hào)量管理,郵箱、消息隊(duì)列、延時(shí)等,實(shí)時(shí)內(nèi)核使得CPU的利用更為有效。一旦讀者用實(shí)時(shí)內(nèi)核做過(guò)系統(tǒng)設(shè)計(jì),將決不再想返回到前后臺(tái)系統(tǒng)。 2.7調(diào)度(Scheduler調(diào)度(Scheduler,英文還有一
18、詞叫dispatcher,也是調(diào)度的意思。這是內(nèi)核的主要職責(zé)之一,就是要決定該輪到哪個(gè)任務(wù)運(yùn)行了。多數(shù)實(shí)時(shí)內(nèi)核是基于優(yōu)先級(jí)調(diào)度法的。每個(gè)任務(wù)根據(jù)其重要程度的不同被賦予一定的優(yōu)先級(jí)?;趦?yōu)先級(jí)的調(diào)度法指,CPU總是讓處在就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)先運(yùn)行。然而,究竟何時(shí)讓高優(yōu)先級(jí)任務(wù)掌握CPU的使用權(quán),有兩種不同的情況,這要看用的是什么類(lèi)型的內(nèi)核,是不可剝奪型的還是可剝奪型內(nèi)核。2.8不可剝奪型內(nèi)核(Non-Preemptive Kernel不可剝奪型內(nèi)核要求每個(gè)任務(wù)自我放棄CPU的所有權(quán)。不可剝奪型調(diào)度法也稱(chēng)作合作型多任務(wù),各個(gè)任務(wù)彼此合作共享一個(gè)CPU。異步事件還是由中斷服務(wù)來(lái)處理。中斷服務(wù)可以
19、使一個(gè)高優(yōu)先級(jí)的任務(wù)由掛起狀態(tài)變以后控制權(quán)還是回到原來(lái)被中斷了的那個(gè)任務(wù),直到該任務(wù)主動(dòng)放棄CPU的使用權(quán)時(shí),那個(gè)高優(yōu)先級(jí)的任務(wù)才能獲得CPU的使用權(quán)。不可剝奪型內(nèi)核的一個(gè)優(yōu)點(diǎn)是響應(yīng)中斷快。在討論中斷響應(yīng)時(shí)會(huì)進(jìn)一步涉及這個(gè)問(wèn)題。在任務(wù)級(jí),不可剝奪型內(nèi)核允許使用不可重入函數(shù)。函數(shù)的可重入性以后會(huì)討論。每個(gè)任務(wù)都可以調(diào)用非可重入性函數(shù),而不必?fù)?dān)心其它任務(wù)可能正在使用該函數(shù),從而造成數(shù)據(jù)的破壞。因?yàn)槊總€(gè)任務(wù)要運(yùn)行到完成時(shí)才釋放CPU的控制權(quán)。當(dāng)然該不可重入型函數(shù)本身不得有放棄CPU控制權(quán)的企圖。使用不可剝奪型內(nèi)核時(shí),任務(wù)級(jí)響應(yīng)時(shí)間比前后臺(tái)系統(tǒng)快得多。此時(shí)的任務(wù)級(jí)響應(yīng)時(shí)間取決于最長(zhǎng)的任務(wù)執(zhí)行時(shí)間。不可
20、剝奪型內(nèi)核的另一個(gè)優(yōu)點(diǎn)是,幾乎不需要使用信號(hào)量保護(hù)共享數(shù)據(jù)。運(yùn)行著的任務(wù)占有CPU,而不必?fù)?dān)心被別的任務(wù)搶占。但這也不是絕對(duì)的,在某種情況下,信號(hào)量還是用得著的。處理共享I/O設(shè)備時(shí)仍需要使用互斥型信號(hào)量。例如,在打印機(jī)的使用上,仍需要滿足互斥條件。圖2.4示意不可剝奪型內(nèi)核的運(yùn)行情況,任務(wù)在運(yùn)行過(guò)程之中,L2.4(1中斷來(lái)了,如果此時(shí)中斷是開(kāi)著的,CPU由中斷向量F2.4(2進(jìn)入中斷服務(wù)子程序,中斷服務(wù)子程序做事件處理F2.4(3,使一個(gè)有更高級(jí)的任務(wù)進(jìn)入就緒態(tài)。中斷服務(wù)完成以后,中斷返回指令F2.4(4, 使CPU回到原來(lái)被中斷的任務(wù),接著執(zhí)行該任務(wù)的代碼F2.4(5直到該任務(wù)完成,調(diào)用一
21、個(gè)內(nèi)核服務(wù)函數(shù)以釋放CPU控制權(quán),由內(nèi)核將控制權(quán)交給那個(gè)優(yōu)先級(jí)更高的、并已進(jìn)入就緒態(tài)的任務(wù)F2.4(6,這個(gè)優(yōu)先級(jí)更高的任務(wù)才開(kāi)始處理中斷服務(wù)程序標(biāo)識(shí)的事件F2.4(7。 不可剝奪型內(nèi)核的最大缺陷在于其響應(yīng)時(shí)間。高優(yōu)先級(jí)的任務(wù)已經(jīng)進(jìn)入就緒態(tài),但還不能運(yùn)行,要等,也許要等很長(zhǎng)時(shí)間,直到當(dāng)前運(yùn)行著的任務(wù)釋放CPU。與前后系統(tǒng)一樣,不可剝奪型內(nèi)核的任務(wù)級(jí)響應(yīng)時(shí)間是不確定的,不知道什么時(shí)候最高優(yōu)先級(jí)的任務(wù)才能拿到CPU的控制權(quán),完全取決于應(yīng)用程序什么時(shí)候釋放CPU??傊?不可剝奪型內(nèi)核允許每個(gè)任務(wù)運(yùn)行,直到該任務(wù)自愿放棄CPU的控制權(quán)。中斷可以打入運(yùn)行著的任務(wù)。中斷服務(wù)完成以后將CPU控制權(quán)還給被中斷
22、了的任務(wù)。任務(wù)級(jí)響應(yīng)時(shí)間要大大好于前后系統(tǒng),但仍是不可知的,商業(yè)軟件幾乎沒(méi)有不可剝奪型內(nèi)核。當(dāng)系統(tǒng)響應(yīng)時(shí)間很重要時(shí),要使用可剝奪型內(nèi)核。因此,C/OS-以及絕大多數(shù)商業(yè)上銷(xiāo)售的實(shí)時(shí)內(nèi)核都是可剝奪型內(nèi)核。最高優(yōu)先級(jí)的任務(wù)一旦就緒,總能得到CPU的控制權(quán)。當(dāng)一個(gè)運(yùn)行著的任務(wù)使一個(gè)比它優(yōu)先級(jí)高的任務(wù)進(jìn)入了就緒態(tài),當(dāng)前任務(wù)的CPU使用權(quán)就被剝奪了,或者說(shuō)被掛起了,那個(gè)高優(yōu)先級(jí)的任務(wù)立刻得到了CPU的控制權(quán)。如果是中斷服務(wù)子程序使一個(gè)高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài),中斷完成時(shí),中斷了的任務(wù)被掛起,優(yōu)先級(jí)高的那個(gè)任務(wù)開(kāi)始運(yùn)行。如圖2.5所示。 使用可剝奪型內(nèi)核,最高優(yōu)先級(jí)的任務(wù)什么時(shí)候可以執(zhí)行,可以得到CPU的
23、控制權(quán)是可知的。使用可剝奪型內(nèi)核使得任務(wù)級(jí)響應(yīng)時(shí)間得以最優(yōu)化。使用可剝奪型內(nèi)核時(shí),應(yīng)用程序不應(yīng)直接使用不可重入型函數(shù)。調(diào)用不可重入型函數(shù)時(shí),要滿足互斥條件,這一點(diǎn)可以用互斥型信號(hào)量來(lái)實(shí)現(xiàn)。如果調(diào)用不可重入型函數(shù)時(shí),低優(yōu)先級(jí)的任務(wù)CPU的使用權(quán)被高優(yōu)先級(jí)任務(wù)剝奪,不可重入型函數(shù)中的數(shù)據(jù)有可能被破壞。綜上所述,可剝奪型內(nèi)核總是讓就緒態(tài)的高優(yōu)先級(jí)的任務(wù)先運(yùn)行,中斷服務(wù)程序可以搶占CPU,到中斷服務(wù)完成時(shí),內(nèi)核讓此時(shí)優(yōu)先級(jí)最高的任務(wù)運(yùn)行(不一定是那個(gè)被中斷了的任務(wù)。任務(wù)級(jí)系統(tǒng)響應(yīng)時(shí)間得到了最優(yōu)化,且是可知的。C/OS-屬于可剝奪型內(nèi)核。處理共享數(shù)據(jù)時(shí)保證互斥,最簡(jiǎn)便快捷的辦法是關(guān)中斷和開(kāi)中斷。如示意性
24、代碼程序2.3所示:程序清單2.3 關(guān)中斷和開(kāi)中斷Disable interrupts; /*關(guān)中斷*/Access the resource (read/write from/to variables; /*讀/寫(xiě)變量*/Reenable interrupts; /*重新允許中斷*/C/OS-在處理內(nèi)部變量和數(shù)據(jù)結(jié)構(gòu)時(shí)就是使用的這種手段,即使不是全部,也是絕大部分。實(shí)際上C/OS-提供兩個(gè)宏調(diào)用,允許用戶在應(yīng)用程序的C代碼中關(guān)中斷然后再開(kāi)中斷: OS_ENTER_CRITICAL(和OS_EXIT_CRITICAL(參見(jiàn)8.03.02 OS_ENTER_CRITICAL(和OS_EXIT_C
25、RITICALL(,這兩個(gè)宏調(diào)用的使用法見(jiàn)程序2.4。程序清單 2.4 利用C/OS_ 宏調(diào)用關(guān)中斷和開(kāi)中斷 void Function (void OS_ENTER_CRITICAL(; . . . /*在這里處理共享數(shù)據(jù)*/ OS_EXIT_CRITICAL(; 可是,必須十分小心,關(guān)中斷的時(shí)間不能太長(zhǎng)。因?yàn)樗绊懻麄€(gè)系統(tǒng)的中斷響應(yīng)時(shí)間, 即中斷延遲時(shí)間。當(dāng)改變或復(fù)制某幾個(gè)變量的值時(shí),應(yīng)想到用這種方法來(lái)做。這也是在中斷 服務(wù)子程序中處理共享變量或共享數(shù)據(jù)結(jié)構(gòu)的唯一方法。在任何情況下,關(guān)中斷的時(shí)間都要 盡量短。 如果使用某種實(shí)時(shí)內(nèi)核,一般地說(shuō),關(guān)中斷的最長(zhǎng)時(shí)間不超過(guò)內(nèi)核本身的關(guān)中斷時(shí)間, 就
26、不會(huì)影響系統(tǒng)中斷延遲。當(dāng)然得知道內(nèi)核里中斷關(guān)了多久。凡好的實(shí)時(shí)內(nèi)核,廠商都提供 這方面的數(shù)據(jù)??偠灾氤鍪蹖?shí)時(shí)內(nèi)核,時(shí)間特性最重要。 2.12 信號(hào)量(Semaphores 信號(hào)量是 60 年代中期 Edgser Dijkstra 發(fā)明的。信號(hào)量實(shí)際上是一種約定機(jī)制,在多任務(wù) 內(nèi)核中普遍使用.信號(hào)量用于: 控制共享資源的使用權(quán)(滿足互斥條件 標(biāo)志某事件的發(fā)生 使兩個(gè)任務(wù)的行為同步 (譯者注:信號(hào)與信號(hào)量在英文中都叫做 Semaphore,并不加以區(qū)分,而說(shuō)它有兩種類(lèi)型, 二進(jìn)制型(binary和計(jì)數(shù)器型(counting。本書(shū)中的二進(jìn)制型信號(hào)量實(shí)際上是只取兩個(gè)值 0 和 1 的信號(hào)量。實(shí)
27、際上 這個(gè)信號(hào)量只有一位,這種信號(hào)量翻譯為信號(hào)更為貼切。而二進(jìn)制信號(hào)量 通常指若干位的組合。而本書(shū)中解釋為事件標(biāo)志的置位與清除(見(jiàn) 2.21。 信號(hào)像是一把鑰匙,任務(wù)要運(yùn)行下去,得先拿到這把鑰匙。如果信號(hào)已被別的任務(wù)占用, 該任務(wù)只得被掛起,直到信號(hào)被當(dāng)前使用者釋放。換句話說(shuō),申請(qǐng)信號(hào)的任務(wù)是在說(shuō):“把鑰 匙給我,如果誰(shuí)正在用著,我只好等!”信號(hào)是只有兩個(gè)值的變量,信號(hào)量是計(jì)數(shù)式的。只取 兩個(gè)值的信號(hào)是只有兩個(gè)值 0 和 1 的量,因此也稱(chēng)之為信號(hào)量。計(jì)數(shù)式信號(hào)量的值可以是 0 到 255 或 0 到 65535,或 0 到 4294967295,取決于信號(hào)量規(guī)約機(jī)制使用的是 8 位、16 位
28、還是 32 位。到底是幾位,實(shí)際上是取決于用的哪種內(nèi)核。根據(jù)信號(hào)量的值,內(nèi)核跟蹤那些等待信 號(hào)量的任務(wù)。 49 一般地說(shuō),對(duì)信號(hào)量只能實(shí)施三種操作:初始化(INITIALIZE,也可稱(chēng)作建立(CREATE; 等信號(hào)(WAIT也可稱(chēng)作掛起(PEND;給信號(hào)(SIGNAL或發(fā)信號(hào)(POST。信號(hào)量初始化時(shí)要 給信號(hào)量賦初值,等待信號(hào)量的任務(wù)表(Waiting list應(yīng)清為空。 想要得到信號(hào)量的任務(wù)執(zhí)行等待(WAIT操作。如果該信號(hào)量有效(即信號(hào)量值大于 0,則 信號(hào)量值減 1,任務(wù)得以繼續(xù)運(yùn)行。如果信號(hào)量的值為 0,等待信號(hào)量的任務(wù)就被列入等待信 號(hào)量任務(wù)表。多數(shù)內(nèi)核允許用戶定義等待超時(shí),如果等
29、待時(shí)間超過(guò)了某一設(shè)定值時(shí),該信號(hào) 量還是無(wú)效,則等待信號(hào)量的任務(wù)進(jìn)入就緒態(tài)準(zhǔn)備運(yùn)行,并返回出錯(cuò)代碼(指出發(fā)生了等待超 時(shí)錯(cuò)誤。 任務(wù)以發(fā)信號(hào)操作(SIGNAL釋放信號(hào)量。如果沒(méi)有任務(wù)在等待信號(hào)量,信號(hào)量的值僅僅 是簡(jiǎn)單地加 1。如果有任務(wù)在等待該信號(hào)量,那么就會(huì)有一個(gè)任務(wù)進(jìn)入就緒態(tài),信號(hào)量的值 也就不加 1。于是鑰匙給了等待信號(hào)量的諸任務(wù)中的一個(gè)任務(wù)。至于給了那個(gè)任務(wù),要看內(nèi) 核是如何調(diào)度的。收到信號(hào)量的任務(wù)可能是以下兩者之一。 等待信號(hào)量任務(wù)中優(yōu)先級(jí)最高的,或者是 最早開(kāi)始等待信號(hào)量的那個(gè)任務(wù),即按先進(jìn)先出的原則(First In First Out ,F(xiàn)IFO 有的內(nèi)核有選擇項(xiàng), 允許用戶
30、在信號(hào)量初始化時(shí)選定上述兩種方法中的一種。 C/OS- 但 只支持優(yōu)先級(jí)法。如果進(jìn)入就緒態(tài)的任務(wù)比當(dāng)前運(yùn)行的任務(wù)優(yōu)先級(jí)高(假設(shè),是當(dāng)前任務(wù)釋放 的信號(hào)量激活了比自己優(yōu)先級(jí)高的任務(wù)。則內(nèi)核做任務(wù)切換(假設(shè),使用的是可剝奪型內(nèi)核, 高優(yōu)先級(jí)的任務(wù)開(kāi)始運(yùn)行。當(dāng)前任務(wù)被掛起。直到又變成就緒態(tài)中優(yōu)先級(jí)最高任務(wù)。 程序清單 2.7 示意在 C/OS-中如何用信號(hào)量處理共享數(shù)據(jù)。要與同一共享數(shù)據(jù)打交道 的任務(wù)調(diào)用等待信號(hào)量函數(shù) OSSemPend(。處理完共享數(shù)據(jù)以后再調(diào)用釋放信號(hào)量函數(shù) OSSemPost(。這兩個(gè)函數(shù)將在以后的章節(jié)中描述。要注意的是,在使用信號(hào)量之前,一定要 對(duì)該信號(hào)量做初始化。作為互斥
31、條件,信號(hào)量初始化為 1。使用信號(hào)量處理共享數(shù)據(jù)不增加 中斷延遲時(shí)間,如果中斷服務(wù)程序或當(dāng)前任務(wù)激活了一個(gè)高優(yōu)先級(jí)的任務(wù),高優(yōu)先級(jí)的任務(wù) 立即開(kāi)始執(zhí)行。 程序清單 2.7 通過(guò)獲得信號(hào)量處理共享數(shù)據(jù) OS_EVENT *SharedDataSem; void Function (void INT8U err; OSSemPend(SharedDataSem, 0, &err; . . . /* You can access shared data in here (interrupts are recognized */ /*共享數(shù)據(jù)的處理在此進(jìn)行,(中斷是開(kāi)著的*/ OSSemPos
32、t(SharedDataSem; 50 2.13 消息郵箱(Message Mail boxes 通過(guò)內(nèi)核服務(wù)可以給任務(wù)發(fā)送消息。典型的消息郵箱也稱(chēng)作交換消息,是用一個(gè)指針型 變量,通過(guò)內(nèi)核服務(wù),一個(gè)任務(wù)或一個(gè)中斷服務(wù)程序可以把一則消息(即一個(gè)指針?lè)诺洁]箱 里去。同樣,一個(gè)或多個(gè)任務(wù)可以通過(guò)內(nèi)核服務(wù)接收這則消息。發(fā)送消息的任務(wù)和接收消息 的任務(wù)約定,該指針指向的內(nèi)容就是那則消息。 每個(gè)郵箱有相應(yīng)的正在等待消息的任務(wù)列表,要得到消息的任務(wù)會(huì)因?yàn)猷]箱是空的而被 掛起,且被記錄到等待消息的任務(wù)表中,直到收到消息。一般地說(shuō),內(nèi)核允許用戶定義等待 超時(shí),等待消息的時(shí)間超過(guò)了,仍然沒(méi)有收到該消息,這任務(wù)進(jìn)
33、入就緒態(tài),并返回出錯(cuò)信息, 報(bào)告等待超時(shí)錯(cuò)誤。消息放入郵箱后,或者是把消息傳給等待消息的任務(wù)表中優(yōu)先級(jí)最高的 那個(gè)任務(wù)(基于優(yōu)先級(jí),或者是將消息傳給最先開(kāi)始等待消息的任務(wù)(基于先進(jìn)先出。圖 2.17 示意把消息放入郵箱。用一個(gè) I 字表示郵箱,旁邊的小砂漏表示超時(shí)計(jì)時(shí)器,計(jì)時(shí)器旁邊的 數(shù)字表示定時(shí)器設(shè)定值,即任務(wù)最長(zhǎng)可以等多少個(gè)時(shí)鐘節(jié)拍(Clock Ticks,關(guān)于時(shí)鐘節(jié)拍以后 會(huì)講到。 內(nèi)核一般提供以下郵箱服務(wù): 郵箱內(nèi)消息的內(nèi)容初始化,郵箱里最初可以有,也可以沒(méi)有消息 將消息放入郵箱(POST 等待有消息進(jìn)入郵箱(PEND 如果郵箱內(nèi)有消息,就接受這則消息。如果郵箱里沒(méi)有消息,則任務(wù)并不被
34、掛起 (ACCEPT,用返回代碼表示調(diào)用結(jié)果,是收到了消息還是沒(méi)有收到消息。 消息郵箱也可以當(dāng)作只取兩個(gè)值的信號(hào)量來(lái)用。郵箱里有消息,表示資源可以使用,而 空郵箱表示資源已被其它任務(wù)占用。 圖 2.17 消息郵箱 2.14 消息隊(duì)列(Message Queue 消息隊(duì)列用于給任務(wù)發(fā)消息。消息隊(duì)列實(shí)際上是郵箱陣列。通過(guò)內(nèi)核提供的服務(wù),任務(wù) 或中斷服務(wù)子程序可以將一條消息(該消息的指針?lè)湃胂㈥?duì)列。同樣,一個(gè)或多個(gè)任務(wù)可 以通過(guò)內(nèi)核服務(wù)從消息隊(duì)列中得到消息。發(fā)送和接收消息的任務(wù)約定,傳遞的消息實(shí)際上是 傳遞的指針指向的內(nèi)容。通常,先進(jìn)入消息隊(duì)列的消息先傳給任務(wù),也就是說(shuō),任務(wù)先得到 的是最先進(jìn)入消息隊(duì)列的消息,即先進(jìn)先出原則(FIFO。然而 C/OS-也允許使用后進(jìn)先出 方式(LIFO。 51 像使用郵箱那樣,當(dāng)一個(gè)以上的任務(wù)要從消息隊(duì)列接收消息時(shí),每個(gè)消息隊(duì)列有一張等 待消息任務(wù)的等待列表(Waiting List。如果消息隊(duì)列中沒(méi)有消息,即消息隊(duì)列是空
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 家居建材售后服務(wù)與客戶關(guān)系管理手冊(cè)(標(biāo)準(zhǔn)版)
- 倉(cāng)儲(chǔ)管理規(guī)范操作手冊(cè)
- 失智老年人照護(hù)員節(jié)假日后復(fù)工安全考核試卷含答案
- 企業(yè)采購(gòu)管理與供應(yīng)商關(guān)系手冊(cè)手冊(cè)(標(biāo)準(zhǔn)版)
- 航空安全檢查與旅客服務(wù)手冊(cè)
- 2025年國(guó)際投資項(xiàng)目管理規(guī)范
- 物業(yè)管理服務(wù)質(zhì)量與標(biāo)準(zhǔn)(標(biāo)準(zhǔn)版)
- 《電工電子技術(shù)》 課件 項(xiàng)目五 三相正弦交流電路
- 2025年港口安全員崗位資格認(rèn)證考試模擬試題卷及答案
- 護(hù)師題目2021及答案
- 肺癌分子病理診斷的解讀
- 全球著名空港產(chǎn)業(yè)發(fā)展案例解析
- 《水利工程白蟻燈光誘殺技術(shù)導(dǎo)則》編制說(shuō)明
- ISO28000:2022供應(yīng)鏈安全管理體系
- 全媒體運(yùn)營(yíng)師-國(guó)家職業(yè)標(biāo)準(zhǔn)(2023年版)
- 汽車(chē)CAN總線介紹課件
- 關(guān)于婚內(nèi)協(xié)議書(shū)范本
- 歷史七年級(jí)上冊(cè)知識(shí)點(diǎn)匯總
- isbp745中英文版解析
- 文物古建筑修繕工程施工組織設(shè)計(jì)
- 蘇教版語(yǔ)文《唐詩(shī)宋詞選讀》選修(教材上全部詩(shī)歌,已全部校對(duì)無(wú)誤)
評(píng)論
0/150
提交評(píng)論