嵌入式實(shí)時(shí)操作系統(tǒng)ucos-ii譯-原版第2章_第1頁
嵌入式實(shí)時(shí)操作系統(tǒng)ucos-ii譯-原版第2章_第2頁
嵌入式實(shí)時(shí)操作系統(tǒng)ucos-ii譯-原版第2章_第3頁
嵌入式實(shí)時(shí)操作系統(tǒng)ucos-ii譯-原版第2章_第4頁
嵌入式實(shí)時(shí)操作系統(tǒng)ucos-ii譯-原版第2章_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余35頁可下載查看

下載本文檔

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

文檔簡(jiǎn)介

第2 實(shí)時(shí)系統(tǒng)概 前系統(tǒng)(FOREGROUND/BACKGROUND 資 多任 任 任務(wù)切換(CONTEXTSWITCHORTASK 調(diào)度 不可型內(nèi)核(NON-PREEMPTIVE 死鎖(或抱死)(DEADLOCK(ORDEADLY 同 事件標(biāo)志(EVENT 任務(wù)間的通訊(INTERTASK 消息郵箱 消息隊(duì)列(MESSAGE 中 中斷恢復(fù)時(shí)間(INTERRUPT 時(shí)鐘節(jié)拍(CLOCK 第2 實(shí)時(shí)系統(tǒng)概實(shí)時(shí)系統(tǒng)的應(yīng)用涵蓋廣泛的領(lǐng)域,而多數(shù)實(shí)時(shí)系統(tǒng)又是的。這意味著計(jì)算機(jī)建在系統(tǒng)

Switch 系統(tǒng)(Foreground/Background不復(fù)雜的小系般設(shè)計(jì)成如圖2.1所示的樣子。這種系統(tǒng)可稱為前系統(tǒng)或超循環(huán)這部分可以看成行為(background)。中斷服務(wù)程序處理異步事件,這部分可以看成前臺(tái)(foreground圖2-1前系碼執(zhí)行完以后要立即開中斷。(參閱2.03共享資源資資源打交道時(shí),必須獨(dú)占該資源。這叫做互斥(mutualexclusion2.18節(jié)“互斥”中,將 間(如圖2.2所示)。2.2的任務(wù)是指該任務(wù)掌握了CPU的控制權(quán),正在運(yùn)行中。掛起狀態(tài)也可以叫做等待事件態(tài)(前的等待,等等。最后,發(fā)生中斷時(shí),CPU提供相應(yīng)的中斷服務(wù),原來正在運(yùn)行的任務(wù)暫2.3表示μC/OS-Ⅱ中一些函數(shù)提供的服務(wù),這些函數(shù)任務(wù)切換(ContextSwitchorTask內(nèi)容切換。當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí),它保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài)(Contextarea就是把下一個(gè)將要運(yùn)行的任務(wù)的當(dāng)前狀況從該任務(wù)的棧中重新裝入CPU內(nèi)核(CPU時(shí)間,并且負(fù)責(zé)任本身對(duì)CPU25個(gè)百分點(diǎn)之間。單片機(jī)一般不能運(yùn)行實(shí)時(shí)內(nèi)核,因?yàn)閱纹瑱C(jī)的RAM很有限。通過提供必不可缺少的系調(diào)度(Scheduler),英文還有一詞叫dispatcher,也是調(diào)度的意思。這是內(nèi)核的主要不可型內(nèi)核(Non-Preemptive多任務(wù),各個(gè)任務(wù)彼此合作共個(gè)CPU。異步事件還是由中斷服務(wù)來處理。中斷服務(wù)可以放棄CPU控制權(quán)的企圖。不型的大在其時(shí)。優(yōu)級(jí)務(wù)經(jīng)就態(tài)但能運(yùn)行,要等,也許要等很長(zhǎng)時(shí)間,直到當(dāng)前運(yùn)行著的任務(wù)CPU。與前后系樣,不核務(wù)應(yīng)是的道時(shí)高級(jí)務(wù)到CPUCP??傊?,不可型內(nèi)核允許每個(gè)任務(wù)運(yùn)行,直到該任務(wù)自愿放棄CPU的控制權(quán)。中斷可 型內(nèi)可重入性予以保護(hù)。程序2.1是一個(gè)可重入型函數(shù)的例子。voidstrcpy(char*dest,char{whilevoidstrcpy(char*dest,char{while(*dest++=*src++);}}*dest=}函數(shù)Strcpy()做字符串。因?yàn)閰?shù)是存在堆棧中的,故函數(shù)Strcpy()可以被多個(gè)變量的值互換。為便于,假定使用的是可型內(nèi)核,中斷是開著的,Temp定義為整程序 不可重入型函intintvoidswap(int*x,int{Temp=*x=*y=}程序員打算讓Swap()函數(shù)可以為任何任務(wù)所調(diào)用,如果一個(gè)低優(yōu)先級(jí)的任務(wù)正在執(zhí)行Swap()2.6所示。[F2.6(1)]表示中斷發(fā)調(diào)用Swap()函數(shù)是Temp賦值為3。這對(duì)該任務(wù)本身來說,實(shí)現(xiàn)兩個(gè)變量的交換是沒有問題Z4,X3。然后高優(yōu)先級(jí)的任務(wù)通過調(diào)用內(nèi)核服務(wù)函數(shù)中的延遲一個(gè)時(shí)鐘節(jié)拍[F2.6(4)],了CPU的使用權(quán),低優(yōu)先級(jí)任務(wù)得以繼續(xù)運(yùn)行[F2.6(5)].注意,此時(shí)Temp3!在低優(yōu)先級(jí)任務(wù)接著運(yùn)行時(shí),Y3,而不是正確值1。把Temp定義為局部變調(diào)用Sap(函數(shù)之前關(guān)中斷,調(diào)動(dòng)后再開中用信號(hào)量該函數(shù)在使用過程中被時(shí)間片輪番調(diào)度(quantum時(shí),把CPU控制權(quán)交給下一個(gè)任務(wù)就緒態(tài)的任務(wù):(見131等到任務(wù)3占有的那個(gè)共享資源。由于任務(wù)2任務(wù)3的CPU使用權(quán),使任務(wù)1的任務(wù)3并沒有先被任務(wù)1CPU使用權(quán),又被任務(wù)2搶走了CPU使用權(quán),花很多時(shí)間在共享資源使用前提升任務(wù)3的優(yōu)先級(jí),然后又在資源使用后花時(shí)間恢復(fù)任務(wù)3的優(yōu)先級(jí),則無形中用共享資源[圖2.8(3)]。后來CPU使用權(quán)被任務(wù)1[圖2.8(4)],任務(wù)1開始運(yùn)行[圖內(nèi)核恢復(fù)任務(wù)3本來的優(yōu)先級(jí)并把信號(hào)量交給任務(wù)1,任務(wù)1得以順利運(yùn)行。[圖2CPU2.8(1122.8(3)]到[圖2.8(1013的完成過程。在某種程度上,任務(wù)2和任務(wù)3之間也還是有不可避免的優(yōu)先級(jí)反轉(zhuǎn)。任務(wù)優(yōu)先級(jí)分一項(xiàng)有意思的技術(shù)可稱之為單調(diào)執(zhí)行率調(diào)度法RMS(RateMonotonicScheduling),用于式[2.1]成立,這就是RMS定理:∑ Ein(21/n1)∑i這里E是任務(wù)i最長(zhǎng)執(zhí)行時(shí)間,Ti的執(zhí)行周期。換句話說,ET是任務(wù)i所需的CPU2.1給出n(2/n1n所有有時(shí)間條件要求的任務(wù)iCPU70%!請(qǐng)注意,這是指有時(shí)間條100%。使CPU100%并不好,因?yàn)槟菢拥脑挸绦蚓蜎]有了修改的余地,也沒法增加新功能了。作為系統(tǒng)設(shè)計(jì)的一條原則,CPU利用率應(yīng)小于60%到70%。可了。然而優(yōu)先級(jí)分配問題,RMS無疑是一個(gè)有意思的起點(diǎn)。2.1基于任務(wù)到CPU最高允許使用率任務(wù) n(1- DisableDisableAccesstheresourceread/writefrom/to 量Reenable 關(guān)中斷和開中分。實(shí)際上μC/OS-Ⅱ提供兩個(gè)宏調(diào)用,允許用戶在應(yīng)用程序的C代碼中關(guān)中斷然后再開中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()[參見8.03.02OS_ENTER_CRITICAL()voidFunction{. voidFunction{. }中斷,如程序2.5所示。程 2.5利用測(cè)試并置位處理共享資Disableif(‘AccessVariable’is{Setvariableto1;Reenableinterrupts;Accesstheresource;Disableinterrupts;Setthe‘AccessVariable’backto0;Reenableinterrupts;}elseReenable

/*Youdon’thaveaccesstotheresource,trybacklater;,然后允許任voidvoidFunction{../*Youcanaccessshareddatainhere(interruptsrecognized)./*在這里處理共享數(shù)據(jù)(中斷是開著的)這里的中斷是與此函數(shù)部共享數(shù)據(jù)結(jié)}2.6用給任務(wù)切換上鎖,然后開鎖的方法實(shí)現(xiàn)數(shù)據(jù)共享信號(hào)量prSemaphore,并不加以區(qū)分,而說它有兩種類制信號(hào)量通常指若干位的組合。而本書中解釋為事件標(biāo)志的置位與清除(見2.21))。把把 信號(hào)量賦初值,等待信號(hào)量的任務(wù)表(Waitinglist)應(yīng)清為空。想要得到信號(hào)量的任務(wù)執(zhí)行等待(WAIT)操作。如果該信號(hào)量有效(即信號(hào)量值大于0),1,0,等待信號(hào)量的任務(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ù)voidFunction(void){INT8Uerr;OSSemPend(SharedDataSem,0,&err);. /*YoucanaccessvoidFunction(void){INT8Uerr;OSSemPend(SharedDataSem,0,&err);. /*Youcanaccessshareddatainhere(interruptsarerecognized)*/./*共享數(shù)據(jù)的處理在此進(jìn)行,(中斷是開著的}送數(shù)據(jù)時(shí)會(huì)出現(xiàn)什么現(xiàn)象。會(huì)打出相互交叉的兩個(gè)任務(wù)的數(shù)據(jù)。例如任務(wù)1要Tasaskk1!2!”1(用二進(jìn)制信號(hào)量)。規(guī)則很簡(jiǎn)單,要想送命令給接口另一端的設(shè)備并接收該設(shè)備的回應(yīng)。如圖2.11所示。調(diào)用向串行口發(fā)送命令的函數(shù)CommSendCmd(),該函數(shù)有三個(gè)形式參數(shù):Cmd指向送出INT8UCommSendCmd(char*cmd,char*response,INT16UINT8UCommSendCmd(char*cmd,char*response,INT16U{Acquireport'ssemaphore;Sendcommandtodevice;Waitforresponse(withtimeout);if(timedout){Releasereturn(error}}elseReleasesemaphore;return(no}}1,表示允許使用。初始化CommSendCmd()函數(shù)的任務(wù)申請(qǐng)并得任務(wù)得到了該信號(hào)量,第二個(gè)任務(wù)才能使用RS-232口。計(jì)數(shù)式信號(hào)量用于某資源可以同時(shí)為幾個(gè)任務(wù)所用。例如,用信號(hào)量管理緩沖區(qū)陣列BufReq()向緩沖區(qū)管理方申請(qǐng)得到緩沖區(qū)使用權(quán)。當(dāng)緩沖區(qū)使用權(quán)還不再需要時(shí),通過調(diào)用緩沖區(qū)函數(shù)BufRel()將緩沖區(qū)還給管方。函數(shù)示意碼如程序2.9所示BUF{BUFAcquireasemaphore;Disableinterrupts; =BUF{BUFAcquireasemaphore;Disableinterrupts; =BufFreeListBufFreeList=ptr->BufNext;Enableinterrupts;return}voidBufRel(BUF{Disableptr->BufNext=BufFreeList;BufFreeList=ptr;Enableinterrupts;Release}一緩沖區(qū),通過調(diào)用緩沖區(qū)函數(shù)BufRel()將緩沖區(qū)還給系統(tǒng)。系統(tǒng)先將該緩沖區(qū)指針到空閑緩沖區(qū)鏈表中(Linkedlist)然后再給信號(hào)量加1或該信號(hào)量。這一過程隱死鎖(或抱死Dl(orDeadly死鎖也稱作抱死,指兩個(gè)任務(wù)無限期地互相等待對(duì)方控制著的資源。設(shè)任務(wù)T1正獨(dú)享資源R1,T2在獨(dú)享資源T2T1又要獨(dú)享R2,T2R1,于是哪個(gè)任務(wù)可以利用信號(hào)量使某任務(wù)與中斷服務(wù)同步(或者是與另一個(gè)任務(wù)同步,這兩個(gè)任務(wù)間沒圖3標(biāo)示事發(fā)(是用證件。實(shí)步的號(hào)0,信號(hào)量用于這種類型同步的稱作單向同步(unilatralredezvus)。一個(gè)任務(wù)做OO兩個(gè)任務(wù)可以用兩個(gè)信號(hào)量同步它們的行為。如圖2.14所示。這叫做雙向同步例如則程序2.10中,運(yùn)行到某一處的第一個(gè)任務(wù)發(fā)信號(hào)給第二個(gè)任務(wù)務(wù)與中斷服務(wù)之間不能使向同步,因?yàn)樵谥袛喾?wù)中不可能等一個(gè)信號(hào)量。{for(;;)Signaltask#2;Waitforsignalfromtask#2;Continueoperation;}}{for(;;)Signaltask#1;Waitforsignalfromtask#1;Continueoperation;}}2.10雙向事件標(biāo)志(Event系)。獨(dú)立型及關(guān)聯(lián)型同步如圖2.15所示。任務(wù)間的通訊(eromii 旁邊的數(shù)字表示定時(shí)器設(shè)定值,即任務(wù)最長(zhǎng)可以等多少個(gè)時(shí)鐘節(jié)拍(ClockTicks),關(guān)于時(shí)消息隊(duì)列(Message2.18I中斷是一種硬件機(jī)制,用于通知CPU有個(gè)異步事件發(fā)生了。中斷一旦被識(shí)別,CPU保存中斷使得CPU可以在事件發(fā)生時(shí)才予以處理,而不必讓微處理器連續(xù)不斷地查詢(Polling)是否有事件發(fā)生。通過兩條特殊指令:關(guān)中斷(Disableinterrupt)和開中斷要的中斷,并服務(wù)于那個(gè)更重要的中斷,如圖2.19所示。中斷響應(yīng)定義為從中斷發(fā)生到開始執(zhí)行用戶的中斷服務(wù)子程序代碼來處理這個(gè)中斷的護(hù)現(xiàn)場(chǎng),將CPU[2.3]中斷響應(yīng)時(shí)間=中斷延遲+保存CPU寄存器的時(shí)[2.4]中斷響應(yīng)時(shí)間=中斷延遲+保存CPU寄存器的時(shí)使得內(nèi)核可以中斷的嵌套。對(duì)于μC/OS-Ⅱ說來,這個(gè)函數(shù)是OSIntEnter(),可內(nèi)響應(yīng)中斷,只有一次響應(yīng)中斷的時(shí)間是250μs,只能認(rèn)為中斷響應(yīng)時(shí)間是250μs。中斷恢復(fù)時(shí)間(Interrupt個(gè)由實(shí)時(shí)內(nèi)核提供的函數(shù)。在μC/OSOSIntExit(),這個(gè)函數(shù)用于辨[2.8]級(jí)更高任務(wù)的CPU寄存器的時(shí)間+執(zhí)行中斷返回指令的時(shí)間中斷延遲、響應(yīng)和恢表9.3,在33MHZ80186上μC/OS-Ⅱ服務(wù)的執(zhí)行時(shí)間).斷服務(wù)必須全部小于100μS,500μS或1mS。如果中斷服務(wù)是在任何給定的時(shí)間開始,且非中斷(M在一項(xiàng)應(yīng)用中,我將非中斷用于可能每150μS發(fā)生一次的中斷。中斷處理時(shí)間80至125μS之間。所使用的內(nèi)核的關(guān)中斷時(shí)間是45μS??梢钥闯觯绻褂每芍袛嗟脑?,中斷響應(yīng)會(huì)推遲20μS。使用內(nèi)核服務(wù)給任務(wù)發(fā)信號(hào),但可以使用如圖2.24所示的中斷機(jī)制。即用非中斷產(chǎn)生時(shí)間和信號(hào)量的有效時(shí)間都接近6mS,實(shí)時(shí)性得到了滿足。間隔取決于不同的應(yīng)用,一般在10mS到200mS之間。時(shí)鐘的節(jié)拍式中斷使得內(nèi)核可以將任2.252.2720mS,但由于其優(yōu)先級(jí)的緣故,實(shí)際上每次延6800068020升級(jí)等 器的需取決于內(nèi)核的特性,從1K100K字節(jié)都是可能的。8位CPU用的最小內(nèi)核只提供任務(wù)調(diào)度、任務(wù)切換、信號(hào)量處理、延時(shí)及超時(shí)服務(wù)約需要1K3K代碼空間。代碼空間總需求[2.12]=+計(jì)決定分配給每個(gè)任務(wù)多少??臻g時(shí),應(yīng)該盡可能使之接近實(shí)際需求量(有時(shí),這是相所需的??臻g大小可以分別定義(μC/OS-II可以做到)。相反,有些內(nèi)核要求每個(gè)任務(wù)所需內(nèi)核不支持單獨(dú)的中斷用棧,總的RAM需求由表達(dá)式[2.13]給出。[2.13RAM=應(yīng)用程序的RAM+最大中斷嵌套棧需求*任如果內(nèi)核支持中斷用棧分離,總 [2.14]RAM=RAM+RAM+各任務(wù)棧需求之總和+最多中斷嵌

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論