嵌入式實時操作系統(tǒng)ucos ii譯原版章_第1頁
嵌入式實時操作系統(tǒng)ucos ii譯原版章_第2頁
嵌入式實時操作系統(tǒng)ucos ii譯原版章_第3頁
嵌入式實時操作系統(tǒng)ucos ii譯原版章_第4頁
嵌入式實時操作系統(tǒng)ucos ii譯原版章_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

22實時系統(tǒng)概 前后臺系統(tǒng)(FOREGROUND/BACKGROUND 代碼的臨界 資 共享資 多任 任 任務切換(CONTEXTSWITCHORTASK 內(nèi)核 調(diào)度 不可剝奪型內(nèi)核(NON-PREEMPTIVE 可剝奪型內(nèi) 可重入性 時間片輪番調(diào)度 任務優(yōu)先 靜態(tài)優(yōu)先 動態(tài)優(yōu)先 優(yōu)先級反 任務優(yōu)先級分 互斥條 關中斷和開中 測試并置 禁止,然后允許任務切 信號量 死鎖(或抱死)(DEADLOCK(ORDEADLY 同 事件標志(EVENT 任務間的通訊(INTERTASK 消息郵箱(MESSAGEMAIL 消息隊列(MESSAGE 中 中斷延 中斷響 中斷恢復時間(INTERRUPT 中斷延遲、響應和恢 中斷處理時 非屏蔽中斷 時鐘節(jié)拍(CLOCK I對存對存儲器的需 使用實時內(nèi)核的優(yōu)缺 實時系統(tǒng)小 第2實時系第2實時系Switch航空航穩(wěn)溫調(diào)過程控發(fā)動機計算機調(diào)制解實時應用軟件的設計一般比非實時應用軟件設計難一些。本章講述實時系前后臺系統(tǒng)(Foreground/Background2.1pL這部分可以看成后臺行為bgnd)。中斷服務程序處理異步事件,這部分可以看成前臺(foregroundlpn)確定的。進而,如果程序修改了,循環(huán)的時序也會1圖2-1前后臺ha,所有的事都靠中斷圖2-1前后臺ha,所有的事都靠中斷服務來完成代碼的不允許任何中斷打入。為確保臨界段代碼的執(zhí)行,在進入臨界段之前要關中斷,而臨界段碼執(zhí)行完以后要立即開中斷。(參閱2.03共享資源資共享資exclusion多任多任務運行的實現(xiàn)實際上是靠CPU(中央處理單元)在許多任務之間轉換、調(diào)度。2多個。多任務運行使U多個。多任務運行使U任CPU完全只屬該程CPU如圖2.2所示。圖2.23的任務是指該任務掌握了CPU的控制權,正在運行中。掛起狀態(tài)也可以叫做等待事件態(tài)前的等待,等等。最后,發(fā)生中斷時,CPU提供相應的中斷服務,原來正在運行的任務暫不能運行,就進入了被中斷狀態(tài)。圖2.3表示μC/OS-Ⅱ中一些函數(shù)提供的服務,這些函數(shù)使任務從一種狀態(tài)變到另一種狀態(tài)任務切換(ContextSithorTask內(nèi)容切換。當多任務內(nèi)核決定運行另外的任務時,它保存正在運行任務的當前狀態(tài)(Context寄area就是把下一個將要運行的任務的當前狀況從該任務的棧中重新裝入CPU的寄存器,并開始下棧。實時內(nèi)核的性能不應該以每秒鐘能做多少次任務切換來評價4內(nèi)核)內(nèi)核)核本身對CPU用時間一般25百分點之間單片機一般不能運行實時內(nèi)核,因為單片機的RAM很有限。通過提供必不可缺少的調(diào)度調(diào)度(Scheduler),英文dispatcher,也是調(diào)度的意思。這是內(nèi)核的主要兩種不同的情況,這要看用的是什么類型的內(nèi)核,是不可剝奪型的還是可剝奪型內(nèi)核不可剝奪型內(nèi)核(Non-Preemptive的使放棄CPU控制權的企圖。取決于最長的任務執(zhí)行時間示意5中斷來了,如果此時中斷是開著的中斷來了,如果此時中斷是開著的,CPU由中斷向量[F2.4(2)]進入中斷服務子程序,中斷程序標識的事件[F2.4(72.4奪型CPU的控制權,完全取決于應用程序什么時候釋放CPU??傊?,不可剝奪型內(nèi)核允許每個任務運行,直到該任務自愿放CPU控制2.10可剝奪奪了,或者說被掛起了,那個高優(yōu)先級的任務立刻得到CPU的控制權。如果是中斷服務6那個任務開始運行。2.5示那個任務開始運行。2.5示2.5剝奪型內(nèi)任務級系統(tǒng)響應時間得到了最優(yōu)化,且是可知的。C/OⅡ屬于可剝奪型內(nèi)核2.11可重入性在寄存予以保護。程序2.1是一個可重入型函數(shù)的程序清單2.1可重入型函7voidstrcpy(char*dest,char{while(*dest++=*src++);程序清單不可重入型函程序員打算讓Swap()函數(shù)可以為任何任務所調(diào)用,如果一個低優(yōu)先級的任務正在執(zhí)行Swap()函數(shù),而此時中斷發(fā)生了,于是可能發(fā)生的事情2.6所示。[F2.6(1)]表示中斷發(fā)調(diào)用Swap()函數(shù)是Temp賦值為3。這對該任務本身來說,實現(xiàn)兩個變量的交換是沒有問題的,交Z4,X3。然后高優(yōu)先級的任務通過調(diào)用內(nèi)核服務函數(shù)中的延遲一個時鐘節(jié)拍[F2.6(4)],釋放了CPU的使用權,低優(yōu)先級任務得以繼續(xù)運行[F2.6(5)].注18intvoidswap(int*x,int{Temp=*x=*y=}}*dest=}2.6入性2.6入性萬要使用以下技術之一即可使Swap()函數(shù)具有可重入性把Temp調(diào)用Swp函數(shù)之前關中斷,調(diào)動后再開中用信號量禁止該函數(shù)在使用過程中被再次調(diào)如果中斷發(fā)生在Swap()函數(shù)調(diào)用之前或調(diào)用之后,兩個任務中的X,Y的2.12時間片輪番調(diào)度(quantum時,把CPU控制權交給下一個任務就緒態(tài)的任務:當前任務已無事可當前任務在時間片還沒結束時已經(jīng)完成了目前,μC/OS-Ⅱ不支持時間片輪番調(diào)度法。應用程序中各任務的優(yōu)先級必須互不相同92.13任務優(yōu)每個任務都2.13任務優(yōu)每個任務都有其優(yōu)先級。任務越重要,賦予的優(yōu)先級應2.14靜態(tài)優(yōu)應用程序執(zhí)行過程中諸任務優(yōu)先級不變,則稱之為靜態(tài)優(yōu)先級。在靜態(tài)優(yōu)先級系統(tǒng)諸任務以及它們的時間約束在程序編譯時是已知2.15動態(tài)優(yōu)免出現(xiàn)優(yōu)先級反轉問題2.16優(yōu)先級使用實時內(nèi)核,優(yōu)先級反轉問題是實時系統(tǒng)中出現(xiàn)得最多的問題。圖2.7釋優(yōu)先級轉是如何出現(xiàn)的。如圖,任務1優(yōu)先級高于任務2,任務2優(yōu)先級高于任務3。任務1和任使用其共享資源。使用共享資源之前,首先必須得到該資源的信號量(Semaphore)(見2.2.7(4)]。運行過程中任13直到釋放那個共享資源的信號量27(11)]。直到此時,由于實時內(nèi)核知道有個高優(yōu)先級的在這種1先31等31剝奪CPU2搶走了CPU形中浪費了很多CPU時間。真正需要的是,為防止發(fā)生優(yōu)先級反轉,內(nèi)核能自動變換任先級,這叫做先級,這叫做優(yōu)先級繼承(Priorityinheritance)但μC/OS-Ⅱ不支持優(yōu)先級繼承,一些商內(nèi)核有優(yōu)先級繼承功能2.7先級反轉申占內(nèi)核恢復任務3本來的優(yōu)先級并把信號量交給任務1,任務1得以順利運行。[圖務2才能CPU并開始2.8(11)]。注意,任22.8(3)]到[圖2.8(10)]的任何一刻都有可能進入就緒態(tài),并不影響任1、任3完成過程。在某種程2.17任務優(yōu)2.17任務優(yōu)一項有意思的技術可稱之為單調(diào)執(zhí)行率調(diào)度法RMS(RateMonotonicScheduling),用于2.92.9基于任務執(zhí)行頻繁度的優(yōu)先級分配任務執(zhí)行頻繁度所有任務都是周期性任務間不需要同步,沒有共享資源,沒有任務間數(shù)據(jù)交換等問所有任務都是周期性任務間不需要同步,沒有共享資源,沒有任務間數(shù)據(jù)交換等問等式[2.1]成立,這就是RMS定理∑n(21/ni這里Ei是任務i最長執(zhí)行時間,Ti是任務i的執(zhí)行周期。換句話說,Ei/Ti是任務i務n(2)0.693。這就意味著,基RMS,要任務都滿足硬所有有時間條件要求的任務i總的CPU利用時間應小于70%!請注意,這是指有時間100%。使CPU用率100%并不好,因為那樣的話程序就沒有了修改的余地,也沒法增加新功能了。作為系統(tǒng)設計的一條原則,CPU利用率應小于60%到70%。討論了。然而討論優(yōu)先級分配問題,RMS無疑是一個有意思的起點表2.1基于任務到CPU最高允許使用率n21-任務24.... 利用2.18.1處理共享數(shù)據(jù)時保證互斥,最簡便快捷的辦法是關中斷和開中斷。如示意性代碼2.3示關中斷和開中分。實際上μC/OS-Ⅱ提供兩個宏調(diào)用,允許用戶在應用程序的C代碼中關中斷然后再開中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()[參見8.03.02OS_ENTER_CRITICAL()和OS_EXIT_CRITICALL()],這兩個宏調(diào)用的使用法見程序程序清2.4利用μC/OS_Ⅱ宏調(diào)用關中斷和開可是,必須十分小心,關中斷的時間不能太長。因為它影響整個系統(tǒng)的中斷響應時voidFunction{. /*在這里處理共享數(shù)據(jù)}Disable /*關中斷Accesstheresource(read/writefrom/tovariables);/*讀/寫變Reenable /*重新允許中斷如果使用某種實時內(nèi)核,一般地說,關中斷的最長時間不超過內(nèi)核本身的關中斷時2.18.2量,如果該變量是0,允許該任務與共享資源打交道。為防止另一任務也要使用該資源者只要簡單地將全程變量置為1,這通常稱作測試并置位(Test-And-Set),或稱TAS。操作操作可能是微處理器的單獨一條不會被中斷的指令,或者是在程序中關中斷2.5利用測試并置位處有的微處理器有硬件的TAS指令(如Motorola68000系列,就有這條指令Disable ifAccessVariableis0 如果資源不可用,標志為Setvariableto 置資源不可用,標志為Reenable Accessthe 處理Disable SettheAccessVariablebackto 清資源不可使用,標志為Reenable 重新else Reenable /*Youdon’thaveaccesstotheresource,trybacklater;/*資源不可使用,以后再試;}顯然與內(nèi)核的初衷相違。應該使用下述方法程序清單2.6用給任務切換上鎖,然后開鎖的方法實現(xiàn)數(shù)據(jù)共享2.18.4信號量)使兩個任務的行為同(譯者注:信號與信號量在英文中都叫做Semaphore,并不加以區(qū)分,而說它有兩種類制信號量通常指若干位的組合。而本書中解釋為事件標志的置位與清除(見2.21))。25506553504294967295,取決于信號量規(guī)約機制使用的是8、voidFunction{. /*Youcanaccessshareddatainhere(interruptsarerecognized)*/./*在這里處理共享數(shù)據(jù)(中斷是開著的)這里的中斷是與此函數(shù)部共享數(shù)據(jù)結}信號量賦初值,等待信號量的任務表(Waitinglist)應清為空。等待信號量任務中優(yōu)先級最高的,或者程序清單2.7示意在μC/OS-Ⅱ中如何用信號量處理共享數(shù)據(jù)。要與同一共享數(shù)據(jù)打道的任務調(diào)用等待信號量函數(shù)OSSemPend()。處理完共享數(shù)據(jù)以后再調(diào)用釋放信號量函數(shù)加中斷延遲時間,如果中斷服務程序或當前任務激活了一個高優(yōu)先級的任務,高優(yōu)先級的務立即開始執(zhí)行通過獲得信號量處理共享數(shù)voidFunction(void){INT8Uerr;OSSemPend(SharedDataSem,0,&err);. /*Youcanaccessshareddatainhere(interruptsarerecognized)*/./*共享數(shù)據(jù)的處理在此進行,(中斷是開著的}打印機送數(shù)據(jù)時會出現(xiàn)什么現(xiàn)象。打印機打印機送數(shù)據(jù)時會出現(xiàn)什么現(xiàn)象。打印機會打出相互交叉的兩個任務的數(shù)據(jù)。例如任務1TTasaskk1!2!”在這種情況下,使用信號量并給信號量賦初值1(用二進制信號量)。規(guī)則很簡單送命令給接口另一端的設備并接收該設備的回應2.11調(diào)用向串行口發(fā)送命令的函數(shù)CommSendCmd(),該函數(shù)有三個形式參數(shù):Cmd指向送程序清單.隱含的信號量INT8UCommSendCmd(char*cmd,char*response,INT16U{Acquireport'ssemaphore;Sendcommandtodevice;Waitforresponse(withtimeout);if(timedout){Releasereturn(error是在通訊口驅動程序的初始化部分完成的。第一個調(diào)CommSendCmd()函數(shù)的任務申請并得第二個任務得到了該信號量,第二個任務才能使用RS-232口在函數(shù)BufReq()向緩沖區(qū)管理方申請得到緩沖區(qū)使用權。當緩沖區(qū)使用權還不再需要時過調(diào)用釋放緩沖區(qū)函數(shù)BufRel()將緩沖區(qū)還給管方。函數(shù)示意碼如程序清單2.9所程序29用信號量管理緩沖區(qū)BUF{BUFAcquireasemaphore;Disableinterrupts; =}elseReleasesemaphore;return(no}}2.122.12程序在處理鏈表指針時,為滿足互斥條件,中斷是關掉的(這一操作非???。任務使用完一緩沖區(qū),通過調(diào)用緩沖區(qū)釋放函數(shù)BufRel()將緩沖區(qū)還給系統(tǒng)。系統(tǒng)先將該緩沖區(qū)指BufFreeList=ptr->BufNext;Enableinterrupts;return}voidBufRel(BUF{Disableptr->BufNext=BufFreeList;BufFreeList=ptr;Enableinterrupts;Release}是浮點數(shù),而相應微處理器又沒有硬件的浮點協(xié)處理器,浮點運算的時間相當長,關中斷間長了會影響中斷延遲時間,這種情況下就有必要使用信號量2.19死鎖(或抱死Delck(orDaym)死鎖也稱作抱死,指兩個任務無限期地互相等待對方控制著的資源。設任務1資源R2TT12T2都沒法繼續(xù)執(zhí)行了,發(fā)生了死鎖。最簡單的防止發(fā)生死鎖的方法是讓每個任務釋放資源時使用相反在嵌入式系統(tǒng)中不易2.20同量初始化0,信號量用于這種類型同步的稱作單向同步(unilateralrendezvous)。一個信號,該任務得到信號后繼續(xù)往下執(zhí)行2.13用信號量使任務與2.13用信號量使任務與中斷服務同發(fā)信號給等待事件發(fā)生的任務中優(yōu)先級最高的任務,或發(fā)信號給最先開始等待事件發(fā)生的那個任根據(jù)不同的應用,發(fā)信號以標識事件發(fā)生的中斷服務或任務也可以是兩個任務可以用兩個信號量同步它們的行為。如圖2.14所示。這叫做雙向(bilateralrendezvous)。雙向同步同單向同步類似,只是兩個任務要相互同步例如則程序清單2.10運行到某一處的第一個任務發(fā)信號給第二個任務給第一個任務[2.10(3)]等待返回信號[L2.10(4)]。至此,兩個任務實現(xiàn)了互相同步。在務與中斷服務之間不能使用雙向同步,因為在中斷服務中不可能等一個信號2.14兩個任務用信號量同步彼此的行程序清單雙向程序清單雙向同步2.21事件標志(Eventa2.15{for(;;)PerformSignaltask Waitforsignalfromtask#2; Continueoperation;}}{for(;;)PerformSignaltask Waitforsignalfromtask#1; Continueoperation;}}2.15立型及關2.15立型及關聯(lián)型同斷志可以是獨立型或組合型。μC/OS-Ⅱ目前不支持事件標志2.22任務間的通訊Intsk)況,用戶可以考慮使用郵箱或消息隊列2.162.23消息郵2.162.23消息郵箱(eageMil邊的數(shù)字表示定時器設定值,即任務最長可以等多少個時鐘節(jié)拍(ClockTicks),關于時鐘內(nèi)核一般提供以下郵箱服務等待有消息進入郵箱如果郵箱內(nèi)有消息,就接受如果郵箱內(nèi)有消息,就接受這則消息。如果郵箱里沒有消息,則任務并不被掛(ACCEPT),用返回代碼表示調(diào)用結果,是收到了消息還是沒有收到消息郵箱也可以當作只取兩個值的信號量來用。郵箱里有消息,表示資源可以使用空郵箱表示資源已被其它任務占2.24消息隊列esge2.18示意中斷服務子程序如何將消息放入消息隊列。圖中兩個大寫的I消息隊列,“10100等下去,直至消息的到典型地,內(nèi)核提供的消息隊列服務如下等待一則消息的到來通知調(diào)用者,隊列中沒有消息通知調(diào)用者,隊列中沒有消息2.25中中斷是一種硬件機制,用于通知CPU有個異步事件發(fā)生了。中斷一旦被識別,CPU在前后臺系統(tǒng)中,程序回到后臺程對不可剝奪型內(nèi)核而言,程序回到被中斷了的任對可剝奪型內(nèi)核而言,讓進入就緒態(tài)的優(yōu)先級最高的任務開始中斷使得CPU可以在事件發(fā)生時才予以處理,而不必讓微處理器連續(xù)不斷地查詢(Polling)是否有事件發(fā)生。通過兩條特殊指令:關中斷(Disableinterrupt)和開中斷失。微處理器一般允許中斷嵌套,也就是說在中斷服務期間,微處理器可以識別另一個要的中斷,并服務于那個更重要的中斷,如圖2.19所示2.262.192.272.192.27護現(xiàn)場,將CPU的各寄存器推入堆棧。這段時間將被記作中斷響應時間。對前后臺系統(tǒng),保存寄存器以后立即執(zhí)行用戶代碼,中斷響應時間由[2.3[2.3]中斷響應時中斷延保存CPU寄存器的時即得到執(zhí)行。不可剝奪型內(nèi)核的中斷響應時間由表達式[2.4]給出[2.4]中斷響應時中斷延保存CPU寄存器的時使得內(nèi)核可以跟蹤中斷的嵌套。對于μC/OS-Ⅱ說來,這個函數(shù)是OSIntEnter(),可剝型內(nèi)核的中斷響應時間由表達式[2.5]給出函數(shù)的執(zhí)行時中斷響應是系統(tǒng)函數(shù)的執(zhí)行時中斷響應是系統(tǒng)在最壞情況下的響應中斷的時間,某系100中9950μs內(nèi)響應中斷,只有一次響應中斷的時間是250μs,只能認為中斷響應時間是250μs2.28中斷恢復時間Inerpt內(nèi)存器值的時間和執(zhí)行中斷返回指令的時間,如表達式[2.7]所示個由實時內(nèi)核提供的函數(shù)。在μC/OS-Ⅱ中,這個函數(shù)叫做OSIntExit(),這個函數(shù)用于辨務只有重新成為優(yōu)先級最高的任務而進入就緒態(tài)時才能繼續(xù)運行。對于可剝奪型內(nèi)核,中恢復時間由表達式[2.8]給出級更高任務的CPU內(nèi)部寄存器的時間+執(zhí)行中斷返回指令的時2.29中斷延遲、響應和恢[圖2.22B]。在后一種情況下,恢復中斷的時間要稍長一些,因為內(nèi)核要做任務切換。在書中,我做了一張執(zhí)行時間表,此表多少可以衡量執(zhí)行時間的不同,假定μC/OS-Ⅱ是33MHZIntel80186微處理器上運行的。此表可以使讀者看到做任務切換的時間開銷。33MHZIntel80186微處理器上運行的。此表可以使讀者看到做任務切換的時間開銷。9.333MHZ80186μC/OS-Ⅱ服務的執(zhí)行時間2.30中斷處中斷服務必須全部小于100μS,500μS1mS。如果中斷服務是在任何給定的時間開始,以允許優(yōu)先級更高的中斷打入并優(yōu)先得到2.31非屏蔽中斷)2.31非屏蔽中斷)如斷電時保存重要的信息。然而,如果應用程序沒有這方面的要求,非屏蔽中斷可用于時[2.9]中斷延遲時間=指令執(zhí)行時間中最長的始做非屏蔽中斷服務的時80125μS之間。所使用的內(nèi)核的關中斷時間是45μS。可以看出,如果使用可屏蔽中斷的話,中斷響應會推遲20μS。讀或寫能完成的,即不應該是兩個分離的字節(jié),要兩次讀或寫才能完成完成的變量2.23屏蔽中斷的禁使用內(nèi)核服務給任務發(fā)信號,但可以使用如2.24制。即用非屏蔽中斷產(chǎn)生的運行時間和信號量的有效時間都接近6mS,實時性得到了滿足2.32時鐘節(jié)拍(Cok1負有關。以下是這類問題可能的解決方案重新安排任務的時間要求苛刻的代碼用匯編語言如果可能,用同一家族的更快的微處理器做系統(tǒng)升級。如從808680186升級6800068020不管怎么樣,抖動總是存在2.33對存儲核時的情況則很不一樣。內(nèi)核本身需要額外的代碼空間)。內(nèi)核的大小取決于多種因素1K到100K8位PU務調(diào)度、任務切換、信號量處理、延時及超時服務約需要1K到3K需求量由表達式[2.12]給出[2.12]總代碼量=應用程序代碼+內(nèi)核[2.12]總代碼量=應用程序代碼+內(nèi)核計人員決定分配給每個任務多少??臻g時,應該盡可能使之接近實際需求量(有時,這是相所需的??臻g大小可以分別定義(μC/OS-II可以做到)。相反,有些內(nèi)核要求每個任務所需等。如果內(nèi)核不支持單獨的中斷用棧,總的[2.13RAM總需求=應用程序的RAM需求任務棧需求+最大中斷嵌套棧需求*任如果內(nèi)核支持中斷用棧分離,總 需求量由表達式[2.14]給[2.14]RAM總需求=應用程序RAM需求+內(nèi)核數(shù)據(jù)區(qū)RAM需求+各任務棧需求之總和+最多中斷嵌套之棧需求除非有特別大的程序需要

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論