版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1,2020/11/4,嵌入式實(shí)時(shí)操作系統(tǒng) C/OS-II,2020/11/4,2,第2章 實(shí)時(shí)系統(tǒng)概念,3,2020/11/4,實(shí)時(shí)系統(tǒng)概念,軟實(shí)時(shí)系統(tǒng)-各個(gè)任務(wù)盡快運(yùn)行,不要求限定某一任務(wù)在多長(zhǎng)時(shí)間內(nèi)完成。 硬實(shí)時(shí)系統(tǒng)-任務(wù)要做到準(zhǔn)時(shí)。,2.0 前/后臺(tái)系統(tǒng),不復(fù)雜的小系統(tǒng)一般設(shè)計(jì)成如下圖所示的樣子。這種系統(tǒng)可稱(chēng)為前后臺(tái)系統(tǒng)或超循環(huán)系統(tǒng)(Super-Loops)。,4,2020/11/4,5,2020/11/4,后臺(tái)是一個(gè)循環(huán)輪詢(xún)系統(tǒng)一直在運(yùn)行。 前臺(tái)是由一些中斷處理過(guò)程組成的。 當(dāng)有一前臺(tái)事件(外部事件)發(fā)生時(shí),引起中斷, 進(jìn)行前臺(tái)處理, 處理完成后又回到后臺(tái)(通常又稱(chēng)主程序)。,中斷1
2、,中斷2,ISR1,ISR2,前臺(tái)處理,后臺(tái)處理,ISR3,實(shí)時(shí)性?,認(rèn)為所有的任務(wù)具有相同的優(yōu)先級(jí)別 任務(wù)的執(zhí)行通過(guò)FIFO隊(duì)列排隊(duì) 某執(zhí)行任務(wù)崩潰會(huì)造成整個(gè)系統(tǒng)的崩潰,應(yīng)用程序是一個(gè)無(wú)限的循環(huán),循環(huán)中調(diào)用相應(yīng)的函數(shù)完成相應(yīng)的操作,這部分可以看成后臺(tái)行為(background)。中斷服務(wù)程序處理異步事件,這部分可以看成前臺(tái)行為(foreground)。后臺(tái)也可以叫做任務(wù)級(jí)。前臺(tái)也叫中斷級(jí)。,8,2020/11/4,9,2020/11/4,時(shí)間相關(guān)性很強(qiáng)的關(guān)鍵操作(Critical operation)一定是靠中斷服務(wù)來(lái)保證的。因?yàn)橹袛喾?wù)提供的信息一直要等到后臺(tái)程序走到該處理這個(gè)信息這一步時(shí)
3、才能得到處理,這種系統(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.01 代碼的臨界段,代碼的臨界段也稱(chēng)為臨界區(qū),指處理時(shí)不可分割的代碼。 一旦這部分代碼開(kāi)始執(zhí)行,則不允許任何中斷打入。為確保臨界段代碼的執(zhí)行,在進(jìn)入臨界段之前要關(guān)中斷,而臨界段代碼執(zhí)行完以后要立即開(kāi)中斷。,10,2020/11/4,2.02 資源,資源-任何為任務(wù)所占用的實(shí)體都可稱(chēng)為資源。 資源可以是輸入輸出設(shè)備,例如打印機(jī)、
4、鍵盤(pán)、顯示器,資源也可以是一個(gè)變量,一個(gè)結(jié)構(gòu)或一個(gè)數(shù)組等。,11,2020/11/4,2.03 共享資源,共享資源-可以被一個(gè)以上任務(wù)使用的資源叫做共享資源。 為了防止數(shù)據(jù)被破壞,每個(gè)任務(wù)在與共享資源打交道時(shí),必須獨(dú)占該資源。這叫做互斥(mutual exclusion)。,12,2020/11/4,2.04 多任務(wù),多任務(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ā)人員可以將很
5、復(fù)雜的應(yīng)用程序?qū)哟位?。使用多任?wù),應(yīng)用程序?qū)⒏菀自O(shè)計(jì)與維護(hù)。,13,2020/11/4,流程,并發(fā)多任務(wù),:,:,后臺(tái),前臺(tái),ISRs,Tasks,多任務(wù)系統(tǒng) 多個(gè)順序執(zhí)行的程序并行運(yùn)行。 宏觀上看,所有的程序同時(shí)運(yùn)行,每個(gè)程序運(yùn)行在自己獨(dú)立的CPU上。 實(shí)際上,不同的程序是共享同一個(gè)CPU和其它硬件。因此,需要RTOS來(lái)對(duì)這些共享的設(shè)備和數(shù)據(jù)進(jìn)行管理。 每個(gè)程序都被編制成無(wú)限循環(huán)的程序,等待特定的輸入,執(zhí)行相應(yīng)的任務(wù)等。 這種程序模型將系統(tǒng)分成相對(duì)簡(jiǎn)單的,相互合作的模塊。,單處理器多任務(wù)系統(tǒng),優(yōu)點(diǎn) 將復(fù)雜的系統(tǒng)分解為相對(duì)獨(dú)立的多個(gè)線(xiàn)程, 達(dá)到“分而治之”的目的,從而降低系統(tǒng)的復(fù)雜性。 保證
6、系統(tǒng)的實(shí)時(shí)性。 系統(tǒng)的模塊化好,提高系統(tǒng)的可維護(hù)性。 缺點(diǎn) 需要采用一些新的軟件設(shè)計(jì)方法。 需要增加功能:線(xiàn)程間的協(xié)調(diào),同步和通信功能。 需要對(duì)每一個(gè)共享資源互斥。 導(dǎo)致線(xiàn)程間的競(jìng)爭(zhēng)。 需要使用RTOS,RTOS要增加系統(tǒng)的開(kāi)銷(xiāo)。,單處理器多任務(wù)系統(tǒng),多處理器多任務(wù)系統(tǒng),多任務(wù)可運(yùn)行在多個(gè)處理器上,由操作系統(tǒng)統(tǒng)一調(diào)度,處理。 宏觀上看是并發(fā)的,微觀上看也是并發(fā)的。 多處理機(jī)系統(tǒng)分為緊耦合系統(tǒng)(tightly-coupled system)和松耦合系統(tǒng)(loosely-coupled system)兩種。 多處理器多任務(wù)系統(tǒng)目前還不成熟。,2.05 任務(wù),18,2020/11/4,一個(gè)任務(wù),也稱(chēng)
7、作一個(gè)線(xiàn)程,是一個(gè)簡(jiǎn)單的程序,該程序可以認(rèn)為CPU 完全只屬該程序自己。實(shí)時(shí)應(yīng)用程序的設(shè)計(jì)過(guò)程,包括如何把問(wèn)題分割成多個(gè)任務(wù),每個(gè)任務(wù)都是整個(gè)應(yīng)用的某一部分,每個(gè)任務(wù)被賦予一定的優(yōu)先級(jí),有它自己的一套CPU 寄存器和自己的??臻g。,19,每個(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)。 休眠態(tài)-相當(dāng)于該任務(wù)駐留在內(nèi)存中,但并不被多任務(wù)內(nèi)核所調(diào)度。 就緒態(tài)-意味著該任務(wù)已經(jīng)準(zhǔn)備好,可以運(yùn)行了,但由于該任務(wù)的優(yōu)先級(jí)比正在運(yùn)行的任務(wù)的優(yōu)先級(jí)低,還暫時(shí)不能運(yùn)行。,20,運(yùn)行態(tài)-是指該任務(wù)掌握了CPU 的控制
8、權(quán),正在運(yùn)行中。 掛起狀態(tài)-也可以叫做等待事件態(tài)WAITING,指該任務(wù)在等待,等待某一事件的發(fā)生,(例如等待某外設(shè)的I/O 操作,等待某共享資源由暫不能使用變成能使用狀態(tài),等待定時(shí)脈沖的到來(lái)或等待超時(shí)信號(hào)的到來(lái)以結(jié)束目前的等待,等等)。 被中斷態(tài)-發(fā)生中斷時(shí),CPU提供相應(yīng)的中斷服務(wù),原來(lái)正在運(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ū)中翻譯成上下文切換,實(shí)際含義是任務(wù)切換,或CPU 寄存器內(nèi)容切換。 當(dāng)多任務(wù)內(nèi)核決定運(yùn)
9、行另外的任務(wù)時(shí),它保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài)(Context),即CPU寄存器中的全部?jī)?nèi)容。這些內(nèi)容保存在任務(wù)的當(dāng)前狀況保存區(qū)(Tasks Context Storage area),也就是任務(wù)自己的棧區(qū)之中。 任務(wù)切換-入棧工作完成以后,就是把下一個(gè)將要運(yùn)行的任務(wù)的當(dāng)前狀況從該任務(wù)的棧中重新裝入CPU 的寄存器,并開(kāi)始下一個(gè)任務(wù)的運(yùn)行。 任務(wù)切換過(guò)程增加了應(yīng)用程序的額外負(fù)荷。,2.07 內(nèi)核(Kernel),多任務(wù)系統(tǒng)中,內(nèi)核負(fù)責(zé)管理各個(gè)任務(wù),或者說(shuō)為每個(gè)任務(wù)分配CPU時(shí)間,并且負(fù)責(zé)任務(wù)之間的通訊。內(nèi)核提供的基本服務(wù)是任務(wù)切換。 內(nèi)核本身也增加了應(yīng)用程序的額外負(fù)荷,代碼空間增加ROM 的用量
10、,內(nèi)核本身的數(shù)據(jù)結(jié)構(gòu)增加了RAM的用量。但更主要的是,每個(gè)任務(wù)要有自己的??臻g,這一塊吃起內(nèi)存來(lái)是相當(dāng)厲害的。內(nèi)核本身對(duì)CPU 的占用時(shí)間一般在2 到5個(gè)百分點(diǎn)之間。,2.08 調(diào)度(Scheduler),調(diào)度(Scheduler),英文還有一詞叫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)行。 讓高優(yōu)先級(jí)任務(wù)掌握CPU 的使用權(quán),有兩種不同的情況,不可剝奪型內(nèi)核 可剝奪型內(nèi)核。,2.09 不可剝
11、奪型內(nèi)核 (Non-Preemptive Kernel),不可剝奪型內(nèi)核要求每個(gè)任務(wù)自我放棄CPU 的所有權(quán)。不可剝奪型調(diào)度法也稱(chēng)作合作型多任務(wù),各個(gè)任務(wù)彼此合作共享一個(gè)CPU。 不可剝奪型內(nèi)核的一個(gè)優(yōu)點(diǎn)是響應(yīng)中斷快。 在任務(wù)級(jí),不可剝奪型內(nèi)核允許使用不可重入函數(shù)。,不可剝奪型內(nèi)核示例,不可剝奪型內(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。不可剝奪型內(nèi)核的任務(wù)級(jí)響應(yīng)時(shí)間是不確定的,不知道什么時(shí)候最高優(yōu)先級(jí)的任務(wù)才能拿到CPU 的控制權(quán),完全取決于應(yīng)用程序什么時(shí)候釋放CPU。 商業(yè)軟件幾乎沒(méi)有不可剝奪型內(nèi)核。,
12、2.10 可剝奪型內(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)。,可剝奪型內(nèi)核示例,使用可剝奪型內(nèi)核,最高優(yōu)先級(jí)的任務(wù)什么時(shí)候可以執(zhí)行,可以得到CPU 的控制權(quán)是可知的。使用可剝奪型內(nèi)核使得任務(wù)級(jí)響應(yīng)時(shí)間得以最優(yōu)化。 使用可剝奪型內(nèi)核時(shí),應(yīng)用程序不應(yīng)直接使用不可重入型函數(shù)。調(diào)用不可重入型函數(shù)時(shí),要滿(mǎn)足互斥條件,這一點(diǎn)可以用
13、互斥型信號(hào)量來(lái)實(shí)現(xiàn)。,可重入型函數(shù)可以被一個(gè)以上的任務(wù)調(diào)用,而不必?fù)?dān)心數(shù)據(jù)的破壞。 可重入型函數(shù)任何時(shí)候都可以被中斷,一段時(shí)間以后又可以運(yùn)行,而相應(yīng)數(shù)據(jù)不會(huì)丟失??芍厝胄秃瘮?shù)或者只使用局部變量,即變量保存在CPU寄存器中或堆棧中。如果使用全局變量,則要對(duì)全局變量予以保護(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 =
14、*y; *y = Temp; ,使用以下技術(shù)之一即可使Swap()函數(shù)具有可重入性: 把Temp 定義為局部變量 調(diào)用Swap()函數(shù)之前關(guān)中斷,調(diào)動(dòng)后再開(kāi)中斷 用信號(hào)量禁止該函數(shù)在使用過(guò)程中被再次調(diào)用,2.12 時(shí)間片輪番調(diào)度法,當(dāng)兩個(gè)或兩個(gè)以上任務(wù)有同樣優(yōu)先級(jí),內(nèi)核允許一個(gè)任務(wù)運(yùn)行事先確定的一段時(shí)間,叫做時(shí)間額度(quantum),然后切換給另一個(gè)任務(wù)。也叫做時(shí)間片調(diào)度。內(nèi)核在滿(mǎn)足以下條件時(shí),把CPU控制權(quán)交給下一個(gè)任務(wù)就緒態(tài)的任務(wù): 當(dāng)前任務(wù)已無(wú)事可做 當(dāng)前任務(wù)在時(shí)間片還沒(méi)結(jié)束時(shí)已經(jīng)完成了。 目前,C/OS-不支持時(shí)間片輪番調(diào)度法。應(yīng)用程序中各任務(wù)的優(yōu)先級(jí)必須互不相同。,2.13 任務(wù)優(yōu)
15、先級(jí),每個(gè)任務(wù)都有其優(yōu)先級(jí)。任務(wù)越重要,賦予的優(yōu)先級(jí)應(yīng)越高。,2.14 靜態(tài)優(yōu)先級(jí),應(yīng)用程序執(zhí)行過(guò)程中諸任務(wù)優(yōu)先級(jí)不變,則稱(chēng)之為靜態(tài)優(yōu)先級(jí)。在靜態(tài)優(yōu)先級(jí)系統(tǒng)中,諸任務(wù)以及它們的時(shí)間約束在程序編譯時(shí)是已知的。,2.15動(dòng)態(tài)優(yōu)先級(jí),應(yīng)用程序執(zhí)行過(guò)程中,任務(wù)的優(yōu)先級(jí)是可變的,則稱(chēng)之為動(dòng)態(tài)優(yōu)先級(jí)。實(shí)時(shí)內(nèi)核應(yīng)當(dāng)避免出現(xiàn)優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題。,2.16優(yōu)先級(jí)反轉(zhuǎn),使用實(shí)時(shí)內(nèi)核,優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題是實(shí)時(shí)系統(tǒng)中出現(xiàn)得最多的問(wèn)題。 為防止發(fā)生優(yōu)先級(jí)反轉(zhuǎn),內(nèi)核能自動(dòng)變換任務(wù)的優(yōu)先級(jí),這叫做優(yōu)先級(jí)繼承(Priority inheritance)。但C/OS-不支持優(yōu)先級(jí)繼承,一些商業(yè)內(nèi)核有優(yōu)先級(jí)繼承功能。,2.17 任務(wù)優(yōu)先
16、級(jí)分配,給任務(wù)定優(yōu)先級(jí)可不是件小事,因?yàn)閷?shí)時(shí)系統(tǒng)相當(dāng)復(fù)雜。許多系統(tǒng)中,并非所有的任務(wù)都至關(guān)重要。不重要的任務(wù)自然優(yōu)先級(jí)可以低一些。實(shí)時(shí)系統(tǒng)大多綜合了軟實(shí)時(shí)和硬實(shí)時(shí)這兩種需求。軟實(shí)時(shí)系統(tǒng)只是要求任務(wù)執(zhí)行得盡量快,并不要求在某一特定時(shí)間內(nèi)完成。硬實(shí)時(shí)系統(tǒng)中,任務(wù)不但要執(zhí)行無(wú)誤,還要準(zhǔn)時(shí)完成。 單調(diào)執(zhí)行率調(diào)度法RMS(Rate Monotonic Scheduling)-用于分配任務(wù)優(yōu)先級(jí)。這種方法基于哪個(gè)任務(wù)執(zhí)行的次數(shù)最頻繁,執(zhí)行最頻繁的任務(wù)優(yōu)先級(jí)最高。,2.18 互斥條件,實(shí)現(xiàn)任務(wù)間通訊最簡(jiǎn)便到辦法是使用共享數(shù)據(jù)結(jié)構(gòu)。特別是當(dāng)所有到任務(wù)都在一個(gè)單一地址空間下,能使用全程變量、指針、緩沖區(qū)、鏈表、
17、循環(huán)緩沖區(qū)等,使用共享數(shù)據(jù)結(jié)構(gòu)通訊就更為容易。雖然共享數(shù)據(jù)區(qū)法簡(jiǎn)化了任務(wù)間的信息交換,但是必須保證每個(gè)任務(wù)在處理共享數(shù)據(jù)時(shí)的排它性,以避免競(jìng)爭(zhēng)和數(shù)據(jù)的破壞。與共享資源打交道時(shí),使之滿(mǎn)足互斥條件最一般的方法有:,關(guān)中斷 使用測(cè)試并置位指令 禁止做任務(wù)切換 利用信號(hào)量,2.18.1 關(guān)中斷和開(kāi)中斷,程序清單 關(guān)中斷和開(kāi)中斷 Disable interrupts; /*關(guān)中斷*/ Access the resource (read/write from/to variables); /*讀/寫(xiě)變量*/ Reenable interrupts; /*重新允許中斷*/,實(shí)際上C/OS-提供兩個(gè)宏調(diào)用,允
18、許用戶(hù)在應(yīng)用程序的C 代碼中關(guān)中斷然后再開(kāi)中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL,這兩個(gè)宏調(diào)用的使用法見(jiàn)程序: 程序清單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í)間都要盡量短。 如果
19、使用某種實(shí)時(shí)內(nèi)核,一般地說(shuō),關(guān)中斷的最長(zhǎng)時(shí)間不超過(guò)內(nèi)核本身的關(guān)中斷時(shí)間,就不會(huì)影響系統(tǒng)中斷延遲。,2.18.2 測(cè)試并置位,如果不使用實(shí)時(shí)內(nèi)核,當(dāng)兩個(gè)任務(wù)共享一個(gè)資源時(shí),一定要約定好,先測(cè)試某一全程變量,如果該變量是0,允許該任務(wù)與共享資源打交道。為防止另一任務(wù)也要使用該資源,前者只要簡(jiǎn)單地將全程變量置為1,這通常稱(chēng)作測(cè)試并置位(Test-And-Set),或稱(chēng)作TAS。TAS操作可能是微處理器的單獨(dú)一條不會(huì)被中斷的指令,或者是在程序中關(guān)中斷做TAS操作再開(kāi)中斷。,程序清單2.5 利用測(cè)試并置位處理共享資源 Disable interrupts; 關(guān)中斷 if (Access Variable
20、 is 0) 如果資源未占用,標(biāo)志為0 Set variable to 1; 置資源不可用,標(biāo)志為1 Reenable interrupts; 重開(kāi)中斷 Access the resource; 處理該資源 Disable interrupts; 關(guān)中斷 Set the Access Variable back to 0; 清資源不可使用,標(biāo)志為0 Reenable interrupts; 重新開(kāi)中斷 else 否則 Reenable interrupts; 開(kāi)中斷 /* You dont have access to the resource, try back later; */ /* 資
21、源不可使用,以后再試; */ ,2.18.3 禁止,然后允許任務(wù)切換,如果任務(wù)不與中斷服務(wù)子程序共享變量或數(shù)據(jù)結(jié)構(gòu),可以使用禁止、然后允許任務(wù)切換。 如下述程序清單所示,以C/OS-的使用為例,兩個(gè)或兩個(gè)以上的任務(wù)可以共享數(shù)據(jù)而不發(fā)生競(jìng)爭(zhēng)。注意,此時(shí)雖然任務(wù)切換是禁止了,但中斷還是開(kāi)著的。如果這時(shí)中斷來(lái)了,中斷服務(wù)子程序會(huì)在這一臨界區(qū)內(nèi)立即執(zhí)行。中斷服務(wù)子程序結(jié)束時(shí),盡管有優(yōu)先級(jí)高的任務(wù)已經(jīng)進(jìn)入就緒態(tài),內(nèi)核還是返回到原來(lái)被中斷了的任務(wù)。直到執(zhí)行完給任務(wù)切換開(kāi)鎖函數(shù)OSSchedUnlock (),內(nèi)核再看有沒(méi)有優(yōu)先級(jí)更高的任務(wù)被中斷服務(wù)子程序激活而進(jìn)入就緒態(tài),如果有,則做任務(wù)切換。,程序清單2
22、.6 用給任務(wù)切換上鎖,然后開(kāi)鎖的方法實(shí)現(xiàn)數(shù)據(jù)共享. void Function (void) OSSchedLock(); . . /* You can access shared data in here (interrupts are recognized) */ . /*在這里處理共享數(shù)據(jù)(中斷是開(kāi)著的)*/ OSSchedUnlock(); ,2.18.4 信號(hào)量(Semaphores),信號(hào)量是60年代中期Edgser Dijkstra 發(fā)明的。信號(hào)量實(shí)際上是一種約定機(jī)制,在多任務(wù)內(nèi)核中普遍使用。信號(hào)量用于: 控制共享資源的使用權(quán)(滿(mǎn)足互斥條件) 標(biāo)志某事件的發(fā)生 使兩個(gè)任務(wù)的行為
23、同步 信號(hào)像是一把鑰匙,任務(wù)要運(yùn)行下去,得先拿到這把鑰匙。如果信號(hào)已被別的任務(wù)占用,該任務(wù)只得被掛起,直到信號(hào)被當(dāng)前使用者釋放。,信號(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位還是32 位。 一般地說(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)量賦初值,等待
24、信號(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ù)表。,任務(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ù)可能是以下兩者之一 等待信號(hào)量任務(wù)中優(yōu)先級(jí)最高的,或者是 最早開(kāi)始等待信號(hào)量的那個(gè)任務(wù),即按先進(jìn)先出的原則(First In First Out ,F(xiàn)IFO),程序清
25、單2.7 通過(guò)獲得信號(hào)量處理共享數(shù)據(jù) OS_EVENT *SharedDataSem; void Function (void) INT8U err; OSSemPend(SharedDataSem, 0, ,如果中斷服務(wù)程序或當(dāng)前任務(wù)激活了一個(gè)高優(yōu)先級(jí)的任務(wù),高優(yōu)先級(jí)的任務(wù)立即開(kāi)始執(zhí)行。,當(dāng)諸任務(wù)共享輸入輸出設(shè)備時(shí),信號(hào)量特別有用。 如:多任務(wù)同時(shí)訪(fǎng)問(wèn)打印機(jī)。使用信號(hào)量并給信號(hào)量賦初值1(用二進(jìn)制信號(hào)量)。要想使用打印機(jī)的任務(wù),先要得到該資源的信號(hào)量。,用獲取信號(hào)量來(lái)得到打印機(jī)使用權(quán),每個(gè)任務(wù)都知道有個(gè)信號(hào)表示資源可不可以使用。要想使用該資源,要先得到這個(gè)信號(hào)。然而有些情況下,最好把信號(hào)量藏
26、起來(lái),各個(gè)任務(wù)在同某一資源打交道時(shí),并不知道實(shí)際上是在申請(qǐng)得到一個(gè)信號(hào)量。例如,多任務(wù)共享一個(gè)RS-232C 外設(shè)接口,各任務(wù)要送命令給接口另一端的設(shè)備并接收該設(shè)備的回應(yīng)。,在任務(wù)級(jí)看不到隱含的信號(hào)量,程序清單 2.8 隱含的信號(hào)量。 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; retu
27、rn (error code); else Release semaphore; return (no error); ,計(jì)數(shù)式信號(hào)量用于某資源可以同時(shí)為幾個(gè)任務(wù)所用。例如,用信號(hào)量管理緩沖區(qū)陣列(buffer pool),如圖2.12 所示。緩沖區(qū)陣列中共有10 個(gè)緩沖區(qū),任務(wù)通過(guò)調(diào)用申請(qǐng)緩沖區(qū)函數(shù)BufReq()向緩沖區(qū)管理方申請(qǐng)得到緩沖區(qū)使用權(quán)。當(dāng)緩沖區(qū)使用權(quán)還不再需要時(shí),通過(guò)調(diào)用釋放緩沖區(qū)函數(shù)BufRel()將緩沖區(qū)還給管方。函數(shù)示意碼如程序清單2.9所示,程序清單 2.9 用信號(hào)量管理緩沖區(qū)。 BUF *BufReq(void) BUF *ptr; Acquire a semapho
28、re; Disable interrupts; ptr = BufFreeList; BufFreeList = ptr-BufNext; Enable interrupts; return (ptr); void BufRel(BUF *ptr) Disable interrupts; ptr-BufNext = BufFreeList; BufFreeList = ptr; Enable interrupts; Release semaphore; ,處理簡(jiǎn)單的共享變量也使用信號(hào)量則是多余的。請(qǐng)求和釋放信號(hào)量的過(guò)程是要花相當(dāng)?shù)臅r(shí)間的。有時(shí)這種額外的負(fù)荷是不必要的。用戶(hù)可能只需要關(guān)中斷、開(kāi)中
29、斷來(lái)處理簡(jiǎn)單共享變量,以提高效率。,2.19 死鎖(或抱死)(Deadlock (or Deadly Embrace)),死鎖也稱(chēng)作抱死,指兩個(gè)任務(wù)無(wú)限期地互相等待對(duì)方控制著的資源。設(shè)任務(wù)T1 正獨(dú)享資源R1,任務(wù)T2 在獨(dú)享資源R2,而此時(shí)T1 又要獨(dú)享R2,T2 也要獨(dú)享R1,于是哪個(gè)任務(wù)都沒(méi)法繼續(xù)執(zhí)行了,發(fā)生了死鎖。最簡(jiǎn)單的防止發(fā)生死鎖的方法是讓每個(gè)任務(wù)都: 先得到全部需要的資源再做下一步的工作 用同樣的順序去申請(qǐng)多個(gè)資源 釋放資源時(shí)使用相反的順序,內(nèi)核大多允許用戶(hù)在申請(qǐng)信號(hào)量時(shí)定義等待超時(shí),以此化解死鎖。當(dāng)?shù)却龝r(shí)間超過(guò)了某一確定值,信號(hào)量還是無(wú)效狀態(tài),就會(huì)返回某種形式的出現(xiàn)超時(shí)錯(cuò)誤的代
30、碼,這個(gè)出錯(cuò)代碼告知該任務(wù),不是得到了資源使用權(quán),而是系統(tǒng)錯(cuò)誤。死鎖一般發(fā)生在大型多任務(wù)系統(tǒng)中,在嵌入式系統(tǒng)中不易出現(xiàn)。,2.20 同步,可以利用信號(hào)量使某任務(wù)與中斷服務(wù)同步(或者是與另一個(gè)任務(wù)同步,這兩個(gè)任務(wù)間沒(méi)有數(shù)據(jù)交換)。,圖2.13 用信號(hào)量使任務(wù)與中斷服務(wù)同步,用來(lái)實(shí)現(xiàn)同步機(jī)制的信號(hào)量初始化成0,信號(hào)量用于這種類(lèi)型同步的稱(chēng)作單向同步(unilateral rendezvous)。一個(gè)任務(wù)做I/O操作,然后等信號(hào)回應(yīng)。當(dāng)I/O 操作完成,中斷服務(wù)程序(或另外一個(gè)任務(wù))發(fā)出信號(hào),該任務(wù)得到信號(hào)后繼續(xù)往下執(zhí)行。,如果內(nèi)核支持計(jì)數(shù)式信號(hào)量,信號(hào)量的值表示尚未得到處理的事件數(shù)。請(qǐng)注意,可能會(huì)有
31、一個(gè)以上的任務(wù)在等待同一事件的發(fā)生,則這種情況下內(nèi)核會(huì)根據(jù)以下原則之一發(fā)信號(hào)給相應(yīng)的任務(wù): 發(fā)信號(hào)給等待事件發(fā)生的任務(wù)中優(yōu)先級(jí)最高的任務(wù),或者 發(fā)信號(hào)給最先開(kāi)始等待事件發(fā)生的那個(gè)任務(wù),兩個(gè)任務(wù)可以用兩個(gè)信號(hào)量同步它們的行為。如圖2.14 所示。這叫做雙向同步(bilateral rendezvous)。雙向同步同單向同步類(lèi)似,只是兩個(gè)任務(wù)要相互同步。,圖2.14 兩個(gè)任務(wù)用信號(hào)量同步彼此的行為,程序清單2.10 雙向同步 Task1() for (;) Perform operation; Signal task #2; (1) Wait for signal from task #2; (2
32、) Continue operation; Task2() for (;) Perform operation; Signal task #1; (3) Wait for signal from task #1; (4) Continue operation; ,2.21 事件標(biāo)志(Event Flags),當(dāng)某任務(wù)要與多個(gè)事件同步時(shí),要使用事件標(biāo)志。若任務(wù)需要與任何事件之一發(fā)生同步,可稱(chēng)為獨(dú)立型同步(即邏輯或關(guān)系)。任務(wù)也可以與若干事件都發(fā)生了同步,稱(chēng)之為關(guān)聯(lián)型(邏輯與關(guān)系)。獨(dú)立型及關(guān)聯(lián)型同步如圖2.15所示。,圖2.15 獨(dú)立型及關(guān)聯(lián)型同步,可以用多個(gè)事件的組合發(fā)信號(hào)給多個(gè)任務(wù)。如圖2.
33、16所示,典型地,8 個(gè)、16個(gè)或32個(gè)事件可以組合在一起,取決于用的哪種內(nèi)核。每個(gè)事件占一位(bit),以32位的情況為多。任務(wù)或中斷服務(wù)可以給某一位置位或復(fù)位,當(dāng)任務(wù)所需的事件都發(fā)生了,該任務(wù)繼續(xù)執(zhí)行,至于哪個(gè)任務(wù)該繼續(xù)執(zhí)行了,是在一組新的事件發(fā)生時(shí)斷定的。也就是在事件位置位時(shí)做判斷。,2.22 任務(wù)間的通訊(Intertask Communication),有時(shí)很需要任務(wù)間的或中斷服務(wù)與任務(wù)間的通訊。這種信息傳遞稱(chēng)為任務(wù)間的通訊。任務(wù)間信息的傳遞有兩個(gè)途徑:通過(guò)全程變量或發(fā)消息給另一個(gè)任務(wù)。 用全程變量時(shí),必須保證每個(gè)任務(wù)或中斷服務(wù)程序獨(dú)享該變量。中斷服務(wù)中保證獨(dú)享的唯一辦法是關(guān)中斷。如
34、果兩個(gè)任務(wù)共享某變量,各任務(wù)實(shí)現(xiàn)獨(dú)享該變量的辦法可以是關(guān)中斷再開(kāi)中斷,或使用信號(hào)量。,問(wèn)題:任務(wù)如何知道全局變量被修改? 解決方法: 以信號(hào)量方式向任務(wù)發(fā)信號(hào) 該任務(wù)以查詢(xún)方式不斷周期性地查詢(xún)變量的值 使用郵箱或消息隊(duì)列,2.23 消息郵箱(Message Mail boxes),通過(guò)內(nèi)核服務(wù)可以給任務(wù)發(fā)送消息。典型的消息郵箱也稱(chēng)作交換消息,是用一個(gè)指針型變量,通過(guò)內(nèi)核服務(wù),一個(gè)任務(wù)或一個(gè)中斷服務(wù)程序可以把一則消息(即一個(gè)指針)放到郵箱里去。同樣,一個(gè)或多個(gè)任務(wù)可以通過(guò)內(nèi)核服務(wù)接收這則消息。發(fā)送消息的任務(wù)和接收消息的任務(wù)約定,該指針指向的內(nèi)容就是那則消息。,內(nèi)核一般提供以下郵箱服務(wù): 郵箱內(nèi)消
35、息的內(nèi)容初始化,郵箱里最初可以有,也可以沒(méi)有消息 將消息放入郵箱(POST) 等待有消息進(jìn)入郵箱(PEND) 如果郵箱內(nèi)有消息,就接受這則消息。如果郵箱里沒(méi)有消息,則任務(wù)并不被掛起(ACCEPT),用返回代碼表示調(diào)用結(jié)果,是收到了消息還是沒(méi)有收到消息。 消息郵箱也可以當(dāng)作只取兩個(gè)值的信號(hào)量來(lái)用。,2.24 消息隊(duì)列(Message Queue),消息隊(duì)列實(shí)際上是郵箱陣列。,圖2.18 消息隊(duì)列,2.25 中斷,中斷是一種硬件機(jī)制,用于通知CPU有個(gè)異步事件發(fā)生了。中斷一旦被識(shí)別,CPU保存部分(或全部)現(xiàn)場(chǎng)(Context)即部分或全部寄存器的值,跳轉(zhuǎn)到專(zhuān)門(mén)的子程序,稱(chēng)為中斷服務(wù)子程序(ISR
36、)。中斷服務(wù)子程序做事件處理,處理完成后,程序回到: 在前后臺(tái)系統(tǒng)中,程序回到后臺(tái)程序 對(duì)不可剝奪型內(nèi)核而言,程序回到被中斷了的任務(wù) 對(duì)可剝奪型內(nèi)核而言,讓進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)開(kāi)始運(yùn)行,圖2.19 中斷嵌套,2.26 中斷延遲,所有實(shí)時(shí)系統(tǒng)在進(jìn)入臨界區(qū)代碼段之前都要關(guān)中斷,執(zhí)行完臨界代碼之后再開(kāi)中斷。關(guān)中斷的時(shí)間越長(zhǎng),中斷延遲就越長(zhǎng)。中斷延遲由下面表達(dá)式給出。 中斷延遲 = 關(guān)中斷的最長(zhǎng)時(shí)間 + 開(kāi)始執(zhí)行中斷服務(wù)子程序的第一條指令的時(shí)間,2.27 中斷響應(yīng),中斷響應(yīng)-從中斷發(fā)生到開(kāi)始執(zhí)行用戶(hù)的中斷服務(wù)子程序代碼來(lái)處理這個(gè)中斷的時(shí)間。 中斷響應(yīng)時(shí)間包括開(kāi)始處理這個(gè)中斷前的全部開(kāi)銷(xiāo)。(保護(hù)
37、現(xiàn)場(chǎng)),對(duì)前后臺(tái)系統(tǒng),保存寄存器以后立即執(zhí)行用戶(hù)代碼,中斷響應(yīng)時(shí)間由下式給出。 中斷響應(yīng)時(shí)間 = 中斷延遲 + 保存CPU內(nèi)部寄存器的時(shí)間 對(duì)于不可剝奪型內(nèi)核,微處理器保存內(nèi)部寄存器以后,用戶(hù)的中斷服務(wù)子程序代碼全立即得到執(zhí)行。不可剝奪型內(nèi)核的中斷響應(yīng)時(shí)間由下式給出。 中斷響應(yīng)時(shí)間 = 中斷延遲 + 保存CPU內(nèi)部寄存器的時(shí)間,對(duì)于可剝奪型內(nèi)核,則要先調(diào)用一個(gè)特定的函數(shù),該函數(shù)通知內(nèi)核即將進(jìn)行中斷服務(wù),使得內(nèi)核可以跟蹤中斷的嵌套。對(duì)于 C/OS-說(shuō)來(lái),這個(gè)函數(shù)是OSIntEnter(),可剝奪型內(nèi)核的中斷響應(yīng)時(shí)間由下式給出: 中斷響應(yīng) 中斷延遲 + 保存CPU 內(nèi)部寄存器的時(shí)間 + 內(nèi)核的進(jìn)入
38、中斷服務(wù)函數(shù)的執(zhí)行時(shí)間 中斷響應(yīng)是系統(tǒng)在最壞情況下的響應(yīng)中斷的時(shí)間,2.28 中斷恢復(fù)時(shí)間(Interrupt Recovery),中斷恢復(fù)時(shí)間定義為微處理器返回到被中斷了的程序代碼所需要的時(shí)間。 前后臺(tái)系統(tǒng): 中斷恢復(fù)時(shí)間 = 恢復(fù)CPU 內(nèi)部寄存器值的時(shí)間 + 執(zhí)行中斷返回指令的時(shí)間 不可剝奪型內(nèi)核: 中斷恢復(fù)時(shí)間 = 恢復(fù)CPU 內(nèi)部寄存器值的時(shí)間 + 執(zhí)行中斷返回指令的時(shí)間,可剝奪型內(nèi)核在中斷服務(wù)子程序的末尾,要調(diào)用一個(gè)由實(shí)時(shí)內(nèi)核提供的函數(shù)。C/OS-中這個(gè)函數(shù)為OSIntExit(),用于判斷中斷是否脫離了所有的中斷嵌套。 中斷恢復(fù)時(shí)間 = 判定是否有優(yōu)先級(jí)更高的任務(wù)進(jìn)入了就緒態(tài)的時(shí)間 + 恢復(fù)那個(gè)優(yōu)先級(jí)更高任務(wù)的CPU內(nèi)部寄存器的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年年八年級(jí)數(shù)學(xué)人教版下冊(cè)專(zhuān)題整合復(fù)習(xí)卷14.3.1 一次函數(shù)與一元一次方程(含答案)-
- 2025年四川貨運(yùn)從業(yè)資格考試題目大全及答案詳解
- 急診手術(shù)應(yīng)急演練重要性
- 安全教育班會(huì)活動(dòng)
- 2025合伙辦廠合同合同模板
- 2025農(nóng)村土地承包經(jīng)營(yíng)權(quán)轉(zhuǎn)包合同書(shū)版
- 2024年江蘇省常州市中考英語(yǔ)真題卷及答案解析
- 2024年江蘇省無(wú)錫市中考數(shù)學(xué)真題卷及答案解析
- 市政設(shè)施投標(biāo)文件范本
- 風(fēng)險(xiǎn)管理與預(yù)算預(yù)測(cè)模型
- 城鄉(xiāng)居民醫(yī)療保險(xiǎn)
- 肩痛診斷與治療
- 碳酸鋰生產(chǎn)工藝流程
- 幼兒園自然課堂培訓(xùn)
- 2024年錦州師范高等專(zhuān)科學(xué)校單招職業(yè)技能測(cè)試題庫(kù)及答案解析
- MOOC 能源與氣候變化應(yīng)對(duì)法-西南政法大學(xué) 中國(guó)大學(xué)慕課答案
- MOOC 概率論與數(shù)理統(tǒng)計(jì)-重慶大學(xué) 中國(guó)大學(xué)慕課答案
- MOOC 電子技術(shù)-北京科技大學(xué) 中國(guó)大學(xué)慕課答案
- 2024年鍍鋅管行業(yè)發(fā)展趨勢(shì)及前景展望分析報(bào)告
- 新能源汽車(chē)充電樁項(xiàng)目計(jì)劃書(shū)
- 《水電工程運(yùn)行調(diào)度規(guī)程編制導(dǎo)則》(NB-T 10084-2018)
評(píng)論
0/150
提交評(píng)論