




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第5章 事件控制塊引言 事件控制塊是信號(hào)量、消息、事件標(biāo)志組等各種事件的基礎(chǔ)性數(shù)據(jù)結(jié)構(gòu)。 本章主要內(nèi)容事件控制塊的概念事件控制塊數(shù)據(jù)結(jié)構(gòu)3個(gè)事件控制塊相關(guān)算法4種對(duì)事件控制塊的操作。5.1 基本概念 在C/OS-II中,有多種方法可以保護(hù)任務(wù)之間的共享數(shù)據(jù)和提供任務(wù)之間的通信。在前面的章節(jié)中,已經(jīng)講到了其中的兩種:1、利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來(lái)關(guān)閉中斷和打開(kāi)中斷。 2、利用函數(shù)OSSchedLock()和OSSchekUnlock()對(duì)C/OS-II中的任務(wù)調(diào)度函數(shù)上鎖和開(kāi)鎖。3、還有三種用于數(shù)據(jù)共享和任務(wù)通信的方法: 信號(hào)量、互斥信號(hào)
2、量、消息郵箱、消息隊(duì)列、事件標(biāo)志組等。它們是如何進(jìn)行通信的呢? 如何通信呢?圖5.1 任務(wù)和中斷服務(wù)子程序之間的通信過(guò)程 超時(shí)ECB任務(wù)發(fā)信號(hào)任務(wù)等信號(hào)超時(shí)ECB中斷發(fā)信號(hào)任務(wù)等信號(hào)A超時(shí)ECB中斷任務(wù)等信號(hào)任務(wù)任務(wù)發(fā)信號(hào)B超時(shí)超時(shí)ECB任務(wù)等/發(fā)信號(hào)任務(wù)等/發(fā)信號(hào)C事件的概念:一個(gè)任務(wù)或者中斷服務(wù)子程序可以通過(guò)事件控制塊ECB(Event Control Blocks)來(lái)向另外的任務(wù)發(fā)信號(hào)。這里,所有的信號(hào)都被看成是事件(Event)。 事件控制塊的概念用于實(shí)現(xiàn)信號(hào)量管理、互斥型信號(hào)量管理、消息郵箱管理及消息隊(duì)列管理等功能函數(shù)的基本數(shù)據(jù)結(jié)構(gòu)叫事件控制塊ECB(Event Control Bl
3、ocks)該結(jié)構(gòu)除了包含事件本身的定義外(用于信號(hào)量的計(jì)數(shù)器、互斥信號(hào)量的位、指向消息郵箱的指針、指向消息隊(duì)列的指針數(shù)組),還定義了等待該事件的所有任務(wù)列表。每個(gè)信號(hào)量、互斥信號(hào)量、消息郵箱及消息隊(duì)列都應(yīng)分配到一個(gè)事件控制塊ECB。四、等待任務(wù)列表 每個(gè)等待事件發(fā)生的任務(wù)都被加入到該事件事件控制塊中的等待任務(wù)列表中,該列表包括.OSEventGrp和.OSEventTbl兩個(gè)域。通過(guò)對(duì)該表的判別,可以確定有那些任務(wù)在等待事件的發(fā)生。.OSEventPtr指針型變量,只有在定義的事件是郵箱或者消息隊(duì)列時(shí)才使用。當(dāng)所定義的事件是郵箱時(shí),它指向一個(gè)消息,而當(dāng)所定義的事件是消息隊(duì)列時(shí),它指向一個(gè)數(shù)據(jù)結(jié)
4、構(gòu),詳見(jiàn)有關(guān)消息隊(duì)列的章節(jié)。.OSEventTbl和.OSEventGrp是等待任務(wù)列表中的兩個(gè)成員變量,與就緒表中的OSRdyTbl和OSRdyGrp很相似,不同的是前兩個(gè)表示的是等待某事件的任務(wù),后兩個(gè)表示的是處于就緒狀態(tài)的任務(wù)。.OSEventCnt 是一個(gè)用于信號(hào)量的計(jì)數(shù)器,只有當(dāng)事件是信號(hào)量時(shí)才使用。.OSEventType是事件具體類型的描述,詳細(xì)說(shuō)明如下: 當(dāng)事件是信號(hào)量時(shí),其值是OS_EVENT_SEM; 當(dāng)事件是互斥信號(hào)量時(shí),其值是OS_EVENT_MUTEX; 當(dāng)事件是郵箱時(shí),其值是OS_EVENT_TYPE_MBOX; 當(dāng)事件是消息隊(duì)列時(shí),其值是OS_EVENT_TYPE
5、_Q。 三、ECB數(shù)據(jù)結(jié)構(gòu)OS_EVENT .OS_EventPtr .OS_EventCnt .OS_EvenType .OS_EventGrp765432106362616059585756peventOS_EventTbl圖5.2 事件控制塊(ECB)五、OSEventGrp和.OSEventTbl之間的對(duì)應(yīng)關(guān)系例:63/8+1=8例:15 = 0 x0F = 00001111 當(dāng)一個(gè)事件發(fā)生后,該事件的等待事件列表中優(yōu)先級(jí)最高的任務(wù),也即在.OSEventTbl中,所有被置1的位中,優(yōu)先級(jí)代碼最小的任務(wù)得到該事件。.OSEventTbl數(shù)組的大小由系統(tǒng)中任務(wù)的最低優(yōu)先級(jí)決定,這個(gè)值由O
6、S_CFG.H文件中的OS_LOWEST_PRIO常數(shù)決定。在系統(tǒng)的定義中,應(yīng)該盡量減少任務(wù)的優(yōu)先級(jí)配置,以減少C/OS-II系統(tǒng)對(duì)RAM的占用量。 表6.1 OSMapTblIndexBit Mask (Binary)0000000011000000102000001003000010004000100005001000006010000007100000005.2 將任務(wù)置于等待事件的任務(wù)列表 一、原理:將相應(yīng)列表變量和組變量置1用次低的3位作數(shù)組元素下標(biāo)查表OSMapTbl,將組變量相應(yīng)位置1;用任務(wù)優(yōu)先級(jí)的最低3位作數(shù)組元素下標(biāo)查表OSMapTbl,將列表變量相應(yīng)位置1;二、程序源代碼
7、: pevent-OSEventGrp |= OSMapTblprio 3; pevent-OSEventTblprio 3 |= OSMapTblprio & 0 x07; 其中,prio是任務(wù)的優(yōu)先級(jí),pevent是指向事件控制塊的指針。三、作用:將任務(wù)置于該列表中,以等待事件的發(fā)生 當(dāng)有任務(wù)需要等待一個(gè)事件的發(fā)生的時(shí)候,首先就要將任務(wù)置于該事件的等待任務(wù)列表中,以等待事件的發(fā)生。將任務(wù)置于等待事件的任務(wù)列表的原理是將對(duì)應(yīng)的兩個(gè)列表變量分別置1,實(shí)現(xiàn)方法如下: 5.3 從等待事件的任務(wù)列表中使任務(wù)脫離等待狀態(tài) 一、原理: 首先清除任務(wù)在.OSEventTbl中的相應(yīng)位,如果其所在的組中不再
8、有處于等待該事件的任務(wù)時(shí)(即.OSEventTblprio3為0),將.OSEventGrp中的相應(yīng)位也清除。二、源代碼:從等待任務(wù)列表中刪除一個(gè)任務(wù)if (pevent-OSEventTblprio 3 &= OSMapTblprio & 0 x07) = 0) pevent-OSEventGrp &= OSMapTblprio 3;三、作用: 當(dāng)事件發(fā)生后,得到事件的任務(wù)就要脫離等待狀態(tài),轉(zhuǎn)入就緒。 5.4 在等待事件的任務(wù)列表中查找優(yōu)先級(jí)最高的任務(wù) 原理:用組變量的值作索引查表OSUnMapTbl,求得值yy = OSUnMapTblpevent-OSEventGrp; 用表變量的值作索
9、引查表OSUnMapTbl,求得值xx = OSUnMapTblpevent-OSEventTbly; 計(jì)算最高優(yōu)先級(jí):prio=y8+x二、范例 例:若.OSEventGrp = 01101000B,則OSUnMapTbl.OSEventGrp= 3,說(shuō)明最高優(yōu)先級(jí)任務(wù)所在的組是3。類似地,若.OSEventTbl3 = 11100100B OSUnMapTbl.OSEventTbl3 = 2,則處于等待狀態(tài)的任務(wù)的最高優(yōu)先級(jí)是38+226。5.5 空閑事件控制塊鏈表 什么是在空閑事件控制塊鏈表? 調(diào)用OSInit()時(shí),所有事件控制塊被鏈接成一個(gè)單向鏈表空閑事件控制塊鏈表??臻e事件控制塊鏈
10、表的功能每當(dāng)建立一個(gè)信號(hào)量、郵箱或者消息隊(duì)列時(shí),就從該鏈表中取出一個(gè)空閑事件控制塊,并對(duì)它進(jìn)行初始化。當(dāng)信號(hào)量、郵箱和消息隊(duì)列被刪除后,事件控制塊也要放回到空閑事件控制塊鏈表中。 事件控制塊的數(shù)量事件控制塊的總數(shù)由用戶所需要的信號(hào)量、郵箱和消息隊(duì)列的總數(shù)決定。該值由OS_CFG.H 中的#define OS_MAX_EVENTS定義。5.5.1 基本概念圖5.4 空余事件控制塊鏈表 通用操作對(duì)于事件控制塊進(jìn)行的一些通用操作包括:初始化一個(gè)事件控制塊使一個(gè)任務(wù)進(jìn)入就緒態(tài)使一個(gè)任務(wù)進(jìn)入等待該事件的狀態(tài)因?yàn)榈却瑫r(shí)而使一個(gè)任務(wù)進(jìn)入就緒態(tài)實(shí)現(xiàn)函數(shù)為了避免代碼重復(fù)和減短程代碼長(zhǎng)度,以上操作由4個(gè)系統(tǒng)函數(shù)
11、實(shí)現(xiàn),它們是:OSEventWaitListInit(),初始化一個(gè)事件控制塊 ;OSEventTaskRdy(),使一個(gè)任務(wù)進(jìn)入就緒態(tài) ;OSEventWait(),使一個(gè)任務(wù)進(jìn)入等待某事件發(fā)生狀態(tài) ;OSEventTO(),由于等待超時(shí)而將任務(wù)置為就緒態(tài) 。5.5.2 對(duì)事件控制塊的基本操作5.6 初始化一個(gè)事件控制塊 函數(shù)原型void OSEventWaitListInit (OS_EVENT *pevent)功能:函數(shù)初始化一個(gè)空的等待任務(wù)列表,其中沒(méi)有任何任務(wù)。當(dāng)建立一個(gè)信號(hào)量、郵箱或者消息隊(duì)列時(shí),相應(yīng)的建立函數(shù)OSSemInit(),OSMboxCreate(),或者OSQCrea
12、te()通過(guò)調(diào)用OSEventWaitListInit()對(duì)事件控制塊中的等待任務(wù)列表進(jìn)行初始化。參數(shù):函數(shù)的調(diào)用參數(shù)只有一個(gè),就是指向需要初始化的事件控制塊的指針pevent。程序清單5.6 初始化ECB塊的等待任務(wù)列表void OSEventWaitListInit (OS_EVENT *pevent) INT8U i; pevent-OSEventGrp = 0 x00; for (i = 0; i OSEventTbli = 0 x00; 四、實(shí)現(xiàn)代碼5.7 使一個(gè)任務(wù)進(jìn)入就緒態(tài) 功能該函數(shù)從等待任務(wù)隊(duì)列中刪除HPT任務(wù)(Highest Priority Task),并把該任務(wù)置于就緒
13、態(tài)。當(dāng)某個(gè)事件發(fā)生了,該事件等待任務(wù)列表中的最高優(yōu)先級(jí)任務(wù)要置于就緒態(tài)時(shí),該事件對(duì)應(yīng)的OSSemPost(),OSMboxPost(),OSQPost() 和OSQPostFront()函數(shù)調(diào)用OSEventTaskRdy()實(shí)現(xiàn)該操作。void OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)一、函數(shù)原型5.7.1 函數(shù)原型一、原理5.7.2 原理與實(shí)現(xiàn)發(fā)信號(hào)、郵箱、隊(duì) 列等事件任務(wù)A任務(wù)B在事件等待列表中查找優(yōu)先級(jí)最高的任務(wù)刪除事件等待列表中優(yōu)先級(jí)最高的任務(wù)將消息保存在任務(wù)控制塊中將這個(gè)優(yōu)先級(jí)最高的任務(wù)插入到任務(wù)就緒表中在TCB
14、中設(shè)置與事件類型對(duì)應(yīng)的狀態(tài)標(biāo)識(shí)算法首先在等待任務(wù)列表中查找優(yōu)先級(jí)最高的任務(wù);在等待任務(wù)列表中刪除優(yōu)先級(jí)最高的任務(wù);停止OSTimeTick()函數(shù)對(duì).OSTCBDly域的遞減操作,所以O(shè)SEventTaskRdy()直接將該域清0;因?yàn)樵撊蝿?wù)不再等待該事件的發(fā)生,所以O(shè)SEventTaskRdy()函數(shù)將其任務(wù)控制塊中指向事件控制塊的指針指向NULL;如果OSEventTaskRdy()是由OSMboxPost()或者OSQPost()調(diào)用的,該函數(shù)還要將相應(yīng)的消息傳遞給HPT,放在它的任務(wù)控制塊中5.7(10);另外,當(dāng)OSEventTaskRdy()被調(diào)用時(shí),位屏蔽碼msk作為參數(shù)傳遞給它
15、。該參數(shù)是用于對(duì)任務(wù)控制塊中的位清零的位屏蔽碼,和所發(fā)生事件的類型相對(duì)應(yīng)5.7(11);最后,根據(jù).OSTCBStat判斷該任務(wù)是否已處于就緒狀態(tài)5.7(12)。如果是, 則將HPT插入到C/OS-II的就緒任務(wù)列表中5.7(13)。注意,HPT任務(wù)得到該事件后不一定進(jìn)入就緒狀態(tài),也許該任務(wù)已經(jīng)由于其它原因掛起了。void OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk) OS_TCB *ptcb; y = OSUnMapTblpevent-OSEventGrp; (1) bity = OSMapTbly; (2) x = OSUn
16、MapTblpevent-OSEventTbly; (3) bitx = OSMapTblx; prio = (INT8U)(y OSEventTbly &= bitx) = 0) pevent-OSEventGrp &= bity; (6) ptcb = OSTCBPrioTblprio; (7) ptcb-OSTCBDly = 0; ptcb-OSTCBEventPtr = (OS_EVENT *)0; (8)(9)#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN ptcb-OSTCBMsg = msg; (10)#else msg = msg;#en
17、dif ptcb-OSTCBStat &= msk; (11) if (ptcb-OSTCBStat = OS_STAT_RDY) (12) OSRdyGrp |= bity; OSRdyTbly |= bitx; (13) 二、實(shí)現(xiàn)代碼程序清單5.75.8 使一個(gè)任務(wù)進(jìn)入等待某事件發(fā)生狀態(tài) 函數(shù)原型void OSEventTaskWait (OS_EVENT *pevent) 功能當(dāng)某個(gè)任務(wù)要等待一個(gè)事件的發(fā)生時(shí),相應(yīng)事件的OSSemPend()、OSMutexPend() 、OSMboxPend()或OSQPend()函數(shù)會(huì)調(diào)用該函數(shù)將當(dāng)前任務(wù)從就緒任務(wù)表中刪除,并放到相應(yīng)事件的事件控制塊
18、的等待任務(wù)表中 。 函數(shù)原型5.8.2 原理與實(shí)現(xiàn)一、原理開(kāi)始將事件控制塊的指針?lè)诺饺蝿?wù)控制塊中從任務(wù)就緒表中刪除該任務(wù)把該任務(wù)放到事件控制塊的等待任務(wù)列表中去結(jié)束程序清單5.8 使一個(gè)任務(wù)進(jìn)入等待狀態(tài)void OSEventTaskWait (OS_EVENT *pevent) OSTCBCur-OSTCBEventPtr = pevent; (1) if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) (2) OSRdyGrp &= OSTCBCur-OSTCBBitY; pevent-OSEventTblOSTCBCur-OSTCBY |= OSTCBCur-OSTCBBitX; (3) pevent-OSEvent
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)根雕筆筒數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 美工正規(guī)合同范本
- 2025至2030年中國(guó)無(wú)核小棗數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)接骨七厘散數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 借款合同轉(zhuǎn)購(gòu)房合同范本
- 2025至2030年中國(guó)變速器龍門式組合銑床數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)UV光固化絲印上光油數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 健康教育之冠心病的防治
- 惡性腫瘤血栓并發(fā)癥護(hù)理
- 2025年度行業(yè)展會(huì)贈(zèng)送促銷活動(dòng)合作協(xié)議
- 中央2025年中國(guó)科協(xié)所屬單位招聘社會(huì)在職人員14人筆試歷年參考題庫(kù)附帶答案詳解-1
- 2024年濰坊工程職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 殯儀服務(wù)員職業(yè)技能鑒定考試題(附答案)
- 電動(dòng)葫蘆吊裝方案計(jì)劃
- 2025年山東電工電氣集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 《建立特種設(shè)備“日管控、周排查、月調(diào)度”工作機(jī)制》專題培訓(xùn)
- 《自然語(yǔ)言處理》課件
- 壓裂設(shè)備專用件項(xiàng)目評(píng)價(jià)分析報(bào)告
- 2025上半年重慶萬(wàn)州區(qū)事業(yè)單位招聘擬聘用人員歷年管理單位筆試遴選500模擬題附帶答案詳解
- 造價(jià)咨詢服務(wù)方案進(jìn)度計(jì)劃安排及保證措施
- 公路養(yǎng)護(hù)工安全操作規(guī)程模版(2篇)
評(píng)論
0/150
提交評(píng)論