版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第7章 信號量與互斥信號量本章主要描述信號量與互斥信號量的概念、功能、原理及其使用方法。 7.1 信號量管理 7.1.1 概述7.1.1.1 信號量的類型和組成信號量有兩種類型:一種是只有0和1兩種值的信號量,稱為二值信號量;另一種是可以有多種值的信號量,稱為計數(shù)式信號量,其值的大小取決于信號量的數(shù)據(jù)類型,如計數(shù)式信號量是8位整型變量,則其值可以是0255,若是16位整型變量,則其值可以是065,535。C/OS-II的信號量由兩個部分組成:一個是信號量的計數(shù)值,范圍是065,535;另一個是由等待該信號量的任務(wù)組成的任務(wù)等待列表。 7.1.1.2 信號量的功能 信號量可以使用在如下場合:允許
2、一個任務(wù)與其它任務(wù)或中斷同步;取得共享資源的使用權(quán);標志事件的發(fā)生。 7.1.1.3 對信號量的初始計數(shù)值賦值方法 對C/OS-II信號量初始值的賦值方法如下:信號量的初始值065,535。如果表示一個或者多個事件的發(fā)生,那么初始值應(yīng)設(shè)為0。如果是用于對共享資源的訪問,那么該初始值應(yīng)設(shè)為1(例如,把它當(dāng)作二值信號量使用)。如果是用來表示允許任務(wù)訪問n個相同的資源,那么該初始值應(yīng)該是n,并把該信號量作為一個可計數(shù)的信號量使用。 7.1.1.4 信號量管理函數(shù) 如表7.1所示,C/OS-II提供了6種對信號量進行操作的函數(shù),所屬文件是OS_SEM.C。 表7.1 信號量管理函數(shù)一覽表函數(shù)功能調(diào)用者
3、OSSemCreate()建立信號量任務(wù)或者啟動代碼OSSemPend()等待信號量只能是任務(wù)OSSemPost()發(fā)送信號量任務(wù)或者中斷OSSemAccept()無等待地請求信號量任務(wù)或者中斷OSSemDel()刪除信號量任務(wù)OSSemQuery()查詢信號量當(dāng)前狀態(tài)任務(wù)或者中斷7.1.1.5 信號量的配置常量 在使用信號量函數(shù)之前,必須將 OS_CFG.H文件中相應(yīng)的配置常量設(shè)置為0或1,以確定是編譯還是裁剪該函數(shù),其配置常量如表7.2所示。 表7.2 信號量函數(shù)配置常量一覽表函數(shù)配置常量說明系統(tǒng)配置OS_SEM_EN該常量為0時,屏蔽所有信號量函數(shù)OSSemCreate()信號量必然包含
4、這3個函數(shù),所以它們沒有單獨的配置開關(guān)量。OSSemPend()OSSemPost()OSSemAccept()OS_SEM_ACCEPT_ENOSSemDel()OS_SEM_DEL_ENOSSemQuery()OS_SEM_QUERY_EN7.1.1.6 中斷、任務(wù)與信號量之間的關(guān)系 任務(wù)、中斷服務(wù)子程序與信號量之間的關(guān)系如圖7.1所示,其中:用鑰匙或者旗幟的符號來表示信號量。如果信號量用于對共享資源的訪問,那么信號量就用鑰匙符號。符號旁邊的數(shù)字N代表可用資源數(shù)。對于二值信號量,該值就是1;如果信號量用于表示某事件的發(fā)生,那么就用旗幟符號。這時的數(shù)字N代表事件已經(jīng)發(fā)生的次數(shù)。 圖7.1任務(wù)
5、、中斷服務(wù)子程序和信號量之間的關(guān)系 7.1.1.7 注意事項 原則上中斷和任務(wù)可以共享信號量,但并不推薦這樣使用,因為信號量一般用于任務(wù)級。如果非這樣做不可,則中斷服務(wù)子程序只能用來發(fā)送信號量。 7.1.2 建立一個信號量,OSSemCreate() 7.1.2.1 函數(shù)原型OS_EVENT * OSSemCreate( INT16U value)OSSemCreate()函數(shù)用于建立一個信號量,并對信號量賦予初始計數(shù)值。這個初始值就是函數(shù)的參數(shù)value,可以為065,535中的任何值,初始值的設(shè)置規(guī)則如下:如果信號量用來表示一個或多個事件的發(fā)生,那么該信號量的初值通常賦為0;如果信號量用于
6、對共享資源的訪問,那么該信號量的初值應(yīng)賦為1(例如,把它當(dāng)成二值信號量使用)如果信號量用來表示允許訪問n個相同的資源,那么該信號量的初值應(yīng)賦為n,并把信號量作為一個可計數(shù)的信號量使用。OSSemCreate()函數(shù)返回指向分配給所建立的信號量的事件控制塊的指針。如果沒有可用的事件控制塊,OSSemCreate()函數(shù)返回空指針。調(diào)用者是任務(wù)或者啟動代碼,開關(guān)量是OS_SEM_EN。使用任何信號量函數(shù)的前提都是需要用此函數(shù)建立信號量。 7.1.2.2 源代碼 圖7.2 OSSemCreate()函數(shù)返回之前的ECB數(shù)據(jù)結(jié)構(gòu)7.1.2.3 范例 7.1.3 刪除一個信號量,OSSemDel()7.
7、1.3.1 函數(shù)原型OS_EVENT *OSSemDel(OS_EVENT *pevent,INT8U opt,INT8U *err)OSSemDel()函數(shù)用于刪除一個信號量,調(diào)用者只能是任務(wù),開關(guān)量是OS_SEM_EN和OS_SEM_DEL_EN。函數(shù)有如下3個參數(shù):pevent 指向信號量的指針,該指針的值可以在建立信號量時得到;opt 定義信號量刪除條件的選項,它有兩個選擇:OS_DEL_NO_PEND,規(guī)定只能在已經(jīng)沒有任何任務(wù)等待信號量時,才能刪除該信號量;OS_DEL_ALWAYS, 規(guī)定不管有沒有任務(wù)在等待,立即刪除這個信號量。刪除后,所有等待該信號量的任務(wù)立即進入就緒狀態(tài)。e
8、rr 指向包含錯誤代碼的變量的指針,返回的錯誤碼可能為下列幾種之一;OS_NO_ERR調(diào)用成功,信號量被刪除;OS_ERR_DEL_ISR試圖在中斷服務(wù)子程序中刪除信號量;OS_ERR_INVALID_OPT參數(shù)opt不是2種合法參數(shù)之一;OS_ERR_TASK_WAITING有任務(wù)在等待信號量;OS_ERR_PEVENT_TYPE pevent不是指向信號量的指針;OS_ERR_PEVENT_NULL沒有可用的OS_EVENT數(shù)據(jù)結(jié)構(gòu)。 7.1.3 刪除一個信號量,OSSemDel()7.1.3.2 返回值如果信號量已被刪除了,則返回空指針;若信號量沒有能被刪除,則返回pevent。后一種情
9、況下,應(yīng)該查看出錯代碼,以查明原因。7.1.3.3 注意事項由于其它函數(shù)可能還會用到這個信號量,所有在刪除信號量之前,必須首先刪除等待該信號量的所有任務(wù);當(dāng)掛起的任務(wù)進入就緒狀態(tài)時,中斷是關(guān)閉的,這就是說中斷延遲與等待信號量的任務(wù)的數(shù)量密切有關(guān)。 7.1.4 等待一個信號量,OSSemPend() 7.1.4.1 函數(shù)原型void OSSemPend(OS_EVENT *pevent,INT16U timeout,INT8U *err)當(dāng)一個任務(wù)需要請求一個信號量時,就需要使用OSSemPend()函數(shù)。OSSemPend()函數(shù)掛起當(dāng)前任務(wù)直到有其它的任務(wù)或中斷置位信號量或者信號量超出等待的
10、預(yù)期時間。如果在預(yù)期的時鐘節(jié)拍內(nèi)信號量被置位,C/OS-默認最高優(yōu)先級的任務(wù)取得信號量并恢復(fù)執(zhí)行。一個被OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受信號量,但這個任務(wù)將一直保持掛起狀態(tài),直到通過調(diào)用OSTaskResume()函數(shù)恢復(fù)任務(wù)的運行。函數(shù)的調(diào)用者只能是任務(wù),開關(guān)量是OS_SEM_EN。 7.1.4.1 函數(shù)原型 OSSemPend()函數(shù)有如下3個參數(shù):pevent 是指向信號量的指針。該指針的值可以在建立該信號量時得到;timeout 指定的超時時鐘節(jié)拍數(shù)量,如果一個任務(wù)在經(jīng)過了timeout參數(shù)指定的時鐘節(jié)拍后還沒有得到需要的信號量時,就恢復(fù)運行狀態(tài)。如果timeou
11、t為0,則表示任務(wù)將持續(xù)的等待信號量。最大的等待時間為65,535個時鐘節(jié)拍。這個時間長度并不是非常嚴格的,可能存在一個時鐘節(jié)拍的誤差,因為只有在一個時鐘節(jié)拍結(jié)束后才會減少定義的等待超時時鐘節(jié)拍。err 是指向包含錯誤碼的變量的指針。OSSemPend()函數(shù)返回的錯誤碼可能為下述幾種之一:OS_NO_ERR 信號量可用;OS_TIMEOUT 沒有在指定的時鐘節(jié)拍數(shù)內(nèi)得到信號量;OS_ERR_PEND_ISR 從中斷調(diào)用該函數(shù);OS_ERR_EVENT_TYPE pevent 不是指向信號量的指針。當(dāng)任務(wù)調(diào)用OSSemPend()函數(shù)時,如果信號量的值大于零,OSSemPend()函數(shù)遞減該值
12、并返回該值;如果調(diào)用時信號量等于零,OSSemPend()函數(shù)將任務(wù)加入該信號量的等待隊列,并掛起任務(wù),直到該任務(wù)收到信號量。OSSemPend()函數(shù)沒有返回值。 范例 7.1.5 發(fā)送一個信號量,OSSemPost() 7.1.5.1 函數(shù)原型INT8U OSSemPost(OS_EVENT *pevent)OSSemPost()函數(shù)用于置位指定的信號量,或者說用于發(fā)送信號量。如果指定的信號量是0或大于0,無任務(wù)等待信號量,OSSemPost()函數(shù)使該信號量加1并返回。如果有任務(wù)在等待信號量,最高優(yōu)先級的任務(wù)將得到信號量并進入就緒狀態(tài)。任務(wù)調(diào)度函數(shù)將進行任務(wù)調(diào)度,決定當(dāng)前運行的任務(wù)是否仍
13、然為最高優(yōu)先級的任務(wù)。從中斷調(diào)用,不發(fā)生任務(wù)切換,這是因為必須等到中斷嵌套的最外層的ISR調(diào)用OSIntExit()函數(shù)后,任務(wù)切換才能發(fā)生。函數(shù)的調(diào)用者可以是任務(wù),也可以是中斷,開關(guān)量是OS_SEM_EN。OSSemPost()函數(shù)只有1個參數(shù):pevent 指向信號量的指針。該指針的值可以在建立該信號量時得到。 7.1.5.2返回值 函數(shù)的返回值為下述內(nèi)容之一:OS_NO_ERR 信號量成功置位,或者說成功發(fā)送;OS_SEM_OVF 信號量的值溢出;OS_ERR_EVENT_TYPE pevent 不是指向信號量的指針。 7.1.5.2 范例 7.1.6 無等待地請求一個信號量,OSSem
14、Accept() 7.1.6.1 函數(shù)原型INT16U *OSSemAccept(OS_EVENT *pevent)OSSemAccept()函數(shù)用于查看資源是否可以使用或事件是否發(fā)生。與OSSemPend()函數(shù)不同,如果事件沒有發(fā)生,或者資源不可使用,OSSemAccept()函數(shù)不掛起任務(wù)。函數(shù)的調(diào)用者可以是任務(wù),也可以是中斷,由于中斷服務(wù)子程序不能等待,所以該函數(shù)常用于中斷調(diào)用。開關(guān)量是OS_SEM_EN和OS_SEM_ACCEPT_EN。函數(shù)只有1個參數(shù):pevent 指向需要查詢的信號量的指針。該指針的值可以在建立信號量時得到。當(dāng)調(diào)用OSSemAccept()函數(shù)時,如果信號量的值
15、大于0,說明共享資源可以使用,這個值被返回調(diào)用者,信號量的值減1;如果調(diào)用OSSemAccept()函數(shù)時,信號量的值等于0,說明共享資源不能使用,返回0。 7.1.6.3 范例 7.1.7 查詢一個信號量的當(dāng)前狀態(tài),OSSemQuery() 7.1.7.1 函數(shù)原型INT8U OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata)OSSemQuery()函數(shù)用于獲取指定信號量的信息。使用之前,應(yīng)用程序需要先建立類型為OS_SEM_DATA的數(shù)據(jù)結(jié)構(gòu),用來保存從信號量的事件控制塊中取得的數(shù)據(jù)。函數(shù)的調(diào)用者可以是任務(wù),也可以是中斷,開關(guān)量是OS_SEM_EN和OS_SEM_QUERY_EN。利用OSSemQuery()函數(shù)可以獲取信號量當(dāng)前計數(shù)值(.OSCnt)、.OSEventTbl和 .OSEventGrp,不查詢.OSEventType和.OSEventPtr。OSSemQuery()函數(shù)有如下2個參數(shù):pev
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年貨架品牌代理合同
- 2024月餅節(jié)活動策劃與月餅采購服務(wù)合同范本3篇
- 2024招商引資合同書范本
- 2024年豪華專車租賃協(xié)議精簡版樣本版B版
- 2024標準版建筑工程施工協(xié)議范本版B版
- 2024年食堂承包及特色餐飲服務(wù)合同3篇
- 2024年設(shè)備維修保養(yǎng)合同協(xié)議
- 2024年版分店承包管理合同3篇
- 2024年特種大件物品運輸及拆裝合同3篇
- 2024年標準電機采購合同范本版B版
- 一次顯著的性能優(yōu)化
- 《中國近現(xiàn)代史綱要(2023版)》課后習(xí)題答案合集匯編
- DB13T 2974-2019 信息系統(tǒng)集成服務(wù)資費評估指南
- 春節(jié)期間施工現(xiàn)場安全方案
- 黑龍江省建筑工程施工質(zhì)量驗收標準DB23-2017
- 自貢鴻鶴化工股份有限公司20萬噸離子膜燒堿等量搬遷升級改造項目
- 醫(yī)院關(guān)于成立安全生產(chǎn)領(lǐng)導(dǎo)小組的通知
- 【施工方案】空調(diào)百葉施工方案
- ppt模板熱烈歡迎領(lǐng)導(dǎo)蒞臨指導(dǎo)模板課件(15頁PPT)
- 領(lǐng)域驅(qū)動設(shè)計1
- 腦卒中的腸內(nèi)營養(yǎng)支持
評論
0/150
提交評論