版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
信號量集5.1信號量集的結(jié)構(gòu)在實際應(yīng)用中,任務(wù)常常需要于多個事件同步,即根據(jù)多個信號量組合作用的結(jié)果來決定任務(wù)的運行方式。信號量集所能管理的信號量一般都是二值信號。請求信號量集的任務(wù)得以繼續(xù)運行的條件與所請求的信號量之間有兩種邏輯關(guān)系:AND和OR。uC/OS-II的信號量集由兩部分組成:標(biāo)識組:其中存放了信號量集中的所有信號。等待任務(wù)鏈表:表中的每個節(jié)點都對應(yīng)一個正在等待信號量集的等待任務(wù)。AND/OR發(fā)信號的任務(wù)請求信號的任務(wù)…………圖5-1信號量集示意圖5.1.2等待任務(wù)鏈表信號量集采用一個雙向鏈表來組織等待任務(wù),每一個等待任務(wù)都是該鏈表中的一個節(jié)點(OS_FLAG_NODE)。標(biāo)志組OS_FLAG_GRP的成員OSFlagWaitList就指向了信號量集的這個等待任務(wù)鏈表。typedefstruct{ void*OSFlagNodeNext; //指向下一個節(jié)點的指針
void*OSFlagNodePrev; //指向前一個節(jié)點的指針
void*OSFlagNodeTCB; //指向?qū)?yīng)任務(wù)的任務(wù)控制塊的指針
void*OSFlagNodeFlagGrp; //反向指向信號量集的指針
OS_FLAGSOSFlagNodeFlags; //信號過濾器
INT8UOSFlagNodeWaitType; //定義邏輯運算關(guān)系的數(shù)據(jù)}OS_FLAG_NODE;5.1.2等待任務(wù)鏈表(續(xù))常數(shù)信號有效狀態(tài)等待任務(wù)的就緒條件OS_FLAG_WAIT_CLR_ALL或OS_FLAG_WAIT_CLR_AND0信號全部有效(全0)OS_FLAG_WAIT_CLR_ANY或OS_FLAG_WAIT_CLR_OR0信號有1個或1個以上有效(有0)OS_FLAG_WAIT_SET_ALL或OS_FLAG_WAIT_SET_AND1信號全部有效(全1)OS_FLAG_WAIT_SET_ANY或OS_FLAG_WAIT_SET_OR1信號有1個或1個以上有效(有1)表5-1定義信號的有效狀態(tài)及等待任務(wù)與信號之間的邏輯關(guān)系的常數(shù)OSFlagNodeNextOSFlagNodePrevOSFlagNodeTCBOSFlagNodeFlagGrp10010001OS_FLAG_WAIT_CLR_ALL指向下一個節(jié)點指向前一個節(jié)點OSFlagNodeFlags回指OS_FLAG_GRP結(jié)構(gòu)指向等待任務(wù)的TCBOSFlagNodeWaitType圖6-4信號量集等待任務(wù)鏈表的一個節(jié)點成員OSFlagNodeFlags相當(dāng)于一個過濾器,利用它可把請求任務(wù)需要的信號篩選出來,而把其余信號屏蔽掉。節(jié)點成員OSFlagNodeTCB是指向等待任務(wù)TCB的指針,信號量集的等待任務(wù)鏈表通過這個指針把鏈表結(jié)點與等待任務(wù)關(guān)聯(lián)了起來。節(jié)點成員OSFlagNodeFlagGrp是一個反向指向信號量集標(biāo)志組的指針,是在等待任務(wù)鏈表中刪除一個節(jié)點或添加一個節(jié)點時用到的指針。等待的任務(wù),只有在所需要的信號有效且滿足指定的邏輯關(guān)系時,才能由等待狀態(tài)進(jìn)入就緒狀態(tài)。這個邏輯關(guān)系可以通過給結(jié)構(gòu)OS_FLAG_NODE中的成員OSFlagNodeWaitType賦值的方法來制定,這個值可以是表6-1所例舉的4個常數(shù)之一。5.1.2等待任務(wù)鏈表(續(xù))AND/OR?0/1?1/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/0發(fā)送信號量集的任務(wù)OSFlagFlags請求信號量集的任務(wù)OSFlagNodeFlagsOSFlagNodeWaitType圖5-5信號量集對信號的邏輯運算及控制信號量集用OSFlagFlags來記錄信號用OSFlagNodeFlags來篩選信號用OSFlagNodeWaitType來控制信號的有效狀態(tài)和信號量集有效之間的邏輯關(guān)系5.1.2等待任務(wù)鏈表(續(xù))OSFlagNodeFlagGrpOSFlagNodeNextOSFlagNodePrevOSFlagNodeTCBOSFlagNodeFlagsOSFlagNodeWaiteTypeOSFlagNodeFlagGrpOSFlagNodeNextOSFlagNodePrevOSFlagNodeTCBOSFlagNodeFlagsOSFlagNodeWaiteTypeOSFlagNodeFlagGrpOSFlagNodeNextOSFlagNodePrevOSFlagNodeTCBOSFlagNodeFlagsOSFlagNodeWaiteTypeOSTCBFlagNode……OSTCBFlagNode……OSTCBFlagNode……OS_TCBOS_TCBOS_TCB圖5-6信號量集結(jié)構(gòu)圖OSFlagTypeOSFlagWaitListOSFlagFlags00等待任務(wù)鏈表標(biāo)志組把等待任務(wù)鏈表的節(jié)點鏈接起來就形成了等待任務(wù)鏈表。在等待任務(wù)鏈表的基礎(chǔ)上,再加上標(biāo)志組和各個節(jié)點對應(yīng)的任務(wù)控制塊就形成了整個的信號量集。5.1.3對等待任務(wù)鏈表的操作uC/OS-II定義了兩個對等待任務(wù)鏈表的基本操作:添加節(jié)點和刪除節(jié)點,以供對信號量集操作的函數(shù)調(diào)用。給等待任務(wù)鏈表添加節(jié)點的函數(shù)為OS_FlagBlock(),這個函數(shù)將在請求信號量集函數(shù)OSFlagPend()中被調(diào)用。原型如下:staticvoidOS_FlagBlock( OS_FLAG_GRP*pgrp, //信號量集指針 OS_FLAG_NODE*pnode, //待添加的等待任務(wù)結(jié)點指針 OS_FLAGSflags, //指定等待信號的數(shù)據(jù) INT8Uwait_type, //信號與等待任務(wù)之間的邏輯 INT16Utimeout //等待時限);從等待任務(wù)鏈表中刪除節(jié)點的函數(shù)為OS_FlagUnlink(),個函數(shù)將在發(fā)送信號量集函數(shù)OSFlagPost()中被調(diào)用。原型如下:
voidOS_FlagUnlink(OS_FLAG_NODE*pnode);5.2.2請求信號量集任務(wù)可以通過調(diào)用函數(shù)OSFlagPend()來請求一個信號量集,該函數(shù)原型如下:OS_FLAGSOSFlagPend( OS_FLAG_GRP*pgrp, //所請求的信號量集指針 OS_FLAGSflags, //濾波器 INT8Uwait_type, //邏輯運算類型 INT16Utimeout, //等待時限 INT8U*err //錯誤信息 );任務(wù)也可以通過調(diào)用函數(shù)OSFlagAccept()無等待的請求一個信號量集:OS_FLAGSOSFlagAccept( OS_FLAG_GRP*pgrp, //所請求的信號量集指針 OS_FLAGSflags, //請求的信號 INT8Uwait_type, //任務(wù)就緒與信號之間的邏輯關(guān)系 INT8U*err //錯誤信息);函數(shù)參數(shù)flags是用來給等待任務(wù)鏈表節(jié)點成員OSFlagNodeFlags賦值的,參數(shù)wait_type應(yīng)該是表6-2所例舉的4個常數(shù)之一。函數(shù)調(diào)用成功后,將返回標(biāo)志組成員OSFlagFlags的值。5.2.3向信號量集發(fā)信號任務(wù)可以通過調(diào)用函數(shù)OSFlagPost()向信號量集發(fā)信號,該函數(shù)原型如下:OS_FLAGSOSFlagPost( OS_FLAG_GRP*pgrp, //信號量集指針 OS_FLAGSflags, //選擇所要發(fā)送的信號 INT8Uwait_type, //信號有效的選項 INT8U*err //錯誤信息 );例如,要對信號量集FlagPtr發(fā)信號,待發(fā)送的信號為OSFlagFlags中的第0位和第3位,并且是要把他們置1,則調(diào)用時的代碼如下:OS_FLAGSOSFlagPost( FlagPtr, //信號量集指針 (OS_FLAGS)9, //選擇所要發(fā)送的信號 OS_FLAG_SET, //信號有效的選項 &err //錯誤信息 );所謂任務(wù)向信號量集發(fā)信號,就是對信號量集標(biāo)志組中的信號進(jìn)行設(shè)置1或0的操作。至于對信號量集的哪些信號進(jìn)行操作,由函數(shù)中的參數(shù)flags來指定,對指定的信號置1還是置0,由函數(shù)中的參數(shù)opt來指定。例程5-1:設(shè)計一個有3個任務(wù)的應(yīng)用程序,這3個任務(wù)分別叫做MyTask、YouTask和HerTask。要求任務(wù)YouTask發(fā)送一個信號,任務(wù)HerTask發(fā)送一個信號,當(dāng)這兩個任務(wù)都發(fā)了信號之后,MyTask才能運行。例程5-2:把例5-1中的任務(wù)MyTask調(diào)用的請求信號量集函數(shù)OSFlagPend()改為無等待請求函數(shù)OSFlagAccept(),運行該程序,觀察運行結(jié)果并與例6-1的運行結(jié)果進(jìn)行比較。5.2.4查詢信號量集的狀態(tài)任務(wù)可以通過調(diào)用函數(shù)OSFlagQuery()可以查詢信號量集的狀態(tài),函數(shù)返回值為被查詢信號量集標(biāo)志組的成員OSFlagFlags。該函數(shù)原型如下:OS_FLAGSOSFlagQuery( OS_FLAG_GRP*pgrp, //待查詢的信號量集的指針 INT8U*err //錯誤信息 );例程5-3:修改例5-2應(yīng)用程序,使任務(wù)MyTask可以根據(jù)信號的不同狀態(tài)實現(xiàn)不同的功能。5.2.5刪除信號量集任務(wù)可以通過調(diào)用函數(shù)OSFlagDel()可以刪除信號量集。該函數(shù)原型如下:OS_FLAGS*OSFlagDel( OS_
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024副食品保障供應(yīng)合同
- 農(nóng)產(chǎn)品采購合作協(xié)議書
- 社區(qū)物業(yè)管理服務(wù)合同
- 小額民間借款合同范本
- 建筑行業(yè)材料購銷協(xié)議模板
- 2023年高考地理復(fù)習(xí)精題精練-區(qū)域發(fā)展對交通運輸布局的影響(解析版)
- 2024年售房的合同范本
- 建筑工地物資租賃合同書
- 房產(chǎn)抵押擔(dān)保協(xié)議參考
- 2024年勞務(wù)協(xié)議書樣本
- 企業(yè)如何利用新媒體做好宣傳工作課件
- 如何培養(yǎng)孩子的自信心課件
- 中醫(yī)藥膳學(xué)全套課件
- 頸脊髓損傷-匯總課件
- 齒輪故障診斷完美課課件
- 2023年中國鹽業(yè)集團(tuán)有限公司校園招聘筆試題庫及答案解析
- 大班社會《特殊的車輛》課件
- 野生動物保護(hù)知識講座課件
- 早教托育園招商加盟商業(yè)計劃書
- 光色變奏-色彩基礎(chǔ)知識與應(yīng)用課件-高中美術(shù)人美版(2019)選修繪畫
- 前列腺癌的放化療護(hù)理
評論
0/150
提交評論