chap02-實(shí)時系統(tǒng)概念_第1頁
chap02-實(shí)時系統(tǒng)概念_第2頁
chap02-實(shí)時系統(tǒng)概念_第3頁
chap02-實(shí)時系統(tǒng)概念_第4頁
chap02-實(shí)時系統(tǒng)概念_第5頁
已閱讀5頁,還剩101頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1,2021/1/26,嵌入式實(shí)時操作系統(tǒng) c/os-ii,2021/1/26,2,第2章 實(shí)時系統(tǒng)概念,3,2021/1/26,實(shí)時系統(tǒng)概念,軟實(shí)時系統(tǒng)-各個任務(wù)盡快運(yùn)行,不要求限定某一任務(wù)在多長時間內(nèi)完成。 硬實(shí)時系統(tǒng)-任務(wù)要做到準(zhǔn)時,4,2021/1/26,2.0 前/后臺系統(tǒng),不復(fù)雜的小系統(tǒng)一般設(shè)計(jì)成如下圖所示的樣子。這種系統(tǒng)可稱為前后臺系統(tǒng)或超循環(huán)系統(tǒng)(super-loops,5,2021/1/26,后臺是一個循環(huán)輪詢系統(tǒng)一直在運(yùn)行。 前臺是由一些中斷處理過程組成的。 當(dāng)有一前臺事件(外部事件)發(fā)生時,引起中斷, 進(jìn)行前臺處理, 處理完成后又回到后臺(通常又稱主程序,中斷1,中斷2,

2、isr1,isr2,前臺處理,后臺處理,isr3,實(shí)時性,認(rèn)為所有的任務(wù)具有相同的優(yōu)先級別 任務(wù)的執(zhí)行通過fifo隊(duì)列排隊(duì) 某執(zhí)行任務(wù)崩潰會造成整個系統(tǒng)的崩潰,8,2021/1/26,應(yīng)用程序是一個無限的循環(huán),循環(huán)中調(diào)用相應(yīng)的函數(shù)完成相應(yīng)的操作,這部分可以看成后臺行為(background)。中斷服務(wù)程序處理異步事件,這部分可以看成前臺行為(foreground)。后臺也可以叫做任務(wù)級。前臺也叫中斷級,9,2021/1/26,時間相關(guān)性很強(qiáng)的關(guān)鍵操作(critical operation)一定是靠中斷服務(wù)來保證的。因?yàn)橹袛喾?wù)提供的信息一直要等到后臺程序走到該處理這個信息這一步時才能得到處理,

3、這種系統(tǒng)在處理信息的及時性上,比實(shí)際可以做到的要差。這個指標(biāo)稱作任務(wù)級響應(yīng)時間。最壞情況下的任務(wù)級響應(yīng)時間取決于整個循環(huán)的執(zhí)行時間。因?yàn)檠h(huán)的執(zhí)行時間不是常數(shù),程序經(jīng)過某一特定部分的準(zhǔn)確時間也是不能確定的。進(jìn)而,如果程序修改了,循環(huán)的時序也會受到影響,10,2021/1/26,2.01 代碼的臨界段,代碼的臨界段也稱為臨界區(qū),指處理時不可分割的代碼。 一旦這部分代碼開始執(zhí)行,則不允許任何中斷打入。為確保臨界段代碼的執(zhí)行,在進(jìn)入臨界段之前要關(guān)中斷,而臨界段代碼執(zhí)行完以后要立即開中斷,11,2021/1/26,2.02 資源,資源-任何為任務(wù)所占用的實(shí)體都可稱為資源。 資源可以是輸入輸出設(shè)備,例如

4、打印機(jī)、鍵盤、顯示器,資源也可以是一個變量,一個結(jié)構(gòu)或一個數(shù)組等,12,2021/1/26,2.03 共享資源,共享資源-可以被一個以上任務(wù)使用的資源叫做共享資源。 為了防止數(shù)據(jù)被破壞,每個任務(wù)在與共享資源打交道時,必須獨(dú)占該資源。這叫做互斥(mutual exclusion,13,2021/1/26,2.04 多任務(wù),多任務(wù)運(yùn)行的實(shí)現(xiàn)實(shí)際上是靠cpu(中央處理單元)在許多任務(wù)之間轉(zhuǎn)換、調(diào)度。cpu只有一個,輪番服務(wù)于一系列任務(wù)中的某一個。多任務(wù)運(yùn)行很像前后臺系統(tǒng),但后臺任務(wù)有多個。多任務(wù)運(yùn)行使cpu的利用率得到最大的發(fā)揮,并使應(yīng)用程序模塊化。在實(shí)時應(yīng)用中,多任務(wù)化的最大特點(diǎn)是,開發(fā)人員可以將

5、很復(fù)雜的應(yīng)用程序?qū)哟位J褂枚嗳蝿?wù),應(yīng)用程序?qū)⒏菀自O(shè)計(jì)與維護(hù),流程,并發(fā)多任務(wù),后臺,前臺,isrs,tasks,多任務(wù)系統(tǒng) 多個順序執(zhí)行的程序并行運(yùn)行。 宏觀上看,所有的程序同時運(yùn)行,每個程序運(yùn)行在自己獨(dú)立的cpu上。 實(shí)際上,不同的程序是共享同一個cpu和其它硬件。因此,需要rtos來對這些共享的設(shè)備和數(shù)據(jù)進(jìn)行管理。 每個程序都被編制成無限循環(huán)的程序,等待特定的輸入,執(zhí)行相應(yīng)的任務(wù)等。 這種程序模型將系統(tǒng)分成相對簡單的,相互合作的模塊,單處理器多任務(wù)系統(tǒng),優(yōu)點(diǎn) 將復(fù)雜的系統(tǒng)分解為相對獨(dú)立的多個線程, 達(dá)到“分而治之”的目的,從而降低系統(tǒng)的復(fù)雜性。 保證系統(tǒng)的實(shí)時性。 系統(tǒng)的模塊化好,提高

6、系統(tǒng)的可維護(hù)性。 缺點(diǎn) 需要采用一些新的軟件設(shè)計(jì)方法。 需要增加功能:線程間的協(xié)調(diào),同步和通信功能。 需要對每一個共享資源互斥。 導(dǎo)致線程間的競爭。 需要使用rtos,rtos要增加系統(tǒng)的開銷,單處理器多任務(wù)系統(tǒng),多處理器多任務(wù)系統(tǒng),多任務(wù)可運(yùn)行在多個處理器上,由操作系統(tǒng)統(tǒng)一調(diào)度,處理。 宏觀上看是并發(fā)的,微觀上看也是并發(fā)的。 多處理機(jī)系統(tǒng)分為緊耦合系統(tǒng)(tightly-coupled system)和松耦合系統(tǒng)(loosely-coupled system)兩種。 多處理器多任務(wù)系統(tǒng)目前還不成熟,18,2021/1/26,2.05 任務(wù),一個任務(wù),也稱作一個線程,是一個簡單的程序,該程序可以

7、認(rèn)為cpu 完全只屬該程序自己。實(shí)時應(yīng)用程序的設(shè)計(jì)過程,包括如何把問題分割成多個任務(wù),每個任務(wù)都是整個應(yīng)用的某一部分,每個任務(wù)被賦予一定的優(yōu)先級,有它自己的一套cpu 寄存器和自己的??臻g,19,每個任務(wù)都是一個無限的循環(huán)。每個任務(wù)都處在以下5種狀態(tài)之一的狀態(tài)下,這5 種狀態(tài)是休眠態(tài),就緒態(tài)、運(yùn)行態(tài)、掛起態(tài)(等待某一事件發(fā)生)和被中斷態(tài)。 休眠態(tài)-相當(dāng)于該任務(wù)駐留在內(nèi)存中,但并不被多任務(wù)內(nèi)核所調(diào)度。 就緒態(tài)-意味著該任務(wù)已經(jīng)準(zhǔn)備好,可以運(yùn)行了,但由于該任務(wù)的優(yōu)先級比正在運(yùn)行的任務(wù)的優(yōu)先級低,還暫時不能運(yùn)行,20,運(yùn)行態(tài)-是指該任務(wù)掌握了cpu 的控制權(quán),正在運(yùn)行中。 掛起狀態(tài)-也可以叫做等待事

8、件態(tài)waiting,指該任務(wù)在等待,等待某一事件的發(fā)生,(例如等待某外設(shè)的i/o 操作,等待某共享資源由暫不能使用變成能使用狀態(tài),等待定時脈沖的到來或等待超時信號的到來以結(jié)束目前的等待,等等)。 被中斷態(tài)-發(fā)生中斷時,cpu提供相應(yīng)的中斷服務(wù),原來正在運(yùn)行的任務(wù)暫不能運(yùn)行,就進(jìn)入了被中斷狀態(tài),21,22,休眠態(tài),掛起態(tài),被中斷態(tài),運(yùn)行態(tài),就緒態(tài),2.06 任務(wù)切換(context switch or task switch,context switch 在有的書中翻譯成上下文切換,實(shí)際含義是任務(wù)切換,或cpu 寄存器內(nèi)容切換。 當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時,它保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài)(c

9、ontext),即cpu寄存器中的全部內(nèi)容。這些內(nèi)容保存在任務(wù)的當(dāng)前狀況保存區(qū)(tasks context storage area),也就是任務(wù)自己的棧區(qū)之中。 任務(wù)切換-入棧工作完成以后,就是把下一個將要運(yùn)行的任務(wù)的當(dāng)前狀況從該任務(wù)的棧中重新裝入cpu 的寄存器,并開始下一個任務(wù)的運(yùn)行。 任務(wù)切換過程增加了應(yīng)用程序的額外負(fù)荷,2.07 內(nèi)核(kernel,多任務(wù)系統(tǒng)中,內(nèi)核負(fù)責(zé)管理各個任務(wù),或者說為每個任務(wù)分配cpu時間,并且負(fù)責(zé)任務(wù)之間的通訊。內(nèi)核提供的基本服務(wù)是任務(wù)切換。 內(nèi)核本身也增加了應(yīng)用程序的額外負(fù)荷,代碼空間增加rom 的用量,內(nèi)核本身的數(shù)據(jù)結(jié)構(gòu)增加了ram的用量。但更主要的是

10、,每個任務(wù)要有自己的??臻g,這一塊吃起內(nèi)存來是相當(dāng)厲害的。內(nèi)核本身對cpu 的占用時間一般在2 到5個百分點(diǎn)之間,2.08 調(diào)度(scheduler,調(diào)度(scheduler),英文還有一詞叫dispatcher,也是調(diào)度的意思。這是內(nèi)核的主要職責(zé)之一,就是要決定該輪到哪個任務(wù)運(yùn)行了。 多數(shù)實(shí)時內(nèi)核是基于優(yōu)先級調(diào)度法的。每個任務(wù)根據(jù)其重要程度的不同被賦予一定的優(yōu)先級?;趦?yōu)先級的調(diào)度法指,cpu總是讓處在就緒態(tài)的優(yōu)先級最高的任務(wù)先運(yùn)行。 讓高優(yōu)先級任務(wù)掌握cpu 的使用權(quán),有兩種不同的情況,不可剝奪型內(nèi)核 可剝奪型內(nèi)核,2.09 不可剝奪型內(nèi)核 (non-preemptive kernel,不

11、可剝奪型內(nèi)核要求每個任務(wù)自我放棄cpu 的所有權(quán)。不可剝奪型調(diào)度法也稱作合作型多任務(wù),各個任務(wù)彼此合作共享一個cpu。 不可剝奪型內(nèi)核的一個優(yōu)點(diǎn)是響應(yīng)中斷快。 在任務(wù)級,不可剝奪型內(nèi)核允許使用不可重入函數(shù),不可剝奪型內(nèi)核示例,不可剝奪型內(nèi)核的最大缺陷在于其響應(yīng)時間。高優(yōu)先級的任務(wù)已經(jīng)進(jìn)入就緒態(tài),但還不能運(yùn)行,要等,也許要等很長時間,直到當(dāng)前運(yùn)行著的任務(wù)釋放cpu。不可剝奪型內(nèi)核的任務(wù)級響應(yīng)時間是不確定的,不知道什么時候最高優(yōu)先級的任務(wù)才能拿到cpu 的控制權(quán),完全取決于應(yīng)用程序什么時候釋放cpu。 商業(yè)軟件幾乎沒有不可剝奪型內(nèi)核,2.10 可剝奪型內(nèi)核,當(dāng)系統(tǒng)響應(yīng)時間很重要時,要使用可剝奪型內(nèi)

12、核。因此,c/os-以及絕大多數(shù)商業(yè)上銷售的實(shí)時內(nèi)核都是可剝奪型內(nèi)核。 最高優(yōu)先級的任務(wù)一旦就緒,總能得到cpu 的控制權(quán)。當(dāng)一個運(yùn)行著的任務(wù)使一個比它優(yōu)先級高的任務(wù)進(jìn)入了就緒態(tài),當(dāng)前任務(wù)的cpu 使用權(quán)就被剝奪了,或者說被掛起了,那個高優(yōu)先級的任務(wù)立刻得到了cpu的控制權(quán),可剝奪型內(nèi)核示例,使用可剝奪型內(nèi)核,最高優(yōu)先級的任務(wù)什么時候可以執(zhí)行,可以得到cpu 的控制權(quán)是可知的。使用可剝奪型內(nèi)核使得任務(wù)級響應(yīng)時間得以最優(yōu)化。 使用可剝奪型內(nèi)核時,應(yīng)用程序不應(yīng)直接使用不可重入型函數(shù)。調(diào)用不可重入型函數(shù)時,要滿足互斥條件,這一點(diǎn)可以用互斥型信號量來實(shí)現(xiàn),可重入型函數(shù)可以被一個以上的任務(wù)調(diào)用,而不必?fù)?dān)

13、心數(shù)據(jù)的破壞。 可重入型函數(shù)任何時候都可以被中斷,一段時間以后又可以運(yùn)行,而相應(yīng)數(shù)據(jù)不會丟失??芍厝胄秃瘮?shù)或者只使用局部變量,即變量保存在cpu寄存器中或堆棧中。如果使用全局變量,則要對全局變量予以保護(hù),2.11 可重入性(reentrancy,可重入型函數(shù),void strcpy(char *dest, char *src) while (*dest+ = *src+) ; *dest = nul;,不可重入型函數(shù),int temp; void swap(int *x, int *y) temp = *x; *x = *y; *y = temp;,使用以下技術(shù)之一即可使swap()函數(shù)具有可

14、重入性: 把temp 定義為局部變量 調(diào)用swap()函數(shù)之前關(guān)中斷,調(diào)動后再開中斷 用信號量禁止該函數(shù)在使用過程中被再次調(diào)用,2.12 時間片輪番調(diào)度法,當(dāng)兩個或兩個以上任務(wù)有同樣優(yōu)先級,內(nèi)核允許一個任務(wù)運(yùn)行事先確定的一段時間,叫做時間額度(quantum),然后切換給另一個任務(wù)。也叫做時間片調(diào)度。內(nèi)核在滿足以下條件時,把cpu控制權(quán)交給下一個任務(wù)就緒態(tài)的任務(wù): 當(dāng)前任務(wù)已無事可做 當(dāng)前任務(wù)在時間片還沒結(jié)束時已經(jīng)完成了。 目前,c/os-不支持時間片輪番調(diào)度法。應(yīng)用程序中各任務(wù)的優(yōu)先級必須互不相同,2.13 任務(wù)優(yōu)先級,每個任務(wù)都有其優(yōu)先級。任務(wù)越重要,賦予的優(yōu)先級應(yīng)越高,2.14 靜態(tài)優(yōu)先

15、級,應(yīng)用程序執(zhí)行過程中諸任務(wù)優(yōu)先級不變,則稱之為靜態(tài)優(yōu)先級。在靜態(tài)優(yōu)先級系統(tǒng)中,諸任務(wù)以及它們的時間約束在程序編譯時是已知的,2.15動態(tài)優(yōu)先級,應(yīng)用程序執(zhí)行過程中,任務(wù)的優(yōu)先級是可變的,則稱之為動態(tài)優(yōu)先級。實(shí)時內(nèi)核應(yīng)當(dāng)避免出現(xiàn)優(yōu)先級反轉(zhuǎn)問題,2.16優(yōu)先級反轉(zhuǎn),使用實(shí)時內(nèi)核,優(yōu)先級反轉(zhuǎn)問題是實(shí)時系統(tǒng)中出現(xiàn)得最多的問題。 為防止發(fā)生優(yōu)先級反轉(zhuǎn),內(nèi)核能自動變換任務(wù)的優(yōu)先級,這叫做優(yōu)先級繼承(priority inheritance)。但c/os-不支持優(yōu)先級繼承,一些商業(yè)內(nèi)核有優(yōu)先級繼承功能,2.17 任務(wù)優(yōu)先級分配,給任務(wù)定優(yōu)先級可不是件小事,因?yàn)閷?shí)時系統(tǒng)相當(dāng)復(fù)雜。許多系統(tǒng)中,并非所有的任務(wù)都

16、至關(guān)重要。不重要的任務(wù)自然優(yōu)先級可以低一些。實(shí)時系統(tǒng)大多綜合了軟實(shí)時和硬實(shí)時這兩種需求。軟實(shí)時系統(tǒng)只是要求任務(wù)執(zhí)行得盡量快,并不要求在某一特定時間內(nèi)完成。硬實(shí)時系統(tǒng)中,任務(wù)不但要執(zhí)行無誤,還要準(zhǔn)時完成。 單調(diào)執(zhí)行率調(diào)度法rms(rate monotonic scheduling)-用于分配任務(wù)優(yōu)先級。這種方法基于哪個任務(wù)執(zhí)行的次數(shù)最頻繁,執(zhí)行最頻繁的任務(wù)優(yōu)先級最高,2.18 互斥條件,實(shí)現(xiàn)任務(wù)間通訊最簡便到辦法是使用共享數(shù)據(jù)結(jié)構(gòu)。特別是當(dāng)所有到任務(wù)都在一個單一地址空間下,能使用全程變量、指針、緩沖區(qū)、鏈表、循環(huán)緩沖區(qū)等,使用共享數(shù)據(jù)結(jié)構(gòu)通訊就更為容易。雖然共享數(shù)據(jù)區(qū)法簡化了任務(wù)間的信息交換,但

17、是必須保證每個任務(wù)在處理共享數(shù)據(jù)時的排它性,以避免競爭和數(shù)據(jù)的破壞。與共享資源打交道時,使之滿足互斥條件最一般的方法有,關(guān)中斷 使用測試并置位指令 禁止做任務(wù)切換 利用信號量,2.18.1 關(guān)中斷和開中斷,程序清單 關(guān)中斷和開中斷 disable interrupts; /*關(guān)中斷*/ access the resource (read/write from/to variables); /*讀/寫變量*/ reenable interrupts; /*重新允許中斷*,實(shí)際上c/os-提供兩個宏調(diào)用,允許用戶在應(yīng)用程序的c 代碼中關(guān)中斷然后再開中斷:os_enter_critical()和os

18、_exit_critical,這兩個宏調(diào)用的使用法見程序: 程序清單2.4利用c/os_ 宏調(diào)用關(guān)中斷和開中斷 void function (void) os_enter_critical(); . . /*在這里處理共享數(shù)據(jù)*/ . os_exit_critical();,關(guān)中斷的時間不能太長。因?yàn)樗绊懻麄€系統(tǒng)的中斷響應(yīng)時間,即中斷延遲時間。當(dāng)改變或復(fù)制某幾個變量的值時,應(yīng)想到用這種方法來做。這也是在中斷服務(wù)子程序中處理共享變量或共享數(shù)據(jù)結(jié)構(gòu)的唯一方法。在任何情況下,關(guān)中斷的時間都要盡量短。 如果使用某種實(shí)時內(nèi)核,一般地說,關(guān)中斷的最長時間不超過內(nèi)核本身的關(guān)中斷時間,就不會影響系統(tǒng)中斷延遲

19、,2.18.2 測試并置位,如果不使用實(shí)時內(nèi)核,當(dāng)兩個任務(wù)共享一個資源時,一定要約定好,先測試某一全程變量,如果該變量是0,允許該任務(wù)與共享資源打交道。為防止另一任務(wù)也要使用該資源,前者只要簡單地將全程變量置為1,這通常稱作測試并置位(test-and-set),或稱作tas。tas操作可能是微處理器的單獨(dú)一條不會被中斷的指令,或者是在程序中關(guān)中斷做tas操作再開中斷,程序清單2.5 利用測試并置位處理共享資源 disable interrupts; 關(guān)中斷 if (access variable is 0) 如果資源未占用,標(biāo)志為0 set variable to 1; 置資源不可用,標(biāo)志為

20、1 reenable interrupts; 重開中斷 access the resource; 處理該資源 disable interrupts; 關(guān)中斷 set the access variable back to 0; 清資源不可使用,標(biāo)志為0 reenable interrupts; 重新開中斷 else 否則 reenable interrupts; 開中斷 /* you dont have access to the resource, try back later; */ /* 資源不可使用,以后再試; */,2.18.3 禁止,然后允許任務(wù)切換,如果任務(wù)不與中斷服務(wù)子程序共享

21、變量或數(shù)據(jù)結(jié)構(gòu),可以使用禁止、然后允許任務(wù)切換。 如下述程序清單所示,以c/os-的使用為例,兩個或兩個以上的任務(wù)可以共享數(shù)據(jù)而不發(fā)生競爭。注意,此時雖然任務(wù)切換是禁止了,但中斷還是開著的。如果這時中斷來了,中斷服務(wù)子程序會在這一臨界區(qū)內(nèi)立即執(zhí)行。中斷服務(wù)子程序結(jié)束時,盡管有優(yōu)先級高的任務(wù)已經(jīng)進(jìn)入就緒態(tài),內(nèi)核還是返回到原來被中斷了的任務(wù)。直到執(zhí)行完給任務(wù)切換開鎖函數(shù)osschedunlock (),內(nèi)核再看有沒有優(yōu)先級更高的任務(wù)被中斷服務(wù)子程序激活而進(jìn)入就緒態(tài),如果有,則做任務(wù)切換,程序清單2.6 用給任務(wù)切換上鎖,然后開鎖的方法實(shí)現(xiàn)數(shù)據(jù)共享. void function (void) oss

22、chedlock(); . . /* you can access shared data in here (interrupts are recognized) */ . /*在這里處理共享數(shù)據(jù)(中斷是開著的)*/ osschedunlock();,2.18.4 信號量(semaphores,信號量是60年代中期edgser dijkstra 發(fā)明的。信號量實(shí)際上是一種約定機(jī)制,在多任務(wù)內(nèi)核中普遍使用。信號量用于: 控制共享資源的使用權(quán)(滿足互斥條件) 標(biāo)志某事件的發(fā)生 使兩個任務(wù)的行為同步 信號像是一把鑰匙,任務(wù)要運(yùn)行下去,得先拿到這把鑰匙。如果信號已被別的任務(wù)占用,該任務(wù)只得被掛起,直到

23、信號被當(dāng)前使用者釋放,信號是只有兩個值的變量,信號量是計(jì)數(shù)式的。只取兩個值的信號是只有兩個值0 和1的量,因此也稱之為信號量。計(jì)數(shù)式信號量的值可以是0 到255 或0 到65535,或0 到4294967295,取決于信號量規(guī)約機(jī)制使用的是8 位、16位還是32 位。 一般地說,對信號量只能實(shí)施三種操作:初始化initialize),也可稱作建立(create);等信號(wait)也可稱作掛起(pend);給信號(signal)或發(fā)信號(post,信號量初始化時要給信號量賦初值,等待信號量的任務(wù)表(waiting list)應(yīng)清為空,想要得到信號量的任務(wù)執(zhí)行等待(wait)操作。 如果該信號量

24、有效(即信號量值大于0),則信號量值減1,任務(wù)得以繼續(xù)運(yùn)行。 如果信號量的值為0,等待信號量的任務(wù)就被列入等待信號量任務(wù)表,任務(wù)以發(fā)信號操作(signal)釋放信號量。如果沒有任務(wù)在等待信號量,信號量的值僅僅是簡單地加1。如果有任務(wù)在等待該信號量,那么就會有一個任務(wù)進(jìn)入就緒態(tài),信號量的值也就不加1。 收到信號量的任務(wù)可能是以下兩者之一 等待信號量任務(wù)中優(yōu)先級最高的,或者是 最早開始等待信號量的那個任務(wù),即按先進(jìn)先出的原則(first in first out ,fifo,程序清單2.7 通過獲得信號量處理共享數(shù)據(jù) os_event *shareddatasem; void function (

25、void) int8u err; ossempend(shareddatasem, 0,如果中斷服務(wù)程序或當(dāng)前任務(wù)激活了一個高優(yōu)先級的任務(wù),高優(yōu)先級的任務(wù)立即開始執(zhí)行,當(dāng)諸任務(wù)共享輸入輸出設(shè)備時,信號量特別有用。 如:多任務(wù)同時訪問打印機(jī)。使用信號量并給信號量賦初值1(用二進(jìn)制信號量)。要想使用打印機(jī)的任務(wù),先要得到該資源的信號量,用獲取信號量來得到打印機(jī)使用權(quán),每個任務(wù)都知道有個信號表示資源可不可以使用。要想使用該資源,要先得到這個信號。然而有些情況下,最好把信號量藏起來,各個任務(wù)在同某一資源打交道時,并不知道實(shí)際上是在申請得到一個信號量。例如,多任務(wù)共享一個rs-232c 外設(shè)接口,各任務(wù)

26、要送命令給接口另一端的設(shè)備并接收該設(shè)備的回應(yīng),在任務(wù)級看不到隱含的信號量,程序清單 2.8 隱含的信號量。 int8u commsendcmd(char *cmd, char *response, int16u timeout) acquire ports semaphore; send command to device; wait for response (with timeout); if (timed out) release semaphore; return (error code); else release semaphore; return (no error);,計(jì)數(shù)式信

27、號量用于某資源可以同時為幾個任務(wù)所用。例如,用信號量管理緩沖區(qū)陣列(buffer pool),如圖2.12 所示。緩沖區(qū)陣列中共有10 個緩沖區(qū),任務(wù)通過調(diào)用申請緩沖區(qū)函數(shù)bufreq()向緩沖區(qū)管理方申請得到緩沖區(qū)使用權(quán)。當(dāng)緩沖區(qū)使用權(quán)還不再需要時,通過調(diào)用釋放緩沖區(qū)函數(shù)bufrel()將緩沖區(qū)還給管方。函數(shù)示意碼如程序清單2.9所示,程序清單 2.9 用信號量管理緩沖區(qū)。 buf *bufreq(void) buf *ptr; acquire a semaphore; disable interrupts; ptr = buffreelist; buffreelist = ptr-bufn

28、ext; enable interrupts; return (ptr); void bufrel(buf *ptr) disable interrupts; ptr-bufnext = buffreelist; buffreelist = ptr; enable interrupts; release semaphore;,處理簡單的共享變量也使用信號量則是多余的。請求和釋放信號量的過程是要花相當(dāng)?shù)臅r間的。有時這種額外的負(fù)荷是不必要的。用戶可能只需要關(guān)中斷、開中斷來處理簡單共享變量,以提高效率,2.19 死鎖(或抱死)(deadlock (or deadly embrace),死鎖也稱作抱死

29、,指兩個任務(wù)無限期地互相等待對方控制著的資源。設(shè)任務(wù)t1 正獨(dú)享資源r1,任務(wù)t2 在獨(dú)享資源r2,而此時t1 又要獨(dú)享r2,t2 也要獨(dú)享r1,于是哪個任務(wù)都沒法繼續(xù)執(zhí)行了,發(fā)生了死鎖。最簡單的防止發(fā)生死鎖的方法是讓每個任務(wù)都: 先得到全部需要的資源再做下一步的工作 用同樣的順序去申請多個資源 釋放資源時使用相反的順序,內(nèi)核大多允許用戶在申請信號量時定義等待超時,以此化解死鎖。當(dāng)?shù)却龝r間超過了某一確定值,信號量還是無效狀態(tài),就會返回某種形式的出現(xiàn)超時錯誤的代碼,這個出錯代碼告知該任務(wù),不是得到了資源使用權(quán),而是系統(tǒng)錯誤。死鎖一般發(fā)生在大型多任務(wù)系統(tǒng)中,在嵌入式系統(tǒng)中不易出現(xiàn),2.20 同步,

30、可以利用信號量使某任務(wù)與中斷服務(wù)同步(或者是與另一個任務(wù)同步,這兩個任務(wù)間沒有數(shù)據(jù)交換,圖2.13 用信號量使任務(wù)與中斷服務(wù)同步,用來實(shí)現(xiàn)同步機(jī)制的信號量初始化成0,信號量用于這種類型同步的稱作單向同步(unilateral rendezvous)。一個任務(wù)做i/o操作,然后等信號回應(yīng)。當(dāng)i/o 操作完成,中斷服務(wù)程序(或另外一個任務(wù))發(fā)出信號,該任務(wù)得到信號后繼續(xù)往下執(zhí)行,如果內(nèi)核支持計(jì)數(shù)式信號量,信號量的值表示尚未得到處理的事件數(shù)。請注意,可能會有一個以上的任務(wù)在等待同一事件的發(fā)生,則這種情況下內(nèi)核會根據(jù)以下原則之一發(fā)信號給相應(yīng)的任務(wù): 發(fā)信號給等待事件發(fā)生的任務(wù)中優(yōu)先級最高的任務(wù),或者

31、發(fā)信號給最先開始等待事件發(fā)生的那個任務(wù),兩個任務(wù)可以用兩個信號量同步它們的行為。如圖2.14 所示。這叫做雙向同步(bilateral rendezvous)。雙向同步同單向同步類似,只是兩個任務(wù)要相互同步,圖2.14 兩個任務(wù)用信號量同步彼此的行為,程序清單2.10 雙向同步 task1() for (;) perform operation; signal task #2; (1) wait for signal from task #2; (2) continue operation; task2() for (;) perform operation; signal task #1;

32、(3) wait for signal from task #1; (4) continue operation;,2.21 事件標(biāo)志(event flags,當(dāng)某任務(wù)要與多個事件同步時,要使用事件標(biāo)志。若任務(wù)需要與任何事件之一發(fā)生同步,可稱為獨(dú)立型同步(即邏輯或關(guān)系)。任務(wù)也可以與若干事件都發(fā)生了同步,稱之為關(guān)聯(lián)型(邏輯與關(guān)系)。獨(dú)立型及關(guān)聯(lián)型同步如圖2.15所示,圖2.15 獨(dú)立型及關(guān)聯(lián)型同步,可以用多個事件的組合發(fā)信號給多個任務(wù)。如圖2.16所示,典型地,8 個、16個或32個事件可以組合在一起,取決于用的哪種內(nèi)核。每個事件占一位(bit),以32位的情況為多。任務(wù)或中斷服務(wù)可以給某一位

33、置位或復(fù)位,當(dāng)任務(wù)所需的事件都發(fā)生了,該任務(wù)繼續(xù)執(zhí)行,至于哪個任務(wù)該繼續(xù)執(zhí)行了,是在一組新的事件發(fā)生時斷定的。也就是在事件位置位時做判斷,2.22 任務(wù)間的通訊(intertask communication,有時很需要任務(wù)間的或中斷服務(wù)與任務(wù)間的通訊。這種信息傳遞稱為任務(wù)間的通訊。任務(wù)間信息的傳遞有兩個途徑:通過全程變量或發(fā)消息給另一個任務(wù)。 用全程變量時,必須保證每個任務(wù)或中斷服務(wù)程序獨(dú)享該變量。中斷服務(wù)中保證獨(dú)享的唯一辦法是關(guān)中斷。如果兩個任務(wù)共享某變量,各任務(wù)實(shí)現(xiàn)獨(dú)享該變量的辦法可以是關(guān)中斷再開中斷,或使用信號量,問題:任務(wù)如何知道全局變量被修改? 解決方法: 以信號量方式向任務(wù)發(fā)信號

34、 該任務(wù)以查詢方式不斷周期性地查詢變量的值 使用郵箱或消息隊(duì)列,2.23 消息郵箱(message mail boxes,通過內(nèi)核服務(wù)可以給任務(wù)發(fā)送消息。典型的消息郵箱也稱作交換消息,是用一個指針型變量,通過內(nèi)核服務(wù),一個任務(wù)或一個中斷服務(wù)程序可以把一則消息(即一個指針)放到郵箱里去。同樣,一個或多個任務(wù)可以通過內(nèi)核服務(wù)接收這則消息。發(fā)送消息的任務(wù)和接收消息的任務(wù)約定,該指針指向的內(nèi)容就是那則消息,內(nèi)核一般提供以下郵箱服務(wù): 郵箱內(nèi)消息的內(nèi)容初始化,郵箱里最初可以有,也可以沒有消息 將消息放入郵箱(post) 等待有消息進(jìn)入郵箱(pend) 如果郵箱內(nèi)有消息,就接受這則消息。如果郵箱里沒有消息

35、,則任務(wù)并不被掛起(accept),用返回代碼表示調(diào)用結(jié)果,是收到了消息還是沒有收到消息。 消息郵箱也可以當(dāng)作只取兩個值的信號量來用,2.24 消息隊(duì)列(message queue,消息隊(duì)列實(shí)際上是郵箱陣列,圖2.18 消息隊(duì)列,2.25 中斷,中斷是一種硬件機(jī)制,用于通知cpu有個異步事件發(fā)生了。中斷一旦被識別,cpu保存部分(或全部)現(xiàn)場(context)即部分或全部寄存器的值,跳轉(zhuǎn)到專門的子程序,稱為中斷服務(wù)子程序(isr)。中斷服務(wù)子程序做事件處理,處理完成后,程序回到: 在前后臺系統(tǒng)中,程序回到后臺程序 對不可剝奪型內(nèi)核而言,程序回到被中斷了的任務(wù) 對可剝奪型內(nèi)核而言,讓進(jìn)入就緒態(tài)的

36、優(yōu)先級最高的任務(wù)開始運(yùn)行,圖2.19 中斷嵌套,2.26 中斷延遲,所有實(shí)時系統(tǒng)在進(jìn)入臨界區(qū)代碼段之前都要關(guān)中斷,執(zhí)行完臨界代碼之后再開中斷。關(guān)中斷的時間越長,中斷延遲就越長。中斷延遲由下面表達(dá)式給出。 中斷延遲 = 關(guān)中斷的最長時間 + 開始執(zhí)行中斷服務(wù)子程序的第一條指令的時間,2.27 中斷響應(yīng),中斷響應(yīng)-從中斷發(fā)生到開始執(zhí)行用戶的中斷服務(wù)子程序代碼來處理這個中斷的時間。 中斷響應(yīng)時間包括開始處理這個中斷前的全部開銷。(保護(hù)現(xiàn)場,對前后臺系統(tǒng),保存寄存器以后立即執(zhí)行用戶代碼,中斷響應(yīng)時間由下式給出。 中斷響應(yīng)時間 = 中斷延遲 + 保存cpu內(nèi)部寄存器的時間 對于不可剝奪型內(nèi)核,微處理器保

37、存內(nèi)部寄存器以后,用戶的中斷服務(wù)子程序代碼全立即得到執(zhí)行。不可剝奪型內(nèi)核的中斷響應(yīng)時間由下式給出。 中斷響應(yīng)時間 = 中斷延遲 + 保存cpu內(nèi)部寄存器的時間,對于可剝奪型內(nèi)核,則要先調(diào)用一個特定的函數(shù),該函數(shù)通知內(nèi)核即將進(jìn)行中斷服務(wù),使得內(nèi)核可以跟蹤中斷的嵌套。對于 c/os-說來,這個函數(shù)是osintenter(),可剝奪型內(nèi)核的中斷響應(yīng)時間由下式給出: 中斷響應(yīng) 中斷延遲 + 保存cpu 內(nèi)部寄存器的時間 + 內(nèi)核的進(jìn)入中斷服務(wù)函數(shù)的執(zhí)行時間 中斷響應(yīng)是系統(tǒng)在最壞情況下的響應(yīng)中斷的時間,2.28 中斷恢復(fù)時間(interrupt recovery,中斷恢復(fù)時間定義為微處理器返回到被中斷了的程序代碼所需要的時間。 前后臺系統(tǒng): 中斷恢復(fù)時間 = 恢復(fù)cpu 內(nèi)部寄存器值的時間 + 執(zhí)行中斷返回指令的時間 不可剝奪型內(nèi)核: 中斷恢復(fù)時間 = 恢復(fù)cpu 內(nèi)部寄存器值的時間 + 執(zhí)行中斷返回指令的時間,可剝奪型內(nèi)核在中斷服務(wù)子程序的末尾,要調(diào)用一個由實(shí)時內(nèi)核提供的函數(shù)。c/os-中這個函數(shù)為osintexit(),用于判斷中斷是否脫離了所有的中斷嵌套。 中斷恢復(fù)時間 = 判定是否有優(yōu)先級更高的任務(wù)進(jìn)入了就緒態(tài)的時間 + 恢復(fù)那個優(yōu)先級更高任務(wù)的cpu內(nèi)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論