嵌入式系統(tǒng)-Chapter6-同步、互斥 與通信_(tái)第1頁(yè)
嵌入式系統(tǒng)-Chapter6-同步、互斥 與通信_(tái)第2頁(yè)
嵌入式系統(tǒng)-Chapter6-同步、互斥 與通信_(tái)第3頁(yè)
嵌入式系統(tǒng)-Chapter6-同步、互斥 與通信_(tái)第4頁(yè)
嵌入式系統(tǒng)-Chapter6-同步、互斥 與通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩124頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、嵌入式系統(tǒng)(xtng)及應(yīng)用共一百二十九頁(yè)第六章同步(tngb)、互斥與通信共一百二十九頁(yè)主要(zhyo)內(nèi)容概述(i sh)信號(hào)量郵箱和消息隊(duì)列事件異步信號(hào)*管道*共一百二十九頁(yè)概述(i sh)多任務(wù)系統(tǒng)中任務(wù)之間的關(guān)系相互獨(dú)立 僅競(jìng)爭(zhēng)CPU資源競(jìng)爭(zhēng)除CPU外的其他資源(互斥)同步 協(xié)調(diào)彼此運(yùn)行的步調(diào),保證協(xié)同運(yùn)行的各個(gè)任務(wù)具有正確的執(zhí)行(zhxng)次序 通信 彼此間傳遞數(shù)據(jù)或信息,以協(xié)同完成某項(xiàng)工作共一百二十九頁(yè)任務(wù)能以以下方式與中斷處理程序或其他(qt)任務(wù)進(jìn)行同步或通信:?jiǎn)蜗蛲交蛲ㄐ牛阂粋€(gè)任務(wù)與另一個(gè)任務(wù)或一個(gè)ISR同步或通信。 雙向同步或通信:兩個(gè)任務(wù)相互同步或通信。雙向同步不能

2、在任務(wù)與ISR之間進(jìn)行,因?yàn)镮SR不能等待。 概述(i sh)共一百二十九頁(yè)ISR xTask yPOSTPEND任務(wù)(rn wu)與ISR之間的同步(單向)Task xTask yPOSTPENDPOSTPEND任務(wù)(rn wu)與任務(wù)(rn wu)之間的同步(雙向)任務(wù)與任務(wù)之間的同步(單向)Task xTask yPOSTPEND共一百二十九頁(yè)在嵌入式多任務(wù)系統(tǒng)中,任務(wù)間的耦合程度是不一樣的:耦合程度較高:任務(wù)之間需要進(jìn)行大量的通信,相應(yīng)(xingyng)的系統(tǒng)開(kāi)銷(xiāo)較大;耦合程度較低:任務(wù)之間不存在通信需求,其間的同步關(guān)系很弱甚至不需要同步或互斥,系統(tǒng)開(kāi)銷(xiāo)較小。研究任務(wù)間耦合程度的高低對(duì)

3、于合理地設(shè)計(jì)應(yīng)用系統(tǒng)、劃分任務(wù)有很重要的作用。 概述(i sh)共一百二十九頁(yè)在單處理器平臺(tái)上,嵌入式操作系統(tǒng)內(nèi)核提供的同步、互斥與通信機(jī)制(jzh)主要包括:信號(hào)量(semaphore),用于互斥與同步事件(組)(event group),用于同步異步信號(hào)(asynchronous signal),用于同步郵箱(mailbox)、消息隊(duì)列(message queue),用于消息通信管道(pipe),提供非結(jié)構(gòu)化數(shù)據(jù)交換和實(shí)現(xiàn)同步 概述(i sh)共一百二十九頁(yè)以下一些(yxi)機(jī)制也可用于同步與通信(在單處理器或多處理器系統(tǒng)中):全局變量共享內(nèi)存Sockets遠(yuǎn)程過(guò)程調(diào)用(Remote Pr

4、ocedure Call)概述(i sh)共一百二十九頁(yè)第一節(jié)信號(hào)量信號(hào)量的種類(lèi)及用途互斥信號(hào)量二值信號(hào)量計(jì)數(shù)(j sh)信號(hào)量信號(hào)量機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)典型的信號(hào)量操作共一百二十九頁(yè)信號(hào)量用于實(shí)現(xiàn)任務(wù)與任務(wù)之間、任務(wù)與中斷處理程序之間的同步(tngb)與互斥。信號(hào)量一般分為三種:信號(hào)量的種類(lèi)(zhngli)及用途用于解決互斥問(wèn)題。它比較特殊,可能會(huì)引起優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題。用于解決同步問(wèn)題用于解決資源計(jì)數(shù)問(wèn)題將信號(hào)量進(jìn)行種類(lèi)細(xì)分,可以根據(jù)其用途,在具體實(shí)現(xiàn)時(shí)做專門(mén)處理,提高執(zhí)行效率和可靠性?;コ庑盘?hào)量計(jì)數(shù)信號(hào)量二值信號(hào)量共一百二十九頁(yè)用互斥信號(hào)量保護(hù)的代碼區(qū)稱作“臨界區(qū)”,臨界區(qū)代碼通常用于對(duì)共享資

5、源的訪問(wèn)(fngwn)。互斥信號(hào)量的值被初始化成1,表明目前沒(méi)有任務(wù)進(jìn)入“臨界區(qū)”,但最多只有一個(gè)任務(wù)可以進(jìn)入“臨界區(qū)”。第一個(gè)試圖進(jìn)入“臨界區(qū)”的任務(wù)將成功獲得互斥信號(hào)量,而隨后試圖進(jìn)入用同一信號(hào)量保護(hù)的臨界區(qū)的所有其他任務(wù)就必須等待。當(dāng)任務(wù)離開(kāi)“臨界區(qū)”時(shí),它將釋放信號(hào)量并允許正在等待該信號(hào)量的任務(wù)進(jìn)入“臨界區(qū)”?;コ庑盘?hào)量Task1Task2共享資源共一百二十九頁(yè)互斥信號(hào)量共享資源可能是一段存儲(chǔ)器空間、一個(gè)數(shù)據(jù)結(jié)構(gòu)或I/O設(shè)備,也可能是被兩個(gè)或多個(gè)并發(fā)任務(wù)共享的任何內(nèi)容。使用互斥信號(hào)量可以實(shí)現(xiàn)對(duì)共享資源的串行訪問(wèn),保證只有成功地獲取互斥信號(hào)量的任務(wù)才能夠釋放它?;コ庑盘?hào)量是一種特殊的二值

6、信號(hào)量,一般它支持所有權(quán)、遞歸訪問(wèn)、任務(wù)刪除(shnch)安全和一些避免優(yōu)先級(jí)反轉(zhuǎn)、饑餓、死鎖等互斥所固有問(wèn)題的協(xié)議。 共一百二十九頁(yè)互斥信號(hào)量狀態(tài)圖互斥信號(hào)量狀態(tài)圖開(kāi)啟(kiq)鎖定(su dn)初始化值為1申請(qǐng)并獲得值為0釋放值為1申請(qǐng)(遞歸)并獲得鎖定數(shù)加1釋放(遞歸)鎖定數(shù)減1共一百二十九頁(yè)互斥信號(hào)量所有權(quán):當(dāng)一個(gè)任務(wù)通過(guò)獲取互斥信號(hào)量而將其鎖定時(shí),得到該互斥信號(hào)量的所有權(quán)。相反(xingfn),當(dāng)一個(gè)任務(wù)釋放信號(hào)量時(shí),失去對(duì)其的所有權(quán)。當(dāng)一個(gè)任務(wù)擁有互斥信號(hào)量時(shí),其他的任務(wù)不能再鎖定或釋放它,即任務(wù)要釋放互斥信號(hào)量,必須事前先獲取該信號(hào)量。 共一百二十九頁(yè)Task1RoutineAR

7、outineB互斥信號(hào)量嵌套(遞歸)資源訪問(wèn)如果(rgu)Task1調(diào)用RoutineA,而RoutineA又調(diào)用RoutineB,并且三者訪問(wèn)相同的共享資源,就發(fā)生了遞歸共享資源的訪問(wèn)同步問(wèn)題。 共享資源 一個(gè)(y )遞歸的互斥信號(hào)量允許嵌套鎖定互斥信號(hào)量,而不引起死鎖。 共一百二十九頁(yè)互斥信號(hào)量嵌套(遞歸)資源訪問(wèn)每個(gè)獲取信號(hào)量的調(diào)用必須與釋放(shfng)信號(hào)量的調(diào)用相匹配。當(dāng)最外層的獲取信號(hào)量的調(diào)用與釋放(shfng)信號(hào)量的調(diào)用匹配時(shí),該信號(hào)量才允許被其它任務(wù)訪問(wèn)。 用于同步的信號(hào)量不支持嵌套訪問(wèn),任務(wù)如果對(duì)同步信號(hào)量使用上述操作是錯(cuò)誤的,任務(wù)會(huì)被永久阻塞,并且阻塞條件永遠(yuǎn)不會(huì)解除。

8、 共一百二十九頁(yè)互斥信號(hào)量刪除安全:在一個(gè)受信號(hào)量保護(hù)的臨界區(qū),經(jīng)常需要保護(hù)在臨界區(qū)執(zhí)行的任務(wù)(rn wu)不會(huì)被意外地刪除。刪除一個(gè)在臨界區(qū)執(zhí)行的任務(wù)可能引起意想不到的后果,造成保護(hù)資源的信號(hào)量不可用,可能導(dǎo)致資源處于破壞狀態(tài),也就導(dǎo)致了其它所有要訪問(wèn)該資源的任務(wù)無(wú)法得到滿足。 共一百二十九頁(yè)互斥信號(hào)量刪除安全:為避免任務(wù)在臨界區(qū)執(zhí)行時(shí)不被意外刪除:提供“任務(wù)保護(hù)”和“解除任務(wù)保護(hù)”原語(yǔ)對(duì)同時(shí),為互斥信號(hào)量提供“刪除安全”選項(xiàng)。在創(chuàng)建信號(hào)量的時(shí)候使用這個(gè)(zh ge)選項(xiàng),當(dāng)應(yīng)用每次獲取信號(hào)量時(shí)隱含地使能“任務(wù)保護(hù)”功能,當(dāng)每次釋放信號(hào)量時(shí)隱含地使用“解除任務(wù)保護(hù)”功能。 共一百二十九頁(yè)各種

9、互斥機(jī)制(jzh)比較比較項(xiàng)目關(guān)中斷使用測(cè)試并置位指令禁止任務(wù)切換使用信號(hào)量鎖定范圍互斥力度最強(qiáng),鎖定所有外部可屏蔽中斷,凡是以中斷形式到達(dá)的外部事件以及與之相關(guān)聯(lián)的任務(wù)或處理過(guò)程均得不到執(zhí)行凡是使用該指令訪問(wèn)共享資源的代碼所有的任務(wù)只影響競(jìng)爭(zhēng)共享資源的任務(wù)對(duì)系統(tǒng)響應(yīng)時(shí)間的影響如果關(guān)中斷的時(shí)間較長(zhǎng),對(duì)系統(tǒng)的響應(yīng)性能有很大影響較小如果禁止切換的時(shí)間過(guò)長(zhǎng),則影響系統(tǒng)的響應(yīng)性能對(duì)系統(tǒng)響應(yīng)性能有一定影響,可能導(dǎo)致優(yōu)先級(jí)反轉(zhuǎn)實(shí)現(xiàn)時(shí)的系統(tǒng)開(kāi)銷(xiāo)小小小較大注意事項(xiàng)關(guān)中斷時(shí)間要盡量短不是所有的處理器都具備這種指令,影響可移植性關(guān)調(diào)度的時(shí)間要盡量短需采用一定的策略解決優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題共一百二十九頁(yè)二值信號(hào)量二值信號(hào)

10、量主要用于任務(wù)與任務(wù)之間、任務(wù)與中斷(zhngdun)服務(wù)程序之間的同步用于同步的二值信號(hào)量初始值為0,表示同步事件尚未產(chǎn)生;任務(wù)申請(qǐng)信號(hào)量以等待該同步事件的發(fā)生;另一個(gè)任務(wù)或ISR到達(dá)同步點(diǎn)時(shí),釋放信號(hào)量(將其值設(shè)置為1)表示同步事件已發(fā)生,以喚醒等待的任務(wù)。Task1Task2二值信號(hào)量初值為0共一百二十九頁(yè)二值信號(hào)量二值信號(hào)量狀態(tài)圖可獲得(hud)不可(bk)獲得申請(qǐng)并獲得(值為0)釋放(值為1)初始化值為0共一百二十九頁(yè)Task1() 執(zhí)行一些操作(cozu); 將信號(hào)量sem1置1; 申請(qǐng)信號(hào)量sem2; Task2() 申請(qǐng)信號(hào)量sem1; 執(zhí)行一些(yxi)操作; 將信號(hào)量sem

11、2置1; Task2申請(qǐng)信號(hào)量sem1失敗,系統(tǒng)切換到Task1sem1被置1后,Task2得到sem1并搶占Task1Task2運(yùn)行到某處時(shí)因某種原因被阻塞,系統(tǒng)切換到Task1用二值信號(hào)量實(shí)現(xiàn)兩個(gè)任務(wù)之間的雙向同步Task2優(yōu)先級(jí)高于Task1sem1和sem2的初始值均為0共一百二十九頁(yè)計(jì)數(shù)(j sh)信號(hào)量計(jì)數(shù)信號(hào)量用于控制系統(tǒng)中共享資源的多個(gè)實(shí)例(shl)的使用,允許多個(gè)任務(wù)同時(shí)訪問(wèn)同一種資源的多個(gè)實(shí)例(shl)計(jì)數(shù)信號(hào)量被初始化為n(非負(fù)整數(shù)),n為該種共享資源的數(shù)目。Task1Task2共享資源實(shí)例nTask m共享資源實(shí)例1共一百二十九頁(yè)計(jì)數(shù)(j sh)信號(hào)量計(jì)數(shù)(j sh)信

12、號(hào)量狀態(tài)圖可獲得不可獲得初始化值大于0申請(qǐng)并獲得值為0釋放值為1申請(qǐng)并獲得值減1釋放值加1共一百二十九頁(yè)計(jì)數(shù)(j sh)信號(hào)量 1 2 3 4 n生產(chǎn)者任務(wù)消費(fèi)者任務(wù)計(jì)數(shù)信號(hào)量使用實(shí)例(shl):有界緩沖問(wèn)題共一百二十九頁(yè)生產(chǎn)者任務(wù)(rn wu)do 產(chǎn)生一個(gè)數(shù)據(jù)項(xiàng)申請(qǐng)empty申請(qǐng)mutex將新生成的數(shù)據(jù)項(xiàng)添加到緩沖中釋放mutex釋放full while (1);消費(fèi)者任務(wù)do 申請(qǐng)full申請(qǐng)mutex從緩沖中移出一個(gè)數(shù)據(jù)項(xiàng)的內(nèi)容(nirng)釋放mutex釋放empty消費(fèi)新獲得的數(shù)據(jù)項(xiàng)內(nèi)容 while (1); 計(jì)數(shù)信號(hào)量full:已被填充的數(shù)據(jù)項(xiàng)數(shù)目,取值范圍0n,初始值為0計(jì)數(shù)信

13、號(hào)量empty:空閑數(shù)據(jù)項(xiàng)數(shù)目,取值范圍為0n,初始值為n;互斥信號(hào)量mutex:控制生產(chǎn)者任務(wù)和消費(fèi)者任務(wù)對(duì)有界緩沖的訪問(wèn),初始值為1。共一百二十九頁(yè)信號(hào)量機(jī)制的主要(zhyo)數(shù)據(jù)結(jié)構(gòu)SCB1SCB2信號(hào)量控制塊count信號(hào)量名字或IDTask1Task2任務(wù)等待列表共一百二十九頁(yè)信號(hào)量機(jī)制(jzh)的主要數(shù)據(jù)結(jié)構(gòu)信號(hào)量控制塊:管理所有創(chuàng)建的信號(hào)量,內(nèi)核在系統(tǒng)運(yùn)行(ynxng)時(shí)動(dòng)態(tài)分配和回收信號(hào)量控制塊互斥和二值信號(hào)量控制塊結(jié)構(gòu): Binary_Semaphore_Control_Blockwait_queue任務(wù)等待隊(duì)列attributes信號(hào)量屬性lock_nesting_beha

14、vior試圖嵌套獲得時(shí)的規(guī)則 wait_discipline任務(wù)等待信號(hào)量的方式priority_ceiling優(yōu)先級(jí)天花板值lock是否被占有holder擁有者 nest_count嵌套層數(shù)共一百二十九頁(yè)計(jì)數(shù)信號(hào)量控制結(jié)構(gòu)Counting_Semaphore_Control_Block wait_queue任務(wù)等待(dngdi)隊(duì)列 attributes計(jì)數(shù)信號(hào)量屬性 maximum_count 最大計(jì)數(shù)值 wait_discipline任務(wù)等待信號(hào)量的方式 count當(dāng)前計(jì)數(shù)值信號(hào)量機(jī)制(jzh)的主要數(shù)據(jù)結(jié)構(gòu)共一百二十九頁(yè)信號(hào)量?jī)?nèi)部實(shí)現(xiàn)機(jī)制(jzh)實(shí)例說(shuō)明C/OS-II事件控制塊ECB

15、同步與通信機(jī)制的基本數(shù)據(jù)結(jié)構(gòu)typedef structINT8UOSEventType;/事件類(lèi)型INT8UOSEventGrp;/等待任務(wù)所在的組INT16UOSEventCnt;/計(jì)數(shù)器(信號(hào)量)void*OSEventPtr;/指向消息或消息隊(duì)列的指針(zhzhn)INT8UOSEventTblOS_EVENT_TBL_SIZE;/等待任務(wù)列表OS_EVENT;共一百二十九頁(yè)信號(hào)量?jī)?nèi)部實(shí)現(xiàn)機(jī)制(jzh)實(shí)例說(shuō)明C/OS-II當(dāng)一個(gè)事件發(fā)生后,等待(dngdi)事件列表中優(yōu)先級(jí)最高的任務(wù)(即在.OSEventTbl&OSEventGrp中所有被置1的位中優(yōu)先級(jí)數(shù)值最小的任務(wù))得到該事件。

16、共一百二十九頁(yè)信號(hào)量?jī)?nèi)部實(shí)現(xiàn)(shxin)機(jī)制實(shí)例說(shuō)明C/OS-II當(dāng).OSEventTbln中的任何一位為1時(shí),OSEventGrp中的第n位為1。 與任務(wù)就緒列表(li bio)類(lèi)似!共一百二十九頁(yè)信號(hào)量?jī)?nèi)部實(shí)現(xiàn)機(jī)制實(shí)例(shl)說(shuō)明C/OS-II將一個(gè)任務(wù)插入(ch r)到等待事件的任務(wù)列表中:pevent-OSEventGrp |= OSMapTblprio 3;pevent-OSEventTblprio 3 |= OSMapTblprio & 0 x07;與將一個(gè)任務(wù)插入到就緒列表中的操作類(lèi)似!Index Bit mask (Binary)0 0 0 0 0 0 0 0 11 0 0

17、 0 0 0 0 1 02 0 0 0 0 0 1 0 03 0 0 0 0 1 0 0 04 0 0 0 1 0 0 0 05 0 0 1 0 0 0 0 06 0 1 0 0 0 0 0 07 1 0 0 0 0 0 0 0共一百二十九頁(yè)信號(hào)量?jī)?nèi)部實(shí)現(xiàn)(shxin)機(jī)制實(shí)例說(shuō)明C/OS-II從等待事件的任務(wù)(rn wu)列表中使任務(wù)(rn wu)脫離等待狀態(tài)if (pevent-OSEventTblprio 3 &= OSMapTblprio & 0 x07) = 0) pevent-OSEventGrp &= OSMapTblprio 3;與將任務(wù)從就緒列表中清除的操作類(lèi)似!共一百二十九

18、頁(yè)信號(hào)量?jī)?nèi)部實(shí)現(xiàn)機(jī)制實(shí)例(shl)說(shuō)明C/OS-II在等待事件的任務(wù)(rn wu)列表中查找優(yōu)先級(jí)最高的任務(wù)(rn wu)y = OSUnMapTblpevent-OSEventGrp;x = OSUnMapTblpevent-OSEventTbly;prio = (y OSEventPtr;if (pevent != (OS_EVENT *)0) /初始化ECB的各個(gè)域pevent-OSEventType = OS_EVENT_TYPE_SEM; /事件類(lèi)型為信號(hào)量pevent-OSEventCnt = cnt; /信號(hào)量的初始計(jì)數(shù)值pevent-OSEventPtr = (void *)0

19、;OS_EventWaitListInit(pevent); /初始化等待任務(wù)(rn wu)列表return (pevent); /調(diào)用者需檢查返回值,如果為NULL則表示建立失敗共一百二十九頁(yè)獲取(huq)(申請(qǐng))信號(hào)量功能:試圖獲得應(yīng)用指定的信號(hào)量。if 信號(hào)量的值大于0then 將信號(hào)量的值減1else 根據(jù)接收信號(hào)量的選項(xiàng),將任務(wù)(rn wu)放到等待隊(duì)列中,或是直接返回共一百二十九頁(yè)獲取(huq)(申請(qǐng))信號(hào)量當(dāng)所申請(qǐng)的信號(hào)量不能被立即獲得時(shí),可以有以下幾種選擇:永遠(yuǎn)等待 不等待,立即返回,并返回一個(gè)錯(cuò)誤狀態(tài)碼指定等待時(shí)限(可有效避免(bmin)死鎖)注意:不允許在ISR中選擇等待當(dāng)

20、任務(wù)選擇等待時(shí),將被按FIFO或優(yōu)先級(jí)順序放置在等待隊(duì)列中共一百二十九頁(yè)獲取(huq)(申請(qǐng))信號(hào)量如果任務(wù)等待一個(gè)使用優(yōu)先級(jí)繼承算法的互斥信號(hào)量,且它的優(yōu)先級(jí)高于當(dāng)前正占有此信號(hào)量的任務(wù)的優(yōu)先級(jí),那么占有信號(hào)量的任務(wù)將繼承這個(gè)(zh ge)被阻塞的任務(wù)的優(yōu)先級(jí)。如果任務(wù)成功地獲得一個(gè)采用優(yōu)先級(jí)天花板算法的互斥信號(hào)量,它的優(yōu)先級(jí)又低于優(yōu)先級(jí)天花板,那么它的優(yōu)先級(jí)將被抬升至天花板。 共一百二十九頁(yè)獲取(huq)(等待)一個(gè)信號(hào)量OSSemPend()void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)if (pevent-OS

21、EventCnt 0) /信號(hào)量值大于0,成功獲得信號(hào)量并返回pevent-OSEventCnt-; *err = OS_NO_ERR;return; OSTCBCur-OSTCBStat |= OS_STAT_SEM; /設(shè)置任務(wù)狀態(tài)為等待信號(hào)量OSTCBCur-OSTCBDly = timeout; /設(shè)置等待時(shí)限OS_EventTaskWait(pevent);/將任務(wù)放置到信號(hào)量的等待列表(li bio)中 OS_Sched(); /內(nèi)核實(shí)施任務(wù)調(diào)度,系統(tǒng)切換到另一就緒任務(wù)執(zhí)行if (OSTCBCur-OSTCBStat & OS_STAT_SEM) /判斷任務(wù)恢復(fù)執(zhí)行的原因,如果等待

22、時(shí)限超時(shí)但仍然未獲得信號(hào)量,則返回超時(shí)信息OSEventTO(pevent); *err = OS_TIMEOUT;return;OSTCBCur-OSTCBEventPtr = (OS_EVENT *)0; *err = OS_NO_ERR; /任務(wù)由于獲得信號(hào)量而恢復(fù)執(zhí)行,本調(diào)用成功返回共一百二十九頁(yè)獲?。o(wú)等待地請(qǐng)求(qngqi))一個(gè)信號(hào)量OSSemAccept()INT16U OSSemAccept (OS_EVENT *pevent)INT16U cnt;cnt = pevent-OSEventCnt; if (cnt 0) pevent-OSEventCnt-; return (

23、cnt); 注意:即使(jsh)不能成功獲得信號(hào)量(返回值為0),調(diào)用者也不會(huì)被阻塞。此函數(shù)可以在中斷處理程序中使用。共一百二十九頁(yè)釋放(shfng)信號(hào)量功能:釋放一個(gè)應(yīng)用指定的信號(hào)量。 if 沒(méi)有任務(wù)等待這個(gè)信號(hào)量then 信號(hào)量的值加1 else 將信號(hào)量分配給一個(gè)等待任務(wù)(將相應(yīng)的任務(wù)移出等待隊(duì)列,使其就緒) 如果使用了優(yōu)先級(jí)繼承或優(yōu)先級(jí)天花板算法,那么執(zhí)行該功能(系統(tǒng)(xtng)調(diào)用)的任務(wù)的優(yōu)先級(jí)將恢復(fù)到原來(lái)的高度。 共一百二十九頁(yè)釋放(shfng)一個(gè)信號(hào)量OSSemPost()INT8U OSSemPost (OS_EVENT *pevent)if (pevent-OSEven

24、tGrp!=0 x00) /如果有任務(wù)在等待該信號(hào)量OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /使等待任務(wù)列表中優(yōu)先級(jí)最高的任務(wù)就緒OS_Sched(); /內(nèi)核實(shí)施任務(wù)調(diào)度return (OS_NO_ERR);/成功返回(fnhu) if (pevent-OSEventCnt OSEventCnt+; /信號(hào)量的值加1return (OS_NO_ERR);/成功返回 return (OS_SEM_OVF);/信號(hào)量溢出共一百二十九頁(yè)刪除(shnch)信號(hào)量功能:從系統(tǒng)中刪除應(yīng)用指定的一個(gè)(y )信號(hào)量?jī)?nèi)核動(dòng)作:將信號(hào)量控制塊返還給系統(tǒng)刪

25、除信號(hào)量的不一定是創(chuàng)建信號(hào)量的任務(wù)如果有任務(wù)正在等待獲得該信號(hào)量,執(zhí)行此功能將使所有等待這個(gè)信號(hào)量的任務(wù)回到就緒隊(duì)列中,且返回一個(gè)狀態(tài)碼指示該信號(hào)量已被刪除共一百二十九頁(yè)刪除(shnch)信號(hào)量企圖獲取已刪除的信號(hào)量將返回一個(gè)錯(cuò)誤;在互斥信號(hào)量正被使用(shyng)時(shí)(已經(jīng)被某任務(wù)獲?。荒軇h除它。因?yàn)樵撔盘?hào)量正在保護(hù)一個(gè)共享資源或臨界代碼段,該動(dòng)作可能造成數(shù)據(jù)崩潰或其他嚴(yán)重問(wèn)題。 共一百二十九頁(yè)刪除(shnch)一個(gè)信號(hào)量OSSemDel()OS_EVENT *OSSemDel(OS_EVENT *pevent, INT8U opt, INT8U *err)BOOLEAN tasks_wa

26、iting;if(pevent-OSEventGrp!=0 x00/根據(jù)(gnj)是否有任務(wù)在等待信號(hào)量設(shè)置等待標(biāo)志tasks_waiting=TRUE;elsetasks_waiting=FALSE;switch(opt)case OS_DEL_NO_PEND:/如果有任務(wù)等待信號(hào)量則不刪除信號(hào)量if(task_waiting=FALSE/沒(méi)有任務(wù)等待,釋放ECB回空閑鏈pevent-OSEventType=OS_EVENT_TYPE_UNUSED;pevent-OSEventPtr=OSEventFreeList; OSEventFreeList=pevent;/調(diào)整空閑ECB鏈頭指針*e

27、rr=OS_NO_ERR;return(OS_EVENT)0);else*err=OS_ERR_TASK_WAITING;/有任務(wù)等待,刪除信號(hào)量失敗return(pevent);共一百二十九頁(yè)刪除(shnch)一個(gè)信號(hào)量OSSemDel()case OS_DEL_ALWAYS:/無(wú)論有無(wú)任務(wù)等待都刪除信號(hào)量 /將等待列表(li bio)中的每個(gè)任務(wù)都設(shè)置成就緒while(pevent-OSEventGrp!=0 x00)OS_EventTaskRdy(pevent,(void *)0, OS_STAT_SEM);/釋放該信號(hào)量的ECB回空閑控制塊鏈pevent-OSEventType=OS_

28、EVENT_TYPE_UNUSED;pevent-OSEventFreeList; OSEventFreeList=pevent;/如果之前有任務(wù)等待信號(hào)量,內(nèi)核實(shí)施任務(wù)調(diào)度if(tasks_waiting=TRUE)OS_Sched();*err=OS_NO_ERR;return(OS_EVENT *)0);default:*err=OS_ERR_INVALID_OPT;return(pevent);共一百二十九頁(yè)清除信號(hào)量的任務(wù)(rn wu)等待列表為了清除等待一個(gè)信號(hào)量的所有任務(wù),某些內(nèi)核支持Flush操作,以便(ybin)釋放信號(hào)量等待任務(wù)列表中的所有任務(wù)。當(dāng)多個(gè)任務(wù)的執(zhí)行必須在某些點(diǎn)

29、相遇時(shí),需要這樣的機(jī)制。 SignalTaskTask2 二值信號(hào)量初值為0FlushTask1Task3共一百二十九頁(yè)第二節(jié)郵箱和消息(xio xi)隊(duì)列通信方式(fngsh)概述消息隊(duì)列機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)典型的消息隊(duì)列操作消息隊(duì)列的其他典型使用共一百二十九頁(yè)任務(wù)間的通信方式直接通信。在通信過(guò)程中雙方必須明確地知道(命名)彼此:Send (P,message) 發(fā)送一個(gè)消息到任務(wù)PReceive(Q,message) 從任務(wù)Q接收(jishu)一個(gè)消息 間接通信。通信雙方不需要指出消息的來(lái)源或去向,而通過(guò)中間機(jī)制來(lái)通信。如:send(A,message) 發(fā)送一個(gè)消息給郵箱Areceive(

30、A,message) 從郵箱A接收一個(gè)消息通信(tng xn)方式概述共一百二十九頁(yè)消息隊(duì)列:屬于間接通信方式消息:內(nèi)存空間中一段長(zhǎng)度可變的緩沖區(qū),其長(zhǎng)度和內(nèi)容均可以由用戶定義,其內(nèi)容可以是實(shí)際的數(shù)據(jù)、數(shù)據(jù)塊的指針或空。對(duì)消息內(nèi)容的解釋由應(yīng)用完成。從操作系統(tǒng)觀點(diǎn)看,消息沒(méi)有定義的格式,所有的消息都是字節(jié)流,沒(méi)有特定的含義。從應(yīng)用觀點(diǎn)看,根據(jù)應(yīng)用定義的消息格式,消息被解釋成特定的含義。應(yīng)用可以只把消息當(dāng)成(dn chn)一個(gè)標(biāo)志,這時(shí)消息機(jī)制用于實(shí)現(xiàn)同步概述(i sh)共一百二十九頁(yè)一些操作系統(tǒng)內(nèi)核把消息進(jìn)一步分為:郵箱和消息隊(duì)列郵箱僅能存放單條消息,它提供了一種低開(kāi)銷(xiāo)的機(jī)制(jzh)來(lái)傳送信息

31、。每個(gè)郵箱可以保存一條大小為若干個(gè)字節(jié)的消息。消息隊(duì)列可存放若干消息,提供了一種任務(wù)間緩沖通信的方法。消息機(jī)制可支持定長(zhǎng)與可變長(zhǎng)度兩種模式的消息,可變長(zhǎng)度的消息隊(duì)列需要對(duì)隊(duì)列中的每一條消息增加額外的存儲(chǔ)開(kāi)銷(xiāo)。概述(i sh)共一百二十九頁(yè)消息(xio xi)隊(duì)列機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)隊(duì)列控制塊隊(duì)列長(zhǎng)度QCB1隊(duì)列名或IDTask3Task4接收任務(wù)等待列表Task1Task2發(fā)送任務(wù)等待列表最大消息長(zhǎng)度QCB2消息隊(duì)列及其相關(guān)的參數(shù)和支持(zhch)數(shù)據(jù)結(jié)構(gòu) 共一百二十九頁(yè)消息(xio xi)隊(duì)列狀態(tài)圖非空滿隊(duì)列創(chuàng)建(chungjin)消息數(shù)為0消息隊(duì)列狀態(tài)圖消息發(fā)送消息數(shù)加1空消息發(fā)送消息數(shù)為1

32、消息接收消息數(shù)為0消息接收消息數(shù)減1消息接收消息數(shù)減1消息發(fā)送消息數(shù)等于隊(duì)列長(zhǎng)度共一百二十九頁(yè)消息隊(duì)列(duli)機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)消息隊(duì)列控制塊管理所有創(chuàng)建(chungjin)的消息隊(duì)列,系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)分配和回收消息隊(duì)列控制塊消息隊(duì)列緩沖區(qū)存放發(fā)送到該隊(duì)列的消息,接收者從緩沖區(qū)中取出消息。消息的發(fā)送或接收有兩種方法(影響消息緩沖區(qū)結(jié)構(gòu)):將數(shù)據(jù)從發(fā)送任務(wù)的空間完全拷貝到接收任務(wù)的空間中(效率較低,執(zhí)行時(shí)間與消息大小有關(guān))只傳遞指向數(shù)據(jù)存儲(chǔ)空間的指針(提高系統(tǒng)性能)共一百二十九頁(yè)Sending TaskReceiving TaskMessage1Message1Message1發(fā)送任務(wù)的內(nèi)存區(qū)

33、域消息隊(duì)列的內(nèi)存區(qū)域接收任務(wù)的內(nèi)存區(qū)域1st copy2nd copy發(fā)送和接收消息的消息拷貝和內(nèi)存使用這種消息傳遞方法效率低、占用空間大一種效率更高的方式(fngsh)是傳遞消息指針共一百二十九頁(yè)number_of_messagemax_message_countnumber_of_messagemax_message_sizewait_disciplinewait_queuequeue_startqueue_inqueue_outqueue_endmessagemessagemessagemessagemessagemessagemessagemessagemessagemax_messa

34、ge_count消息隊(duì)列(duli)控制塊消息(xio xi)隊(duì)列緩沖區(qū)消息隊(duì)列機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)共一百二十九頁(yè)消息隊(duì)列(duli)的環(huán)形緩沖消息隊(duì)列(duli)機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)max_message_countqueue_endqueue_startqueue_outnumber_of_messagequeue_in消息指針共一百二十九頁(yè)典型的消息(xio xi)隊(duì)列操作創(chuàng)建消息隊(duì)列發(fā)送普通(ptng)消息發(fā)送緊急消息發(fā)送廣播消息接收消息刪除消息隊(duì)列獲取有關(guān)消息隊(duì)列的各種信息 共一百二十九頁(yè)創(chuàng)建消息(xio xi)隊(duì)列創(chuàng)建消息隊(duì)列時(shí),調(diào)用者可以指定如下參數(shù)(cnsh):消息的最大長(zhǎng)度每個(gè)消

35、息隊(duì)列中最多的消息數(shù)消息隊(duì)列的屬性任務(wù)等待消息時(shí)的排隊(duì)方式:FIFO或PRIORITY系統(tǒng)為新創(chuàng)建的消息隊(duì)列分配唯一的ID 共一百二十九頁(yè)發(fā)送(f sn)消息根據(jù)緊急程度(chngd)的不同,消息通常可分為普通消息與緊急消息。如果有任務(wù)正在等待消息(即消息隊(duì)列為空),則普通消息發(fā)送和緊急消息發(fā)送的執(zhí)行效果是一樣的。任務(wù)從等待隊(duì)列移到就緒隊(duì)列中,消息被拷貝到任務(wù)提供的緩沖區(qū)中(或者由接收任務(wù)得到指向消息的指針)。如果沒(méi)有任務(wù)等待,發(fā)送普通消息將消息放在隊(duì)列尾,而發(fā)送緊急消息將消息放在隊(duì)列頭。共一百二十九頁(yè)發(fā)送(f sn)消息Msg 3接收任務(wù)等待列表Msg 2Msg 1消息隊(duì)列發(fā)送普通消息先進(jìn)先

36、出(FIFO)次序Msg 3接收任務(wù)等待列表Msg 2Msg 1消息隊(duì)列發(fā)送緊急消息后進(jìn)先出(LIFO)次序共一百二十九頁(yè)發(fā)送(f sn)消息如果發(fā)送消息時(shí)隊(duì)列已被填滿,則不同的操作系統(tǒng)可能采取不同的處理(chl)辦法:掛起試圖向已滿的消息隊(duì)列中發(fā)送消息的任務(wù)(不適用于中斷服務(wù)程序)簡(jiǎn)單地丟棄該條消息并向調(diào)用者返回錯(cuò)誤信息廣播消息。在此之前所有試圖從隊(duì)列中接收消息的任務(wù)此時(shí)都將獲得相同的消息。該功能拷貝消息到各任務(wù)的消息緩沖中(或者讓所有的等待任務(wù)得到指向消息的指針),并喚醒所有的等待任務(wù)。共一百二十九頁(yè)接收(jishu)消息如果指定的消息隊(duì)列中有消息,則將其中的第一條消息拷貝到調(diào)用者的緩沖區(qū)

37、(或者將第一條消息指針傳遞給調(diào)用者),并從消息隊(duì)列中刪除它。如果此時(shí)消息隊(duì)列中沒(méi)有消息,則可能出現(xiàn)以下幾種情況:永遠(yuǎn)等待消息的到達(dá):等待消息的任務(wù)按FIFO或優(yōu)先級(jí)高低順序排列在等待隊(duì)列中 等待消息且指定等待時(shí)限(shxin):等待消息的任務(wù)按FIFO或優(yōu)先級(jí)高低順序排列在等待隊(duì)列中不等待,強(qiáng)制立即返回共一百二十九頁(yè)接收(jishu)消息限時(shí)等待可有效預(yù)防死鎖中斷服務(wù)程序接收消息時(shí)必須選擇不等待,因?yàn)橹袛喾?wù)程序是不能被阻塞(zs)的。如果消息隊(duì)列被應(yīng)用刪除,則所有等待該消息隊(duì)列的任務(wù)都被返回一個(gè)錯(cuò)誤信息,并回復(fù)到就緒狀態(tài)。共一百二十九頁(yè)接收(jishu)消息Task 4High消息隊(duì)列接收任

38、務(wù)等待列表任務(wù)等待列表基于優(yōu)先級(jí)的次序Task 2mediumTask 3mediumTask 1LowTask 4High消息隊(duì)列接收任務(wù)等待列表任務(wù)等待列表先進(jìn)先出(FIFO)次序Task 2mediumTask 3mediumTask 1Low共一百二十九頁(yè)刪除(shnch)消息隊(duì)列從系統(tǒng)中刪除指定的消息(xio xi)隊(duì)列,釋放消息隊(duì)列控制塊及消息隊(duì)列緩沖區(qū)。任何知道此消息隊(duì)列ID號(hào)的代碼都可以刪除它。消息隊(duì)列被刪除后,所有等待從這個(gè)消息隊(duì)列接收消息的任務(wù)都回到就緒態(tài),并得到一個(gè)錯(cuò)誤信息表明消息隊(duì)列已被刪除。共一百二十九頁(yè)消息隊(duì)列(duli)的其他典型使用緊耦合的單向數(shù)據(jù)通信:發(fā)送(f

39、 sn)任務(wù)發(fā)送(f sn)消息后要求一個(gè)響應(yīng)信號(hào),表明接收任務(wù)已經(jīng)成功接收到消息。 Task1Task2 共一百二十九頁(yè)消息隊(duì)列的其他(qt)典型使用緊耦合的雙向數(shù)據(jù)通信 :如果數(shù)據(jù)需要在任務(wù)之間雙向流動(dòng),則可以(ky)采用緊耦合的雙向數(shù)據(jù)通信模式(也稱為全雙工通信)。 Task1Task2共一百二十九頁(yè)第三節(jié)事 件概述事件(shjin)機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)典型的事件操作事件機(jī)制的典型應(yīng)用共一百二十九頁(yè)在嵌入式實(shí)時(shí)內(nèi)核中,事件是指一種表明預(yù)先定義的系統(tǒng)事件已經(jīng)發(fā)生的機(jī)制。事件機(jī)制用于任務(wù)與任務(wù)之間、任務(wù)與ISR之間的同步。其主要的特點(diǎn)是可實(shí)現(xiàn)一對(duì)多的同步。 一個(gè)事件就是一個(gè)標(biāo)志,不具備其它信息

40、。一個(gè)或多個(gè)事件構(gòu)成一個(gè)事件集。事件集可以用一個(gè)指定長(zhǎng)度的變量(比如(br)一個(gè)8bit, 16bit或32bit的無(wú)符號(hào)整型變量,不同的操作系統(tǒng)其具體實(shí)現(xiàn)不一樣)來(lái)表示,而每個(gè)事件由在事件集變量中的某一位來(lái)代表。 概述(i sh)共一百二十九頁(yè)事件及事件集有以下特點(diǎn): 事件間相互獨(dú)立事件僅用于同步,不提供數(shù)據(jù)傳輸功能事件無(wú)隊(duì)列,即多次發(fā)送同一事件,在未經(jīng)過(guò)任何處理的情況下,其效果等同于只發(fā)送一次。提供事件機(jī)制的意義在于:當(dāng)某任務(wù)要與多個(gè)任務(wù)或中斷服務(wù)同步時(shí),就需要使用事件機(jī)制。若任務(wù)需要與一組事件中的任意一個(gè)(y )發(fā)生同步,可稱為獨(dú)立型同步(邏輯“或”關(guān)系)。任務(wù)也可以等待若干事件都發(fā)生時(shí)

41、才同步,稱為關(guān)聯(lián)型同步(邏輯“與”關(guān)系)。 概述(i sh)共一百二十九頁(yè)“或”同步(tngb)和“與”同步(tngb)概述(i sh)任務(wù)任務(wù)任務(wù)任務(wù)ISRISRORAND“與”型同步“或”型同步事件集事件集POSTPOSTPENDPEND共一百二十九頁(yè)用多個(gè)事件的組合(zh)發(fā)信號(hào)給多個(gè)任務(wù)概述(i sh)任務(wù)任務(wù)任務(wù)ISRORAND事件集事件集事件集(8,16或32位)POSTPENDPEND共一百二十九頁(yè)術(shù)語(yǔ):發(fā)送事件集 。指在一次發(fā)送過(guò)程中發(fā)往接收者(比如任務(wù))的一個(gè)或多個(gè)事件的組合。 待處理事件集。指已被發(fā)送到一個(gè)接收者但還沒(méi)有(mi yu)被接收(即正在等待處理)的所有事件的集合

42、。 事件條件。指事件接收者在一次接收過(guò)程中期待接收的一個(gè)或多個(gè)事件的集合。“或”同步:待處理事件集只要包括事件條件中的任一事件即可滿足要求;“與”同步:其二是待處理事件集必須包括事件條件中的全部事件方可滿足要求。 概述(i sh)共一百二十九頁(yè)事件機(jī)制的主要(zhyo)數(shù)據(jù)結(jié)構(gòu)事件集控制塊:管理所有創(chuàng)建的事件集或者事件集附屬(fsh)于任務(wù),不需創(chuàng)建,其相關(guān)參數(shù)成為任務(wù)控制塊的一部分共一百二十九頁(yè)事件的內(nèi)部實(shí)現(xiàn)機(jī)制實(shí)例(shl)說(shuō)明C/OS-II事件標(biāo)志(biozh)組數(shù)據(jù)結(jié)構(gòu)typedef structINT8UOSFlagType;/指示本數(shù)據(jù)結(jié)構(gòu)的類(lèi)型void*OSFlagWaitLis

43、t;/等待事件標(biāo)志的任務(wù)鏈表OS_FLAGSOSFlagFlags;/各事件標(biāo)志的當(dāng)前狀態(tài)OS_FLAG_GRP;事件標(biāo)志節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)typedef structvoid*OSFlagNodeNext;/后驅(qū)指針void*OSFlagNodePrev;/前驅(qū)指針void*OSFlagNodeTCB;/任務(wù)控制塊指針void*OSFlagNodeFlagGrp;/指回OS_FLAG_GRP結(jié)構(gòu)OS_FLAGSOSFlagNodeFlags;/所等待的事件標(biāo)志組合INT8UOSFlagNodeWaitType;/等待類(lèi)型(與、或)OS_FLAG_NODE;共一百二十九頁(yè)事件(shjin)標(biāo)志組、事

44、件(shjin)標(biāo)志節(jié)點(diǎn)及任務(wù)控制塊之間的關(guān)系OS_FLAG_GRPOS_FLAG_NODE.OSTCBFlagNode.OSFlagNodeFlags.OSFlagNodeWaitType.OSFlagNodeNext.OSFlagNodePrev.OSFlagNodeTCB.OSFlagWaitList.OSFlagFlags.OSFlagTypeAND or ORAND or ORAND or OROS_EVENT_TYPE_FLAG00.OSTCBFlagNodeOS_TCB共一百二十九頁(yè)典型的事件(shjin)操作創(chuàng)建事件集刪除事件集發(fā)送事件(集)接收事件(集)獲取(huq)有關(guān)事件

45、集的各種信息 共一百二十九頁(yè)創(chuàng)建(chungjin)事件集申請(qǐng)空閑(kngxin)事件集控制塊,設(shè)置事件集屬性,初始化控制塊中的域,分配ID號(hào)共一百二十九頁(yè)創(chuàng)建(chungjin)一個(gè)事件標(biāo)志組OSFlagCreate()OS_FLAG_GRP *OSFlagCreate(OS_FLAGS flags, INT8U *err)OS_FLAG_GRP *pgrp;pgrp=OSFlagFreeList;/獲取一個(gè)空閑事件標(biāo)志組結(jié)構(gòu)if(pgrp!=(OS_FLAG_GRP *)0)/獲取成功,初始化該結(jié)構(gòu)中的域OSFlagFreeList=(OS_FLAG_GRP *)OSFlagFreeLis

46、t-OSFlagWaitList;/調(diào)整空閑結(jié)構(gòu)鏈頭指針pgrp-OSFlagType=OS_EVENT_TYPE_FLAG;pgrp-OSFlagFlags=flags;/初始化當(dāng)前(dngqin)各事件標(biāo)志的狀態(tài)pgrp-OSFlagWaitList=(void *)0;/尚無(wú)任務(wù)等待事件標(biāo)志*err=OS_NO_ERR;else*err=OS_FLAG_GRP_DEPLETED;return(pgrp);共一百二十九頁(yè)接收(jishu)事件(集)在接收事件(shjin)(集)時(shí)可以有如下選項(xiàng)WAITNO_WAIT接收事件(集)時(shí)可等待接收事件(集)時(shí)不等待接收者永遠(yuǎn)等待,直到事件條件被滿

47、足后成功返回; 接收者根據(jù)指定的時(shí)限等待。EVENT_ALLEVENT_ANY待處理事件集必須包含事件條件中的全部事件方可滿足要求,即按照“與”條件接收事件待處理事件集只要包含事件條件中的任一事件即可滿足要求,即按照“或”條件接收事件共一百二十九頁(yè)接收(jishu)(等待)事件標(biāo)志組的事件標(biāo)志位OSFlagPend()OS_FLAGS OSFlagPend(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)OS_FLAG_NODE node;/ OS_FLAG_NODE作為局部變量存在于

48、調(diào)用該函數(shù)的任務(wù)(rn wu)堆棧中OS_FLAGS flags_cur;OS_FLAGS flags_rdy;switch(wait_type)case OS_FLAG_WAIT_SET_ALL:/任務(wù)以“與”方式等待事件標(biāo)志flags_rdy=pgrp-OSFlagFlags&flags;if(flags_rdy=flags)/事件標(biāo)志當(dāng)前狀態(tài)與等待條件相符pgrp-OSFlagFlags&=flags_rdy;/清除(即“消費(fèi)”)滿足條件的事件標(biāo)志flags_cur=pgrp-OSFlagFlags;*err=OS_NO_ERR;return(flags_cur);/返回處理后的事件標(biāo)志

49、組elseOS_FlagBlock(pgrp, &node, flags, wait_type, timeout);/事件標(biāo)志當(dāng)前狀態(tài)與等待條件不相符,任務(wù)被阻塞break;共一百二十九頁(yè)接收(jishu)(等待)事件標(biāo)志組的事件標(biāo)志位OSFlagPend()case OS_FLAG_WAIT_SET_ANY: /任務(wù)以“或”方式等待事件標(biāo)志 flags_rdy=pgrp-OSFlagFlags&flags;if(flags_rdy!=(OS_FLAGS)0)/有滿足條件的事件標(biāo)志 pgrp-OSFlagFlags&=flags_rdy; /清除(即“消費(fèi)”)滿足條件的事件標(biāo)志 flags_c

50、ur=pgrp-OSFlagFlags; *err=OS_NO_ERR; return(flags_cur); /返回處理后的事件標(biāo)志組elseOS_FlagBlock(pgrp, &node, flags, wait_type, timeout);/事件標(biāo)志當(dāng)前狀態(tài)(zhungti)與等待條件不相符,任務(wù)被阻塞break;default:flags_cur=(OS_FLAGS)0;*err=OS_FLAG_ERR_WAIT_TYPE;return(flags_cur);共一百二十九頁(yè)OS_Sched();/當(dāng)前任務(wù)被放到事件標(biāo)志等待鏈后,內(nèi)核實(shí)施任務(wù)調(diào)度if(OSTCBCur-OSTCBSt

51、at & OS_STAT_FLAG)/判斷(pndun)任務(wù)重新就緒的原因,如果是等待超時(shí)OS_FlagUnlink(&node);/將任務(wù)從事件標(biāo)志等待鏈中解除下來(lái)OSTCBCur-OSTCBStat=OS_STAT_RDY;/設(shè)置當(dāng)前任務(wù)狀態(tài)為就緒flags_cur=(OS_FLAGS)0;/無(wú)效的事件標(biāo)志狀態(tài)*err=OS_TIMEOUT;/超時(shí)信號(hào)else/任務(wù)重新就緒的原因是在限定時(shí)間得到了滿足條件的事件標(biāo)志pgrp-OSFlagFlags&=OSTCBCur-OSTCBFlagsRdy; /清除(即“消費(fèi)”)滿足條件的事件標(biāo)志flags_cur=pgrp-OSFlagFlags;*

52、err=OS_NO_ERR;return(flags_cur);接收(jishu)(等待)事件標(biāo)志組的事件標(biāo)志位OSFlagPend()共一百二十九頁(yè)添加一個(gè)任務(wù)(rn wu)到事件標(biāo)志組等待任務(wù)(rn wu)鏈表中OS_FlagBlock()OS_FLAG_GRPOS_EVENT_TYPE_FLAGAND or ORAND or OR00OS_TCBOS_TCBOSTCBCurAND or OROS_FLAG_NODEOS_FLAG_NODE0共一百二十九頁(yè)接收(無(wú)等待(dngdi)地獲取)事件標(biāo)志OSFlagAccept()OS_FLAGS OSFlagAccept (OS_FLAG_GR

53、P *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err)OS_FLAGS flags_cur, flags_rdy;*err = OS_NO_ERR;switch (wait_type) /判斷等待事件標(biāo)志的方式 case OS_FLAG_WAIT_SET_ALL:/”與”方式等待flags_rdy = pgrp-OSFlagFlags & flags;if (flags_rdy = flags) pgrp-OSFlagFlags &= flags_rdy;/事件標(biāo)志當(dāng)前狀態(tài)與等待條件(tiojin)相符,清除(即“消費(fèi)”)相應(yīng)的事件標(biāo)志els

54、e *err = OS_FLAG_ERR_NOT_RDY;/不符合條件,返回錯(cuò)誤信息flags_cur = pgrp-OSFlagFlags;break;共一百二十九頁(yè)接收(無(wú)等待地獲取(huq))事件標(biāo)志OSFlagAccept() case OS_FLAG_WAIT_SET_ANY:/”或”方式等待flags_rdy = pgrp-OSFlagFlags & flags;if (flags_rdy != (OS_FLAGS)0) pgrp-OSFlagFlags &= flags_rdy;/事件(shjin)標(biāo)志當(dāng)前狀態(tài)與等待條件相符,清除(即“消費(fèi)”)相應(yīng)的事件(shjin)標(biāo)志else

55、 *err = OS_FLAG_ERR_NOT_RDY; /不符合條件,返回錯(cuò)誤信息flags_cur = pgrp-OSFlagFlags;break; default:flags_cur = (OS_FLAGS)0;/0表示無(wú)效的事件標(biāo)志組*err = OS_FLAG_ERR_WAIT_TYPE;/錯(cuò)誤的等待類(lèi)型break; return (flags_cur);共一百二十九頁(yè)發(fā)送(f sn)事件(集)調(diào)用者(任務(wù)或中斷)構(gòu)造一個(gè)事件(集),將其發(fā)往接收者(比如目標(biāo)任務(wù))??赡軙?huì)出現(xiàn)(chxin)以下幾種情況之一:目標(biāo)任務(wù)正在等待的事件條件得到滿足,任務(wù)就緒;目標(biāo)任務(wù)正在等待的事件條件沒(méi)有

56、得到滿足,該事件(集)被按“或”操作,保存到目標(biāo)任務(wù)的待處理事件集中,目標(biāo)任務(wù)繼續(xù)等待;目標(biāo)任務(wù)未等待事件(集),該事件(集)被按“或”操作,保存到目標(biāo)任務(wù)的待處理事件集中。 共一百二十九頁(yè)發(fā)送(置位)事件(shjin)標(biāo)志組中的事件(shjin)標(biāo)志OSFlagPost()OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U *err)OS_FLAG_NODE *pnode;BOOLEAN sched= FALSE;/初始化調(diào)度標(biāo)志OS_FLAGS flags_cur, flags_rdy;pgrp-OSFlagFlags

57、 |= flags;/置位事件標(biāo)志pnode = (OS_FLAG_NODE *)pgrp-OSFlagWaitList;/獲取(huq)任務(wù)等待鏈頭節(jié)點(diǎn)while (pnode != (OS_FLAG_NODE *)0) /如果有任務(wù)等待,遍歷等待鏈switch (pnode-OSFlagNodeWaitType) case OS_FLAG_WAIT_SET_ALL:/”與”方式等待 flags_rdy = pgrp-OSFlagFlags & pnode-OSFlagNodeFlags; if (flags_rdy = pnode-OSFlagNodeFlags) /符合等待條件 if (

58、OS_FlagTaskRdy(pnode, flags_rdy) = TRUE) sched = TRUE;/如果任務(wù)就緒,設(shè)置調(diào)度標(biāo)志 break;共一百二十九頁(yè)case OS_FLAG_WAIT_SET_ANY:/”或”方式等待(dngdi) flags_rdy = pgrp-OSFlagFlags & pnode-OSFlagNodeFlags; if (flags_rdy != (OS_FLAGS)0) /有滿足條件的事件標(biāo)志 if (OS_FlagTaskRdy(pnode, flags_rdy) = TRUE) sched = TRUE; /如果任務(wù)就緒,設(shè)置調(diào)度標(biāo)志 break;

59、 pnode = (OS_FLAG_NODE *)pnode-OSFlagNodeNext;/下一個(gè)等待事件標(biāo)志的節(jié)點(diǎn)if (sched = TRUE) OS_Sched();/如果設(shè)置了調(diào)度標(biāo)志,則實(shí)施調(diào)度*err = OS_NO_ERR; return (pgrp-OSFlagFlags);發(fā)送(f sn)(置位)事件標(biāo)志組中的事件標(biāo)志OSFlagPost()共一百二十九頁(yè)刪除(shnch)事件集回收事件集控制塊到空閑(kngxin)鏈中,等待接收該事件集的任務(wù)被恢復(fù)就緒共一百二十九頁(yè)刪除事件(shjin)標(biāo)志組OSFlagDel()OS_FLAG_GRP *OSFlagDel (OS_F

60、LAG_GRP *pgrp, INT8U opt, INT8U *err) BOOLEAN tasks_waiting; OS_FLAG_NODE *pnode;if (pgrp-OSFlagWaitList != (void *)0) tasks_waiting = TRUE;/有任務(wù)等待else tasks_waiting = FALSE;/無(wú)任務(wù)等待switch (opt) case OS_DEL_NO_PEND:/在無(wú)任務(wù)等待時(shí)才刪除事件標(biāo)志組if (tasks_waiting = FALSE) /無(wú)任務(wù)等待,釋放控制塊到空閑(kngxin)鏈中 pgrp-OSFlagType = O

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論