




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量管理信號(hào)量與互斥信號(hào)量管理第第6 6章章 信號(hào)量與互斥信號(hào)量管理信號(hào)量與互斥信號(hào)量管理 本章主要描述信號(hào)量與互斥信號(hào)本章主要描述信號(hào)量與互斥信號(hào)量的概念、功能、原理及其使用方法。量的概念、功能、原理及其使用方法。 本章主要內(nèi)容本章主要內(nèi)容嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1 信號(hào)量管理 l信號(hào)量的類型信號(hào)量的類型l一種是只有0和1兩種值的信號(hào)量,稱為二值信號(hào)量;l另一種是可以有多種值的信號(hào)量,稱為計(jì)數(shù)式信號(hào)量,其
2、值的大小取決于信號(hào)量的數(shù)據(jù)類型,如計(jì)數(shù)式信號(hào)量是8位整型變量,則其值可以是0255,若是16位整型變量,則其值可以是065,535。lC/OS-IIC/OS-II信號(hào)量的兩個(gè)組成部分信號(hào)量的兩個(gè)組成部分l一個(gè)是信號(hào)量的計(jì)數(shù)值,范圍是065,535;l另一個(gè)是由等待該信號(hào)量的任務(wù)組成的任務(wù)等待列表。6.1.1 6.1.1 概述概述6.1.1.1 6.1.1.1 信號(hào)量的類型和組成信號(hào)量的類型和組成嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.1.2 6.1.1.2 信號(hào)量的功能信號(hào)量的功能 信號(hào)量可以使用在如下場(chǎng)合:l
3、允許一個(gè)任務(wù)與其它任務(wù)或中斷同步;l取得共享資源的使用權(quán);1.標(biāo)志事件的發(fā)生。 6.1.1.3 6.1.1.3 對(duì)信號(hào)量的初始計(jì)數(shù)值賦值方法對(duì)信號(hào)量的初始計(jì)數(shù)值賦值方法對(duì)C/OS-II信號(hào)量初始值的賦值方法如下:信號(hào)量的初始值065,535。如果表示一個(gè)或者多個(gè)事件的發(fā)生,那么初始值應(yīng)設(shè)為0。如果是用于對(duì)共享資源的訪問,那么該初始值應(yīng)設(shè)為1(例如,把它當(dāng)作二值信號(hào)量使用)。1.如果是用來表示允許任務(wù)訪問n個(gè)相同的資源,那么該初始值應(yīng)該是n,并把該信號(hào)量作為一個(gè)可計(jì)數(shù)的信號(hào)量使用。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)
4、量6.1.1.4 6.1.1.4 信號(hào)量管理函數(shù)信號(hào)量管理函數(shù) 如表6.1所示,C/OS-II提供了6種對(duì)信號(hào)量進(jìn)行操作的函數(shù),所屬文件是OS_SEM.C。 表表6.1 6.1 信號(hào)量管理函數(shù)一覽表信號(hào)量管理函數(shù)一覽表函數(shù)功能調(diào)用者OSSemCreate()OSSemCreate()建立信號(hào)量任務(wù)或者啟動(dòng)代碼OSSemPend()OSSemPend()等待信號(hào)量只能是任務(wù)OSSemPost()OSSemPost()發(fā)送信號(hào)量任務(wù)或者中斷OSSemAccept()OSSemAccept()無等待地請(qǐng)求信號(hào)量任務(wù)或者中斷OSSemDel()OSSemDel()刪除信號(hào)量任務(wù)OSSemQuery()
5、OSSemQuery()查詢信號(hào)量當(dāng)前狀態(tài)任務(wù)或者中斷嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.1.5 6.1.1.5 信號(hào)量的配置常量信號(hào)量的配置常量 在使用信號(hào)量函數(shù)之前,必須將 OS_CFG.H文件中相應(yīng)的配置常量設(shè)置為0或1,以確定是編譯還是裁剪該函數(shù),其配置常量如表6.2所示。表表6.2 6.2 信號(hào)量函數(shù)配置常量一覽表信號(hào)量函數(shù)配置常量一覽表函數(shù)配置常量說明系統(tǒng)配置OS_SEM_EN該常量為0時(shí),屏蔽所有信號(hào)量函數(shù)OSSemCreate()信號(hào)量必然包含這3個(gè)函數(shù),所以它們沒有單獨(dú)的配置常量。OSSe
6、mPend()OSSemPost()OSSemAccept()OS_SEM_ACCEPT_ENOSSemDel()OS_SEM_DEL_ENOSSemQuery()OS_SEM_QUERY_EN嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.1.6 6.1.1.6 中斷、任務(wù)與信號(hào)量之間的關(guān)系中斷、任務(wù)與信號(hào)量之間的關(guān)系 l如果信號(hào)量用于對(duì)共享資源的訪問,那么信號(hào)量就用鑰匙符號(hào)。符號(hào)旁邊的數(shù)字N代表可用資源數(shù)。對(duì)于二值信號(hào)量,該值就是1;l如果信號(hào)量用于表示某事件的發(fā)生,那么就用旗幟符號(hào)。這時(shí)的數(shù)字N代表事件已經(jīng)發(fā)生的
7、次數(shù)。圖6.1任務(wù)、中斷服務(wù)子程序和信號(hào)量之間的關(guān)系 任務(wù)、中斷服務(wù)子程序與信號(hào)量之間的關(guān)系如圖6.1所示,其中:用鑰匙或者旗幟符號(hào)來表示信號(hào)量。6.1.1.7 6.1.1.7 應(yīng)用要點(diǎn)應(yīng)用要點(diǎn) 原則上中斷和任務(wù)可以共享信號(hào)量,但并不推薦這樣使用,因?yàn)樾盘?hào)量一般用于任務(wù)級(jí)。如果非這樣做不可,則中斷服務(wù)子程序只能用來發(fā)送信號(hào)量。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.2 6.1.2 建立一個(gè)信號(hào)量,建立一個(gè)信號(hào)量,OSSemCreate()OSSemCreate() 6.1.2.1 6.1.2.1 函數(shù)原型函數(shù)原
8、型OS_EVENT OS_EVENT * * OSSemCreate( INT16U value) OSSemCreate( INT16U value)l功能:功能:OSSemCreate()函數(shù)用于建立一個(gè)信號(hào)量,并對(duì)信號(hào)量賦予初始計(jì)數(shù)值。這個(gè)初始值就是函數(shù)的參數(shù)valuevalue,可以為065,535中的任何值,初始值有自己的設(shè)置規(guī)則。l初始值的設(shè)置規(guī)則初始值的設(shè)置規(guī)則l如果信號(hào)量用來表示一個(gè)或多個(gè)事件的發(fā)生,那么該信號(hào)量的初值通常賦為0;l如果信號(hào)量用于對(duì)共享資源的訪問,那么該信號(hào)量的初值應(yīng)賦為1(例如,把它當(dāng)成二值信號(hào)量使用);l如果信號(hào)量用來表示允許訪問n個(gè)相同的資源,那么該信號(hào)量
9、的初值應(yīng)賦為n,并把信號(hào)量作為一個(gè)可計(jì)數(shù)的信號(hào)量使用。l返回值:返回值:OSSemCreate()函數(shù)返回指向分配給所建立的信號(hào)量的事件控制塊的指針。如果沒有可用的事件控制塊,OSSemCreate()函數(shù)返回空指針。l調(diào)用者:調(diào)用者:任務(wù)或者啟動(dòng)代碼。一一配置常量:配置常量:OS_SEM_EN。使用任何信號(hào)量函數(shù)的前提都是需要用此函數(shù)建立信號(hào)量。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.2 6.1.2 建立一個(gè)信號(hào)量,建立一個(gè)信號(hào)量,OSSemCreate()OSSemCreate() 6.1.2.1 6.1.
10、2.1 函數(shù)原型函數(shù)原型OS_EVENT OS_EVENT * * OSSemCreate( INT16U value) reentrant OSSemCreate( INT16U value) reentrantl功能:功能:OSSemCreate()函數(shù)用于建立一個(gè)信號(hào)量,并對(duì)信號(hào)量賦予初始計(jì)數(shù)值。這個(gè)初始值就是函數(shù)的參數(shù)valuevalue,可以為065,535中的任何值,初始值有自己的設(shè)置規(guī)則。l初始值的設(shè)置規(guī)則初始值的設(shè)置規(guī)則l如果信號(hào)量用來表示一個(gè)或多個(gè)事件的發(fā)生,那么該信號(hào)量的初值通常賦為0;l如果信號(hào)量用于對(duì)共享資源的訪問,那么該信號(hào)量的初值應(yīng)賦為1(例如,把它當(dāng)成二值信號(hào)量使
11、用);l如果信號(hào)量用來表示允許訪問n個(gè)相同的資源,那么該信號(hào)量的初值應(yīng)賦為n,并把信號(hào)量作為一個(gè)可計(jì)數(shù)的信號(hào)量使用。l調(diào)用者:調(diào)用者:任務(wù)或者啟動(dòng)代碼。一一配置常量:配置常量:OS_SEM_EN。使用任何信號(hào)量函數(shù)的前提都是需要用此函數(shù)建立信號(hào)量。 函數(shù)返回指向分配給所建立的信號(hào)量的事件控制塊的指針。如果沒有可用的事件控制塊,OSSemCreate()函數(shù)返回空指針。6.1.2.2 6.1.2.2 返回值返回值 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量圖6.3 返回之前的ECB數(shù)據(jù)結(jié)構(gòu)6.1.2.3 6.1.2.3 原
12、理與實(shí)現(xiàn)原理與實(shí)現(xiàn) 一、原理一、原理二、實(shí)現(xiàn)代碼二、實(shí)現(xiàn)代碼圖6.2 信號(hào)量建立計(jì)算原理主要流程 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.2.4 6.1.2.4 應(yīng)用范例應(yīng)用范例 程序清單程序清單6.2 OSSemCreate() 6.2 OSSemCreate() 應(yīng)用范例應(yīng)用范例OS_EVENT OS_EVENT * *AdcSemAdcSem; / 定義一個(gè)指向信號(hào)量ECB的指針 void main(void) OSInit();.AdcSem=OSSemCreate(1)AdcSem=OSSemCrea
13、te(1); / 信號(hào)量初始值設(shè)置為1.OSStart(); OSSemCreate()函數(shù)應(yīng)用范例如程序清單6.2所示,必須首先定義一個(gè)OS_EVENT類型的全局變量,用于保存函數(shù)的返回值,以供其它相關(guān)函數(shù)使用。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.3 6.1.3 刪除一個(gè)信號(hào)量,刪除一個(gè)信號(hào)量,OSSemDel()OSSemDel()6.1.3.1 6.1.3.1 函數(shù)原型函數(shù)原型OS_EVENT *OSSemDel(OS_EVENT *pevent,INT8U opt,INT8U *err) reent
14、rantl功能:功能:OSSemDel()函數(shù)用于刪除一個(gè)信號(hào)量。l調(diào)用者:調(diào)用者:只能是任務(wù)。l配置常量:配置常量:OS_SEM_EN和OS_SEM_DEL_EN。l參數(shù)參數(shù)lpeventpevent 指向信號(hào)量的指針,該指針的值可以在建立信號(hào)量時(shí)得到;loptopt定義信號(hào)量刪除條件的選項(xiàng),它有兩個(gè)選擇:OS_DEL_NO_PEND,規(guī)定只能在已經(jīng)沒有任何任務(wù)等待信號(hào)量時(shí),才能刪除該信號(hào)量;OS_DEL_ALWAYS, 規(guī)定不管有沒有任務(wù)在等待,立即刪除這個(gè)信號(hào)量。刪除后,所有等待該信號(hào)量的任務(wù)立即進(jìn)入就緒狀態(tài)。lerrerr 指向包含錯(cuò)誤代碼的變量的指針,返回值可能為下列幾種之一;OS_
15、NO_ERROS_NO_ERR調(diào)用成功,信號(hào)量被刪除;OS_ERR_DEL_ISROS_ERR_DEL_ISR試圖在中斷服務(wù)子程序中刪除信號(hào)量;OS_ERR_INVALID_OPTOS_ERR_INVALID_OPT參數(shù)opt不是2種合法參數(shù)之一;OS_ERR_TASK_WAITINGOS_ERR_TASK_WAITING有任務(wù)在等待信號(hào)量;OS_ERR_PEVENT_TYPEOS_ERR_PEVENT_TYPE pevent不是指向信號(hào)量的指針;一一OS_ERR_PEVENT_NULLOS_ERR_PEVENT_NULL 沒有可用的OS_EVENT數(shù)據(jù)結(jié)構(gòu)。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作
16、系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.3.2 6.1.3.2 返回值返回值 如果信號(hào)量已被刪除了,則返回空指針;若信號(hào)量沒有能被刪除,則返回pevent。后一種情況下,應(yīng)該查看出錯(cuò)代碼,以查明原因。6.1.3.3 6.1.3.3 原理原理 基本原理:所謂刪除信號(hào)量其實(shí)質(zhì)就是將信號(hào)量所屬的ECB設(shè)置恢復(fù)到它在空閑ECB鏈表中的原始狀態(tài),并將這個(gè)ECB還給空閑ECB鏈表。 6.1.3.4 6.1.3.4 應(yīng)用要點(diǎn)應(yīng)用要點(diǎn)l由于其它函數(shù)可能還會(huì)用到這個(gè)信號(hào)量,所有在刪除信號(hào)量之前,必須首先刪除等待該信號(hào)量的所有任務(wù);1.當(dāng)掛起的任務(wù)進(jìn)入就緒狀態(tài)時(shí)
17、,中斷是關(guān)閉的,這就是說中斷延遲與等待信號(hào)量的任務(wù)的數(shù)量密切有關(guān)。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.4 6.1.4 等待一個(gè)信號(hào)量,等待一個(gè)信號(hào)量,OSSemPend()OSSemPend() 6.1.4.1 6.1.4.1 函數(shù)原型函數(shù)原型void OSSemPend(OS_EVENT void OSSemPend(OS_EVENT * *peventpevent,INT16U timeoutINT16U timeout,INT8U INT8U * *err) reentranterr) reentr
18、ant l功能:功能:OSSemPend()函數(shù)掛起當(dāng)前任務(wù)直到有其它的任務(wù)或中斷置位信號(hào)量或者信號(hào)量超出等待的預(yù)期時(shí)間。如果在預(yù)期的時(shí)鐘節(jié)拍內(nèi)信號(hào)量被置位,C/OS-默認(rèn)最高優(yōu)先級(jí)的任務(wù)取得信號(hào)量并恢復(fù)執(zhí)行。l當(dāng)一個(gè)任務(wù)需要請(qǐng)求一個(gè)信號(hào)量時(shí),就需要使用OSSemPend()函數(shù)。l一個(gè)被OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受信號(hào)量,但這個(gè)任務(wù)將一直保持掛起狀態(tài),直到通過調(diào)用OSTaskResume()函數(shù)恢復(fù)任務(wù)的運(yùn)行。l調(diào)用者:調(diào)用者:只能是任務(wù)。一一配置常量:配置常量:沒有單獨(dú)的配置常量。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信
19、號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量l函數(shù)參數(shù):函數(shù)參數(shù):lpeventpevent 是指向信號(hào)量的指針。該指針的值可以在建立該信號(hào)量時(shí)得到;ltimeouttimeout 指定的超時(shí)時(shí)鐘節(jié)拍數(shù)量,如果一個(gè)任務(wù)在經(jīng)過了timeout參數(shù)指定的時(shí)鐘節(jié)拍后還沒有得到需要的信號(hào)量時(shí),就恢復(fù)運(yùn)行狀態(tài)。如果timeout為0,則表示任務(wù)將持續(xù)的等待信號(hào)量。最大的等待時(shí)間為65,535個(gè)時(shí)鐘節(jié)拍。這個(gè)時(shí)間長(zhǎng)度并不是非常嚴(yán)格的,可能存在一個(gè)時(shí)鐘節(jié)拍的誤差,因?yàn)橹挥性谝粋€(gè)時(shí)鐘節(jié)拍結(jié)束后才會(huì)減少定義的等待超時(shí)時(shí)鐘節(jié)拍。lerrerr 是指向包含錯(cuò)誤碼的變量的指針。OSSemPend()函數(shù)返回的錯(cuò)誤碼可能為下述幾
20、種之一:OS_NO_ERR 信號(hào)量可用;OS_TIMEOUT 沒有在指定的時(shí)鐘節(jié)拍數(shù)內(nèi)得到信號(hào)量;OS_ERR_PEND_ISR 從中斷調(diào)用該函數(shù);OS_ERR_EVENT_TYPE pevent 不是指向信號(hào)量的指針。l當(dāng)任務(wù)調(diào)用OSSemPend()函數(shù)時(shí),如果信號(hào)量的值大于零,OSSemPend()函數(shù)遞減該值并返回該值;如果調(diào)用時(shí)信號(hào)量等于零,OSSemPend()函數(shù)將任務(wù)加入該信號(hào)量的等待隊(duì)列,并掛起任務(wù),直到該任務(wù)收到信號(hào)量。6.1.4.2 6.1.4.2 返回值返回值OSSemPend()函數(shù)沒有返回值。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章
21、第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.4.3 6.1.4.3 原理與實(shí)現(xiàn)原理與實(shí)現(xiàn) 基本原理:就是從參數(shù)pevent指針?biāo)赶虻腅CB數(shù)據(jù)結(jié)構(gòu)中,獲取成員變量 . .OSEventCnt的信號(hào)量計(jì)數(shù)器值。若該值大于0,則得到一個(gè)信號(hào)量;若該值等于0,則掛起任務(wù),等待信號(hào)量直到 . .OSEventCnt = 1。程序清單程序清單6.5 OSSemPend()6.5 OSSemPend()應(yīng)用范例應(yīng)用范例OS_EVENT *AdcSem; / 定義一個(gè)指向信號(hào)量ECB的指針void Task(void *ppdata) reentrant INT8U err; ppdata = p
22、pdata; for (;) . OSSemPend(AdcSem,0,&err); / 無限期等待信號(hào)量, / 只有得到信號(hào)量任務(wù)才能執(zhí)行 . 6.1.4.4 6.1.4.4 應(yīng)用范例應(yīng)用范例 OSSemPend()函數(shù)應(yīng)用范例如程序清單6.5所示,必須在建立信號(hào)量前定義一個(gè)OS_EVENT類型的全局變量,用于指向信號(hào)量ECB。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.5 6.1.5 發(fā)送一個(gè)信號(hào)量,發(fā)送一個(gè)信號(hào)量,OSSemPost()OSSemPost() 6.1.5.1 函數(shù)原型函數(shù)原型INT8U
23、 OSSemPost(OS_EVENT *pevent)reentrantl功能:功能:OSSemPost()函數(shù)用于置位指定的信號(hào)量,或者說用于發(fā)送信號(hào)量。l如果指定的信號(hào)量是0或大于0,無任務(wù)等待信號(hào)量,OSSemPost()函數(shù)使該信號(hào)量加1并返回。l如果有任務(wù)在等待信號(hào)量,最高優(yōu)先級(jí)的任務(wù)將得到信號(hào)量并進(jìn)入就緒狀態(tài)。任務(wù)調(diào)度函數(shù)將進(jìn)行任務(wù)調(diào)度,決定當(dāng)前運(yùn)行的任務(wù)是否仍然為最高優(yōu)先級(jí)的任務(wù)。l從中斷調(diào)用,不發(fā)生任務(wù)切換,這是因?yàn)楸仨毜鹊街袛嗲短椎淖钔鈱拥腎SR調(diào)用OSIntExit()函數(shù)后,任務(wù)切換才能發(fā)生。l調(diào)用者:調(diào)用者:可以是任務(wù),也可以是中斷l(xiāng)配置常量:配置常量:沒有單獨(dú)的配置
24、常量。一一函數(shù)參數(shù):函數(shù)參數(shù):pevent 指向信號(hào)量的指針。該指針的值可以在建立該信號(hào)量時(shí)得到。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.5.2 6.1.5.2 返回值返回值 OSSemPost()函數(shù)的返回值有如下幾種:lOS_NO_ERR 信號(hào)量成功置位,或者說成功發(fā)送;lOS_SEM_OVF 信號(hào)量的值溢出;lOS_ERR_EVENT_TYPE pevent 不是指向信號(hào)量的指針;1.OS_ERR_PEVENT_NULLpevent是空指針。6.1.5.3 6.1.5.3 原理與實(shí)現(xiàn)原理與實(shí)現(xiàn) 基本原理
25、:從參數(shù)pevent指針?biāo)赶虻牡却蝿?wù)列表中查詢是否有任務(wù)正在等待信號(hào)量。若有,則將優(yōu)先級(jí)最高的任務(wù)置于就緒,并重新調(diào)度任務(wù);若無,則將信號(hào)量計(jì)數(shù)器的值加。6.1.5.4 6.1.5.4 應(yīng)用范例應(yīng)用范例 程序清單程序清單6.6 OSSemPost()6.6 OSSemPost()應(yīng)用范例應(yīng)用范例OS_EVENT *AdcSem; / 定義一個(gè)指向信號(hào)量的ECB指針void Task(void *ppdata) reentrant INT8U err; ppdata = ppdata; for (;) . err = OSSemPost(AdcSem); / 發(fā)送信號(hào)量 . 嵌入式實(shí)時(shí)操作系
26、統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.6 6.1.6 無等待地請(qǐng)求一個(gè)信號(hào)量,無等待地請(qǐng)求一個(gè)信號(hào)量,OSSemAccept()OSSemAccept() 6.1.6.1 6.1.6.1 函數(shù)原型函數(shù)原型INT16U INT16U * *OSSemAcceptOSSemAccept(OS_EVENT OS_EVENT * *peventpevent)reentrantreentrantl功能:功能:OSSemAccept()函數(shù)用于查看資源是否可以使用或事件是否發(fā)生。與OSSemPend()函數(shù)不同,如果事件沒有發(fā)生,或者資
27、源不可使用,OSSemAccept()函數(shù)不掛起任務(wù)。l調(diào)用者:調(diào)用者:可以是任務(wù),也可以是中斷,由于中斷服務(wù)子程序不能等待,所以該函數(shù)常用于中斷調(diào)用。l配置常量:配置常量:OS_SEM_ACCEPT_EN。l函數(shù)參數(shù):函數(shù)參數(shù):peventpevent 指向需要查詢的信號(hào)量的指針。該指針的值可以在建立信號(hào)量時(shí)得到。6.1.6.2 6.1.6.2 返回值返回值l當(dāng)調(diào)用OSSemAccept()函數(shù)時(shí),如果信號(hào)量的值大于0,說明共享資源可以使用,這個(gè)值被返回調(diào)用者,信號(hào)量的值減1;一如果調(diào)用OSSemAccept()函數(shù)時(shí),信號(hào)量的值等于0,說明共享資源不能使用,返回0。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入
28、式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.6.3 6.1.6.3 原理與實(shí)現(xiàn)原理與實(shí)現(xiàn) 函數(shù)的基本原理:通過直接查詢參數(shù)pevent 所指向的ECB中的成員變量 . .OSEventCnt的值來實(shí)現(xiàn)信號(hào)量的查詢。 程序清單程序清單6.8 OSSemAccept()6.8 OSSemAccept()應(yīng)用范例應(yīng)用范例OS_EVENT *AdcSem; / 定義一個(gè)信號(hào)量ECB指針void Task (void *ppdata) reentrant INT16U value; ppdata = ppdata; for (;) value =
29、 OSSemAccept(AdcSem);/ 查看共享資源是否可用或事件是否發(fā)生 if (value 0) . / 運(yùn)行處理代碼 . 6.1.6.4 6.1.6.4 應(yīng)用范例應(yīng)用范例OSSemAccept()函數(shù)應(yīng)用范例如程序清單6.8所示。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第六章第六章 信號(hào)量與互斥信號(hào)量信號(hào)量與互斥信號(hào)量6.1.7 6.1.7 查詢一個(gè)信號(hào)量的當(dāng)前狀態(tài),查詢一個(gè)信號(hào)量的當(dāng)前狀態(tài),OSSemQuery()OSSemQuery() 6.1.7.1 6.1.7.1 函數(shù)原型函數(shù)原型INT8U OSSemQuery(OS_EVENT *pevent,
30、 OS_SEM_DATA*ppdata) reentrantl功能:功能:OSSemQuery()函數(shù)用于獲取指定信號(hào)量的信息。l利用OSSemQuery()函數(shù)可以獲取信號(hào)量當(dāng)前計(jì)數(shù)值(.OSCnt)、.OSEventTbl和 .OSEventGrp,不查詢.OSEventType和.OSEventPtr。l使用之前,應(yīng)用程序需要先建立類型為OS_SEM_DATA的數(shù)據(jù)結(jié)構(gòu),用來保存從信號(hào)量的事件控制塊中取得的數(shù)據(jù)。l調(diào)用者:調(diào)用者:可以是任務(wù),也可以是中斷。l配置常量:配置常量:OS_SEM_QUERY_EN。l函數(shù)參數(shù):函數(shù)參數(shù):lpeventpevent 指向信號(hào)量的指針,該指針的值可以在建立信號(hào)量時(shí)得到;lppdatappdata 指向數(shù)據(jù)結(jié)構(gòu)OS_SEM_DATA的指針,該數(shù)據(jù)結(jié)構(gòu)包含下述成員:INT16U OSCntINT16U OSCnt 當(dāng)前信號(hào)量的計(jì)數(shù)值;INT8U OSEventTblOS_EVENT_TBL_SIZEINT8U OSEventTblOS_EVENT_TBL_SIZE 信號(hào)量等待隊(duì)列;一一INT8U OSEventGrpINT8U OSEventGrp 等待任務(wù)所在的組 嵌入式實(shí)時(shí)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 美發(fā)裝修合同協(xié)議書
- 解析紡織品評(píng)估中的數(shù)據(jù)處理試題及答案
- 協(xié)議書與合同書的區(qū)別
- 飯館工作人員合同協(xié)議書
- 共同合同協(xié)議書
- 甲方強(qiáng)行解除合同協(xié)議書
- 勞動(dòng)合同和培訓(xùn)協(xié)議書
- 租房房屋合同協(xié)議書
- 轉(zhuǎn)租公寓合同協(xié)議書
- 分房合同協(xié)議書
- 2023年山東省煙臺(tái)市中考?xì)v史真題卷(含答案與解析)
- 國(guó)開2023春《語(yǔ)言學(xué)概論》形考任務(wù)1-3+大作業(yè)參考答案
- 第七章第四節(jié)+俄羅斯第二課時(shí)課件人教版七年級(jí)地理下冊(cè)
- 大學(xué)生國(guó)家安全教育智慧樹知到答案章節(jié)測(cè)試2023年廣西科技大學(xué)
- 小兒雜?。ㄖ嗅t(yī)兒科學(xué)課件)
- 造紙操作規(guī)程6篇
- 叉車日常保養(yǎng)檢查記錄表
- YY/T 1544-2017環(huán)氧乙烷滅菌安全性和有效性的基礎(chǔ)保障要求
- GB/T 19582.3-2008基于Modbus協(xié)議的工業(yè)自動(dòng)化網(wǎng)絡(luò)規(guī)范第3部分:Modbus協(xié)議在TCP/IP上的實(shí)現(xiàn)指南
- GB/T 19228.1-2003不銹鋼卡壓式管件
- GA 1517-2018金銀珠寶營(yíng)業(yè)場(chǎng)所安全防范要求
評(píng)論
0/150
提交評(píng)論