版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
信號量集王華斌
簡介在實(shí)際應(yīng)用中,任務(wù)常常需要與多個事件同步,即要根據(jù)多個信號量組合作用的結(jié)果來決定任務(wù)的運(yùn)行方式!Uc/os-ii為了實(shí)現(xiàn)多個信號量組合的功能定義了一個特殊的數(shù)組結(jié)構(gòu)——信號量集信號量集所能管理的信號都是一些二值信號。所以信號量集實(shí)質(zhì)上是一種可以對多個輸入的邏輯信號進(jìn)行基本邏輯運(yùn)算的組合邏輯。一、信號量集的結(jié)構(gòu)組成:標(biāo)志組:存放信號量集中的所有信號。 等待任務(wù)鏈表:鏈表中的每個節(jié)點(diǎn)都對應(yīng)一個正在等待信號量集的等待任務(wù),信號量集根據(jù)這個鏈表來管理等待任務(wù)。信號量集標(biāo)志組等待任務(wù)鏈表信號量集標(biāo)志組等待任務(wù)鏈表1、信號量集的標(biāo)志組利用標(biāo)志組OS_FLAG_GRP來描述信號量集;而不是用事件控制塊來描述。OS_FLAG_GRP的結(jié)構(gòu):
typedefstruct{ INT8UOSFlagType;//信號量集的標(biāo)識
void*OSFlagWaitList;//指向等待任務(wù)鏈表的指針
OS_FLAGSOSFlagFlags;//所有信號列表
}OS_FLAG_GRP;各變量的含義:OSFlagType:信號量集的標(biāo)識,該成員變量的值應(yīng)該固定為OS_EVENT_TYPE_FLAG。OSFlagFlags:OS_FLAGS類型的變量,該變量用來存放信號量集所有信號的狀態(tài),每個信號占據(jù)一個二進(jìn)制位。信號量集中可以存放多少個信號,取決于OSFlagFlags的長度。這個長度可以根據(jù)應(yīng)用程序需要信號的數(shù)目定義為8位、16位、32位。OSFlagWaitList:當(dāng)一個信號量集被創(chuàng)建后,這個指針指向了這個信號量集的等待任務(wù)鏈表。在UC/OS-II初始化時,系統(tǒng)會根據(jù)在文件OS_CFG.H中定義的常數(shù)0S_MAX_FLAGS,來創(chuàng)建0S_MAX_FLAGS個標(biāo)志組(信號量集),并借用成員OSFlagWaitList作為指針把這些標(biāo)志組鏈接成一個單向鏈表。由于這個鏈表中的各個標(biāo)志組還未被真正創(chuàng)建,因此叫做空標(biāo)志組鏈表!空標(biāo)志組鏈表的頭指針存放在系統(tǒng)全局變量OSFlagList中,每當(dāng)應(yīng)用程序創(chuàng)建一個信號量集時,就從這個鏈表中取一個標(biāo)志組,并移動頭指針OSFlagList,使之指向下一個空標(biāo)志組。2、等待任務(wù)鏈表信號量集用一個雙向鏈表來組織等待任務(wù),每一個等待任務(wù)都是該鏈表的一個節(jié)點(diǎn)(Node)。標(biāo)志組OS_FLAG_GRP的成員OSFlagWaitList就指向了信號量集的這個等待任務(wù)鏈表。等待任務(wù)鏈表節(jié)點(diǎn)OS_FLAG_NODE的結(jié)構(gòu):
typedefstruct{ void*OSFlagNodeNext;//指向下一個節(jié)點(diǎn)的指針
void*OSFlagNodePrev;//指向前一個節(jié)點(diǎn)的指針
void*OSFlagNodeTCB;//指向?qū)?yīng)任務(wù)的任務(wù)控制塊
void*OSFlagNodeFlagGrp;//反向指向信號量集指針
OS_FLAGSOSFlagNodeFlags;//信號過濾器
INT8UOSFlagNodeWaitType;//定義邏輯運(yùn)算關(guān)
//系的數(shù)據(jù)}各個變量的定義OSFlagNodeFlagGrp:反向指向信號量集標(biāo)志組的指針,是在等待任務(wù)鏈表中刪除一個節(jié)點(diǎn)或添加一個節(jié)點(diǎn)時用到的指針。OSFlagNodeTCB:指向等待任務(wù)TCB的指針,信號量集的等待任務(wù)鏈表通過這個指針把鏈表節(jié)點(diǎn)與等待任務(wù)關(guān)聯(lián)起來。OSFlagNodeFlags:利用它可在標(biāo)志組成員OSFlagNodeFlags的信號中只把請求任務(wù)需要的信號篩選出來,而把其它的信號屏蔽掉。也就是說,一個請求信號量集的任務(wù)可以需要信號集的所有信號,也可以只需要其中的部分信號,它究竟需要那些信號,要通過在成員OSFlagNodeFlags中與所等待信號對應(yīng)的二進(jìn)制位進(jìn)行置1來指定,而任務(wù)不需要的信號的位置0.OSFlagNodeWaitType:指定邏輯關(guān)系,它有四個常數(shù)可以選擇。它們既指定了邏輯關(guān)系,也指定了信號的有效狀態(tài)。定義信號的有效狀態(tài)及等待任務(wù)與信號之間的邏輯關(guān)系常數(shù)常數(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)OSFlagNodeFlags中的值表明等待任務(wù)所等待的信號是標(biāo)志組成員OSFlagFlags中的第0、4、7個信號。OSFlagNodeWaitType的值表明:信號的有效狀態(tài)是0,即當(dāng)任務(wù)所等待的第0、4、7個信號的狀態(tài)都為0時,任務(wù)才可以結(jié)束等待狀態(tài)而進(jìn)入就緒狀態(tài)。信號用OSFlagFlags來記錄信號,用OSFlagNodeFlags來篩選信號,用OSFlagNodeWaitType來控制信號的有效狀態(tài)和信號量集有效之間的邏輯關(guān)系。把等待任務(wù)鏈表的節(jié)點(diǎn)鏈接起來就形成了等待任務(wù)鏈表。在等待任務(wù)鏈表的基礎(chǔ)上,再加上標(biāo)志組和各個節(jié)點(diǎn)對應(yīng)的任務(wù)控制塊就形成了整個信號量集。3、對等待任務(wù)鏈表的操作添加節(jié)點(diǎn)和刪除節(jié)點(diǎn)添加節(jié)點(diǎn):給等待任務(wù)鏈表添加節(jié)點(diǎn)的函數(shù)OS_FlagBlock()staticvoidOS_FlagBlock( OS_FLAG_GRP*pgrp,//信號量集指針
OS_FLAG_NODE*pnode,//待添加等待任務(wù)節(jié)點(diǎn)指針
OS_FLAGSflags,//指定等待信號的數(shù)據(jù)
INT8Uwait_type,//信號與等待任務(wù)之間的邏輯
INT16Utimeout//等待時限
);
這個函數(shù)將在請求信號量集函數(shù)OSFlagPend()中被調(diào)用。刪除節(jié)點(diǎn):OS_FlagUnlink()VoidOS_FlagUnlink(OS_FLAG_NODE*pnode);二、信號量集的操作創(chuàng)建信號量集OSFlagCreate()請求信號量集OSFlagPend()向信號量集發(fā)信號OSFlagPost()查詢信號量集的狀態(tài)OSFlagQuery()刪除信號量集OSFlagDel()1、創(chuàng)建信號量集OS_FLAG_GRP*OSFlagCreate( OS_FLAGSflags,//信號的初始值
INT8U*err//錯誤信息
)主要的工作:(1)從空標(biāo)志組鏈表中取下一個標(biāo)志組,并同時給成員OSFlagType和OSFlagFlags賦初值;(2)令指向等待任務(wù)鏈表的指針OSFlagWaitList為空指針創(chuàng)建一個信號量集分兩步:首先定義一個全局的OS_FLAG_GRP類型的指針,然后再應(yīng)用程序需要創(chuàng)建信號量集的位置調(diào)用函數(shù)OSFlagCreate()。調(diào)用創(chuàng)建信號量集OSFlagCreate()成功后,該函數(shù)返回的是這個信號量集的標(biāo)志組的指針,應(yīng)用程序可以用這個指針對信號量集進(jìn)行相應(yīng)的操作。2、請求信號量集函數(shù):OSFlagPend()原型:
OS_FLAGSOSFlagPend( OS_FLAG_GRP*pgrp,//請求信號量集指針
OS_FLAGSflags,//濾波器
INT8Uwait_type,//邏輯運(yùn)算類型
INT16Utimeout,//等待時限
INT8U*err//錯誤信息);返回值:調(diào)用成功后返回標(biāo)志組成員OSFlagFlags的值。也就是信號的狀態(tài)任務(wù)也可以通過調(diào)用函數(shù)OSFlagAccept()無等待地請求一個信號量集。原型:
OS_FLAGSOSFlagPend( OS_FLAG_GRP*pgrp,//請求信號量集指針
OS_FLAGSflags,//濾波器
INT8Uwait_type,//邏輯運(yùn)算類型
INTv*err//錯誤信息
);3、向信號量集發(fā)信號任務(wù)可以通過調(diào)用函數(shù)OSFlagPost()向信號量集發(fā)信號。函數(shù)原型:
OS_FLAGSOSFlagPost( OS_FLAG_GRP*pgrp,//請求信號量集指針
OS_FLAGSflags,//選擇所要發(fā)送的信號
INT8Uopt,//信號有效的選項(xiàng)
INTv*err//錯誤信息
);說明:所謂任務(wù)向信號量集發(fā)信號,就是對信號量集標(biāo)志組中的信號進(jìn)行置1或者置0的操作。至于對信號量集中的那些信號進(jìn)行操作,由函數(shù)的參數(shù)flags決定;對指定的信號是置1還是置0,有參數(shù)opt決定(opt=OS_FLAG_SET為置1;opt=OS_FLAG_CLR為置0操作)。4、查詢信號量集的狀態(tài)函數(shù)OSFlagQuery()查詢一個信號量集的狀態(tài)。原型:
OS_FLAGSOSFlagQuery( OS_FLAG_GRP*pgrp,//待查詢的信號量集的指針
INTv*err//錯誤信息
);返回值:被查詢信號量集標(biāo)志組的成員OSFlagFlags,應(yīng)用程序可以用它來完成一些更為復(fù)雜的操作。5、刪除信號量集函數(shù):OSFlagDel()原型:
OS_FLAGSOSFlagDel( OS_FLAG_GRP*pgrp,//待刪除的信
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年飛機(jī)租賃與購買合同3篇
- 2024版系統(tǒng)集成項(xiàng)目外包合同3篇
- 二零二五年度鋼結(jié)構(gòu)廠房項(xiàng)目施工圖紙及技術(shù)交底合同3篇
- 二零二五年餐飲店員工派遣及服務(wù)質(zhì)量保證合同3篇
- 二零二五版半地下室租賃合同附帶租賃雙方責(zé)任界定3篇
- 烏蘭察布醫(yī)學(xué)高等專科學(xué)?!缎W(xué)英語教學(xué)研究》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五版?zhèn)€人住房貸款利率調(diào)整協(xié)議2篇
- 二零二五版房地產(chǎn)抵押權(quán)抵押合同示范文本3篇
- 二零二五年餐飲廚房整體承包運(yùn)營協(xié)議3篇
- 二零二五年度新型商務(wù)寫字樓租賃合同范本3篇 - 副本
- 農(nóng)化分析土壤P分析
- GB/T 18476-2001流體輸送用聚烯烴管材耐裂紋擴(kuò)展的測定切口管材裂紋慢速增長的試驗(yàn)方法(切口試驗(yàn))
- GA 1551.5-2019石油石化系統(tǒng)治安反恐防范要求第5部分:運(yùn)輸企業(yè)
- 拘留所教育課件02
- 沖壓生產(chǎn)的品質(zhì)保障
- 《腎臟的結(jié)構(gòu)和功能》課件
- 2023年湖南聯(lián)通校園招聘筆試題庫及答案解析
- 上海市徐匯區(qū)、金山區(qū)、松江區(qū)2023屆高一上數(shù)學(xué)期末統(tǒng)考試題含解析
- 護(hù)士事業(yè)單位工作人員年度考核登記表
- 產(chǎn)科操作技術(shù)規(guī)范范本
- 人教版八年級上冊地理全冊單元測試卷(含期中期末試卷及答案)
評論
0/150
提交評論