第7章 任務的同步與通訊之信號量_第1頁
第7章 任務的同步與通訊之信號量_第2頁
第7章 任務的同步與通訊之信號量_第3頁
第7章 任務的同步與通訊之信號量_第4頁
第7章 任務的同步與通訊之信號量_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第第7章章 任務的同步與通信任務的同步與通信l基本概念lc/os-II的通訊方式互斥與同步互斥由資源共享 引起的即對于某個共享資源,如果一個任務正在使用,即對于某個共享資源,如果一個任務正在使用,則其他任務只能等待,等到該任務釋放該資源后,則其他任務只能等待,等到該任務釋放該資源后,等待的任務之一才能使用它,進程間的這種相互制等待的任務之一才能使用它,進程間的這種相互制約關系稱為約關系稱為互斥互斥 同步由合作引起同步由合作引起 相關的任務在執(zhí)行上要有先后次序,一個任務要相關的任務在執(zhí)行上要有先后次序,一個任務要等其伙伴發(fā)來通知,或建立了某個條件后才能繼續(xù)等其伙伴發(fā)來通知,或建立了某個條件后才能

2、繼續(xù)執(zhí)行,否則只能等待。執(zhí)行,否則只能等待。這種關系稱為進程這種關系稱為進程同步同步 并發(fā)任務之間必須建立一些制約關系。其中一種制約關系叫做直接制約關系,另一種制約關系叫做間接制約關系。通信 在多任務實時系統(tǒng)中,經(jīng)常需要在任務之間或者中斷服務之間進行傳遞消息,這種消息傳遞機制被稱為任務間的通信。傳遞消息的辦法:全局變量各種消息機制: 信號量 郵箱 消息隊列第第7章章 任務的同步與通信任務的同步與通信l基本概念lc/os-II的通訊方式c/os-II的通訊方式的通訊方式 信號量機制 互斥型信號量 信號量集機制 消息郵箱 消息隊列在c/os-II中,任務之間的通信是利用事件來實現(xiàn)的兩個任務使用事件

3、進行通信的示意圖事件事件任務任務1任務任務2發(fā)送事件請求事件每個事件用一個數(shù)據(jù)結構事件控制塊每個事件用一個數(shù)據(jù)結構事件控制塊ECB事件控制塊結構typedef struct INT8U OSEventType; /* 事件類型 */ INT8U OSEventGrp; /* 等待任務所在的組 */ INT16U OSEventCnt; /* 計數(shù)器(當事件是信號量時) */ void *OSEventPtr; /* 指向消息或者消息隊列的指針 */INT8U OSEventTblOS_EVENT_TBL_SIZE; /* 等待任務列表 */ OS_EVENT;定義在文件定義在文件c/os-II

4、.H中定義中定義事件類型OSEventType #define OS_EVENT_TYPE_UNUSED 0 #define OS_EVENT_TYPE_MBOX 1 #define OS_EVENT_TYPE_Q 2 #define OS_EVENT_TYPE_SEM 3 #define OS_EVENT_TYPE_MUTEX 4 #define OS_EVENT_TYPE_FLAG 5 消息郵箱消息郵箱消息隊列消息隊列信號量信號量互斥信號量互斥信號量信號量集信號量集 事件的等待任務列表事件的等待任務列表等待任務列表操作 列表中刪除一個任務的算法則正好相反,如下所示。if (pevent-O

5、SEventTblprio 3 &= OSMapTblprio & 0 x07) = 0) pevent-OSEventGrp &= OSMapTblprio 3; 等待任務列表中查找最高優(yōu)先級的任務程序清單如下。 y = OSUnMapTblpevent-OSEventGrp; x = OSUnMapTblpevent-OSEventTbly; prio = (y OSEventGrp |= OSMapTblprio 3; pevent-OSEventTblprio 3 |= OSMapTblprio & 0 x07;空事件控制塊鏈表空事件控制塊鏈表OS_CF

6、G.H 中的中的#define OS_MAX_EVENTS定義最大事件定義最大事件C/OS-II的初始化形成這個表對事件控制塊進行的操作一般包括:l初始化一個事件控制塊。l使一個任務進入就緒態(tài)。l使一個任務進入等待某事件的狀態(tài)。l因為等待超時而使一個任務進入就緒態(tài)。以上的操作都隱含在不同的通訊方式的操作中!以上的操作都隱含在不同的通訊方式的操作中!主要內(nèi)容 信號量機制 互斥型信號量 信號量集機制 消息郵箱 消息隊列C/OS-II信號量的數(shù)據(jù)結構typedef struct INT8U OSEventType; /* 事件類型 */ INT8U OSEventGrp; /* 等待任務所在的組 *

7、/ INT16U OSEventCnt; /* 計數(shù)器(當事件是信號量時) */ void *OSEventPtr; /* 指向消息或者消息隊列的指針 */INT8U OSEventTblOS_EVENT_TBL_SIZE; /* 等待任務列表 */ OS_EVENT;C/OS-II中的信號量由中的信號量由2部分組成:一部分是部分組成:一部分是16位的無符號整型信號量位的無符號整型信號量的計數(shù)值(的計數(shù)值(065535);另一部分由等待該信號量的任務組成的等待任務表。);另一部分由等待該信號量的任務組成的等待任務表。OS_EVENT_TYPE_SEMC/OS-II信號量信號量操作的函數(shù)操作的函

8、數(shù)lOSSemCreat()l OSSemDel()lOSSemPend()l OSSemPost()l OSSemQuery()lOSSemAccept()這些函數(shù)的使用須在OS_CFG.H中將配置常數(shù)OS_SEM_EN置為1。建立一個信號量,OSSemCreate() OSSemCreate()的原型如下:OS_EVENT *OSSemCreate(INT16U value); 參數(shù):value表示建立的信號量的初始值,可以是065535的任何值。 返回值:OSSemCreate()返回指向事件控制塊的指針。如果沒有可用的事件控制塊,OSSemCreate()函數(shù)返回空指針。舉例0 x00

9、0000000000000000000000000000000000000000000000000000000000000000OSEventTbl 任務等待表 一個剛創(chuàng)建且計數(shù)器初值為10的信號量NULL0 x000AOS_EVENT_TYPE_SEMpeventOSEventCntOSEventPtrOSEventGrpOSSemCreate(10)舉例 信號量的值是多少?信號量的值是多少? 有任務等待信號燈?如有任務等待信號燈?如果有,優(yōu)先級是多少?果有,優(yōu)先級是多少?C/OS-II信號量信號量操作的函數(shù)操作的函數(shù)lOSSemCreat()l OSSemDel()lOSSemPend()

10、l OSSemPost()l OSSemQuery()lOSSemAccept()這些函數(shù)的使用須在OS_CFG.H中將配置常數(shù)OS_SEM_EN置為1。刪除一個信號量,OSSemDel()OSSemDel()的函數(shù)原型如下:OS_EVENT *OSSemDel(OS_EVENT *pevent, INT8U opt, INT8U *err); 參數(shù):pevent,指向信號量的指針。 opt,該項定義信號量的刪除條件。若當?shù)却蝿毡碇幸褯]有等待任務時才刪除信號量,opt選擇OS_DEL_NO_PEND,若在等待任務表中無論是否有等待任務都立即刪除信號量,opt選擇OS_DEL_ALWAYS。

11、返回值:如果信號量已被刪除了,則返回空指針;若信號量沒能被刪除,則返回pevent。后一種情況下,應該查看出錯代碼,以查明原因。err, 指向包含錯誤碼的變量的指針。返回的錯誤碼可能為下述幾種之一。OS_NO_ERR,調(diào)用成功,信號量已被刪除。OS_ERR_DEL_ISR,試圖在中斷服務子程序中刪除信號量。OS_ERR_INVALID_OPT,沒有將opt參數(shù)定義為2種合法參數(shù)之一。OS_ERR_TASK_WAITING,有一個或一個以上的任務在等待信號量。OS_ERR_EVENT_TYPE,pevent不是指向信號量的指針。C/OS-II信號量信號量操作的函數(shù)操作的函數(shù)lOSSemCreat

12、()l OSSemDel()lOSSemPend()l OSSemPost()l OSSemQuery()lOSSemAccept()這些函數(shù)的使用須在OS_CFG.H中將配置常數(shù)OS_SEM_EN置為1。等待一個信號量,OSSemPend()OSSemPend()函數(shù)原型如下:void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );參數(shù):參數(shù): pevent:指向信號量的指針。:指向信號量的指針。 timeout:允許一個任務在經(jīng)過了指定數(shù)目的時鐘節(jié)拍后還沒有得到需要:允許一個任務在經(jīng)過了指定數(shù)目的時鐘節(jié)拍后還沒有得到需

13、要的信號量時恢復運行狀態(tài)。如果該值為的信號量時恢復運行狀態(tài)。如果該值為0則表示任務將持續(xù)的等待信號量。則表示任務將持續(xù)的等待信號量。最大的等待時間為最大的等待時間為65535個時鐘節(jié)拍。個時鐘節(jié)拍。 err: 指向包含錯誤碼的變量的指針OS_NO_ERR :信號量不為0。OS_TIMEOUT :信號量沒有在指定的周期數(shù)內(nèi)置起。OS_ERR_PEND_ISR :從中斷調(diào)用該函數(shù)。雖然規(guī)定了不允許從中斷調(diào)用該函數(shù),但C/OS-仍然包含了檢測這種情況的功能。OS_ERR_EVENT_TYPE :pevent 不是指向信號量的指針。C/OS-II信號量信號量操作的函數(shù)操作的函數(shù)lOSSemCreat(

14、)l OSSemDel()lOSSemPend()l OSSemPost()l OSSemQuery()lOSSemAccept()這些函數(shù)的使用須在OS_CFG.H中將配置常數(shù)OS_SEM_EN置為1。發(fā)出一個信號量OSSemPost() 參數(shù):pevent:指向信號量的指針 返回值:OS_NO_ERR :信號量成功的置起。OS_SEM_OVF :信號量的值溢出。OS_ERR_EVENT_TYPE :pevent 不是指向信號量的指針。OSSemPost()函數(shù)原型如下:INT8U OSSemPost(OS_EVENT *pevent);C/OS-II信號量信號量操作的函數(shù)操作的函數(shù)lOSS

15、emCreat()l OSSemDel()lOSSemPend()l OSSemPost()l OSSemQuery()lOSSemAccept()這些函數(shù)的使用須在OS_CFG.H中將配置常數(shù)OS_SEM_EN置為1。查詢一個信號量的當前狀態(tài),OSSemQuery()OSSemQuery()函數(shù)原型如下:INT8U OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata);參數(shù):pevent:一個指向信號量的指針。pdata:一個指向數(shù)據(jù)結構OS_SEM_DATA的指針,該數(shù)據(jù)結構包含下述域:INT16U OSCnt; /* 當前信號量標識號碼 */I

16、NT8U OSEventTblOS_EVENT_TBL_SIZE; /*信號量等待隊列*/INT8U OSEventGrp; 返回值:OS_NO_ERR 表示調(diào)用成功。OS_ERR_EVENT_TYPE 表示未向信號量傳遞指針。C/OS-II信號量信號量操作的函數(shù)操作的函數(shù)lOSSemCreat()l OSSemDel()lOSSemPend()l OSSemPost()l OSSemQuery()lOSSemAccept()這些函數(shù)的使用須在OS_CFG.H中將配置常數(shù)OS_SEM_EN置為1。無等待地請求一個信號量,OSSemAccept()OSSemAccept()函數(shù)原型如下:INT1

17、6U *OSSemAccept(OS_EVENT *pevent) 參數(shù):pevent:是指向需要查詢的設備的信號量。 返回值:當調(diào)用OSSemAccept()函數(shù)時,設備信號量的值大于零,說明設備就緒,這個值被返回調(diào)用者,設備信號量的值減1。如果調(diào)用OSSemAccept()函數(shù)時,設備信號量的值等于0,說明設備沒有就緒,返回0。舉例試編寫一個應用程序,其中有一個函數(shù)試編寫一個應用程序,其中有一個函數(shù)Fun( )和兩個任務和兩個任務(任務(任務MyTask( )與任務與任務YouTask( ))。應用程序中的兩個)。應用程序中的兩個任務都可以調(diào)用函數(shù)任務都可以調(diào)用函數(shù)Fun( ),但不能同時

18、調(diào)用。,但不能同時調(diào)用。#include “includes.h”#define TASK_STK_SIZE 512 /任務堆棧長度char *s1=“MyTask”; char *s2=“YouTask”;INT8U err; /用于退出的鍵INT8U y=0; /字符顯示位置INT16S key;OS_EVENT *Fun_Semp; /聲明信號量OS_STK StartTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū)OS_STK MyTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū)OS_STK YouTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū)vo

19、id Fun(INT8U x,INT8U y); /函數(shù)聲明void StartTask(void *data); /聲明起始任務void MyTask(void *data); /聲明任務void YouTask(void *data); /聲明任務/*主函數(shù)*/void main(void) OSInit(); /初始化c/os-II Fun_Semp=OSSemCreate(1); /定義信號量定義信號量 PC_DOSSaveReturn(); /保存DOS環(huán)境 PC_VectSet(uCOS,OSCtxSw); /安裝c/os-II中斷 OSTaskCreate(StartTask,

20、/創(chuàng)建任務StartTask (void *)0, /給任務傳遞參數(shù) &StartTaskStkTASK_STK_SIZE-1, /設置任務堆棧棧頂指針 0); /使任務的優(yōu)先級別為0 OSStart(); /啟動多任務管理/*任務StartTask*/void StartTask(void *pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; OS_ENTER_CRITICAL(); PC_VectSet(0 x08,OSTickISR); /安裝時鐘中斷向量 PC_SetTickRate(OS_TI

21、CKS_PER_SEC); /設置c/os-II時鐘頻率 OS_EXIT_CRITICAL(); OSStatInit(); /初始化統(tǒng)計任務 OSTaskCreate(MyTask, (void *)0, &MyTaskStkTASK_STK_SIZE-1, 1); OSTaskCreate(YouTask, (void *)0, &YouTaskStkTASK_STK_SIZE-1, 2); for( ; ; ) /如果按下ESC鍵,則退出c/os-II if(PC_GetKey(&key)=TRUE) if(key=0 x1B) PC_DOSReturn(); O

22、STimeDlyHMSM(0,0,3,0); /等待3s /*任務MyTask*/void MyTask(void *pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; for( ; ; ) OSSemPend(Fun_Semp,0,&err); /請求信號量 PC_DispStr(0,+y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE); Fun(7,y); /調(diào)用函數(shù)Fun( ) OSSemPost(Fun_Semp); /發(fā)送信號量 OSTimeDlyHMSM(0,0,

23、1,0); /等待1s P操作臨界區(qū)V操作/*任務YouTask*/void YouTask(void *pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; for( ; ; ) OSSemPend(Fun_Semp,0,&err); /請求信號量 PC_DispStr(0,+y2, s2, DISP_BGND_BLACK+DISP_FGND_WHITE); Fun(7,y); /調(diào)用函數(shù)Fun( ) OSSemPost(Fun_Semp); /發(fā)送信號量 OSTimeDlyHMSM(0,0,2,0);

24、 /等待2s P操作臨界區(qū)V操作/*Fun( )*/void Fun(INT8U x,INT8U y) PC_DispStr(x,y, “調(diào)用了Fun()函數(shù)”, DISP_BGND_BLACK+DISP_FGND_WHITE);/*END*/舉例應用程序中有一個函數(shù)應用程序中有一個函數(shù)Fun( ),如果想使任,如果想使任務務MyTask( )必須經(jīng)過任務必須經(jīng)過任務YouTask( )允許才允許才能調(diào)用這個函數(shù)一次,試寫出這兩個任務的能調(diào)用這個函數(shù)一次,試寫出這兩個任務的示意性代碼。示意性代碼。示意性代碼如下:OS_EVENT *Fun_Semp; /定義一個信號量void main(voi

25、d) /主函數(shù)main( ) Fun_Semp=OSSemCreate(0); /創(chuàng)建一個初值為0的信號量 void YouTask(void *pdata) /任務YouTask UINT8U err; OSSemPost(Fun_Semp); /發(fā)送信號量 void MyTask(void *pdata) /任務MyTask UINT8U err; OSSemPend(Fun_Semp,0,&err); /請求信號量 Fun( ); /調(diào)用函數(shù)Fun( ) 主要內(nèi)容 信號量機制 互斥型信號量 信號量集機制 消息郵箱 消息隊列信號量可以解決互斥,為什么還需要專門的互斥信號燈?優(yōu)先級反

26、轉(zhuǎn)l 在可剝奪型內(nèi)核中,當任務以獨占方式使用共享資源時在可剝奪型內(nèi)核中,當任務以獨占方式使用共享資源時,會出現(xiàn)低優(yōu)先級任務先于高優(yōu)先級任務而被運行的現(xiàn),會出現(xiàn)低優(yōu)先級任務先于高優(yōu)先級任務而被運行的現(xiàn)象,這種現(xiàn)象叫做象,這種現(xiàn)象叫做任務優(yōu)先級反轉(zhuǎn)任務優(yōu)先級反轉(zhuǎn)(priority inversion)舉例下面是一個使用信號量實現(xiàn)獨占式訪問共享下面是一個使用信號量實現(xiàn)獨占式訪問共享資源而出現(xiàn)了任務優(yōu)先級反轉(zhuǎn)的應用程序示資源而出現(xiàn)了任務優(yōu)先級反轉(zhuǎn)的應用程序示例。例。/*Test*/#include “includes.h”#define TASK_STK_SIZE 512 /任務堆棧長度OS_STK

27、StartTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū)OS_STK MyTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū)OS_STK YouTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū)OS_STK YouTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū)OS_STK HerTaskStkTASK_STK_SIZE; /定義任務堆棧區(qū)INT16S key;char *s1=“MyTask正在運行”; char *s2=“YouTask正在運行”;char *s3=“HerTask正在運行”;char *ss=“MyTask請求信號量”;INT

28、8U err; /用于退出的鍵INT8U y=0; /字符顯示位置INT32U Times;OS_EVENT *Semp; /定義事件控制塊void StartTask(void *data); /聲明起始任務void MyTask(void *data); /聲明任務void YouTask(void *data); /聲明任務void HerTask(void *data); /聲明任務/*主函數(shù)*/void main(void) OSInit(); /初始化c/os-II PC_DOSSaveReturn(); /保存DOS環(huán)境 PC_VectSet(uCOS,OSCtxSw); /安裝

29、c/os-II中斷 Semp=OSSemCreate(1); /定義信號量 OSTaskCreate(StartTask, (void *)0 &StartTaskStkTASK_STK_SIZE-1, 0); OSStart(); /啟動多任務管理/*任務StartTask*/void StartTask(void *pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; OS_ENTER_CRITICAL(); PC_VectSet(0 x08,OSTickISR); /安裝時鐘中斷向量 PC_SetT

30、ickRate(OS_TICKS_PER_SEC); /設置c/os-II時鐘頻率 OS_EXIT_CRITICAL(); OSStatInit(); /初始化統(tǒng)計任務 OSTaskCreate(MyTask, (void *)0, &MyTaskStkTASK_STK_SIZE-1, 3); OSTaskCreate(YouTask, (void *)0, &YouTaskStkTASK_STK_SIZE-1, 4); OSTaskCreate(HerTask, (void *)0, &HerTaskStkTASK_STK_SIZE-1, 5); for( ; ; )

31、 /如果按下ESC鍵,則退出c/os-II if(PC_GetKey(&key)=TRUE) if(key=0 x1B) PC_DOSReturn(); OSTimeDlyHMSM(0,0,3,0); /等待3s /*任務MyTask*/void MyTask(void *pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; for( ; ; ) OSTimeDlyHMSM(0,0,1,200); PC_DispStr(10,+y, ss, DISP_BGND_BLACK+DISP_FGND_WHITE)

32、; OSSemPend(Semp,0,&err); /請求信號量 PC_DispStr(10,+y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE); OSSemPost(semp); /發(fā)送信號量 OSTimeDlyHMSM(0,0,1,0); /等待1s /*任務YouTask*/void YouTask(void *pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata;for( ; ; ) PC_DispStr(10,+y, s2,DISP_BGND_BLACK+DISP_F

33、GND_WHITE); OSTimeDlyHMSM(0,0,0,300); /等待300ms /*任務HerTask*/void HerTask(void *pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; for( ; ; ) OSSemPend(Semp,0,&err); /請求信號量 PC_DispStr(10,+y s3, DISP_BGND_BLACK+DISP_FGND_WHITE); for(Times;Times20000000;Times+) /延時 OS_Sched( ); OSS

34、emPost(semp); /發(fā)送信號量 OSTimeDlyHMSM(0,0,1,0); /等待1s 優(yōu)先級反轉(zhuǎn)解決辦法 優(yōu)先級繼承協(xié)議(priority inheritance protocol) 優(yōu)先級天花板協(xié)議(priority ceiling protocol)優(yōu)先級繼承協(xié)議基本思想 當一個任務阻塞了一個或多個高優(yōu)先級任務時,該任務將不使用其原來的優(yōu)先級,而使用被該任務所阻塞的所有任務的最高優(yōu)先級作為其執(zhí)行臨界區(qū)的優(yōu)先級。 當該任務退出臨界區(qū)時,又恢復到其最初的優(yōu)先級。 優(yōu)先級反轉(zhuǎn)解決辦法 優(yōu)先級繼承協(xié)議(priority inheritance protocol) 優(yōu)先級天花板協(xié)議(

35、priority ceiling protocol)優(yōu)先級天花板協(xié)議 每個信號量有個優(yōu)先級天花板,為所有使用該信號量的任務的最高優(yōu)先級。 在優(yōu)先級天花板協(xié)議中,如果任務獲得信號量,則在任務執(zhí)行臨界區(qū)的過程中,任務的優(yōu)先級將被抬升到所獲得信號量的優(yōu)先級天花板。 C/OS-II采用這種采用這種C/OS-II的互斥型信號量數(shù)據(jù)結構由由3個元素組成:個元素組成: 1個標志,指示個標志,指示mutex是否可是否可以使用(以使用(0或或1) 1個優(yōu)先級,個優(yōu)先級,天花板天花板 1個等待該個等待該mutex的任務列表的任務列表0 xFF信號量表示可用信號量表示可用互斥型信號量的操作 OSMutexCreat

36、() OSMutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()建立一個互斥型信號量,OSMutexCreat()函數(shù)OSMutexCreat()的原型如下:OS_EVENT *OSMutexCreat(INT8U prio,INT8U *err); 參數(shù):prio: 優(yōu)先級天花板(PIP)。err:指向其出錯代碼的指針: OS_NO_ERR,調(diào)用成功,mutex已被成功地建立。 OS_ERR_CREAT_ISR,試圖在中斷服務子程序中建立mutex。 OS_PRIO_EXIST,優(yōu)先級為PIP的任

37、務已經(jīng)建立。 OS_ERR_PEVENT_NULL,已經(jīng)沒有OS_ENENT結構可以使用的了。 OS_PRIO_INVALID,定義的優(yōu)先級非法,其值大于OS_LOWEST_PRIO返回值:返回值:返回一個指針,該指針指向分配給返回一個指針,該指針指向分配給mutex的事件控制塊。如果得不到事件控制的事件控制塊。如果得不到事件控制塊,則返回一個空指針。塊,則返回一個空指針?;コ庑托盘柫康牟僮?OSMutexCreat() OSMutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()刪除一個互斥型信號量

38、,OSMutexDel()OSMutexDel()的原型如下:OS_EVENT *OSMutexDel(OS_EVENT *pevent, INT8U opt, INT8U *err);參數(shù):prevent:指向mutex的指針。opt: 該選項定義mutex的刪除條件??梢赃x擇只能在已經(jīng)沒有任何任務在等待該mutex時,才能刪除(OS_DEL_NO_PEND);或者,不管有沒有任務在等待這個mutex,立即刪除(OS_DEL_NO_ALWAYS),在這種情況下,所有等待mutex的任務都立即進入就緒態(tài)。err:指向其出錯代碼的指針。出錯代碼為以下值之一: OS_NO_ERR,調(diào)用成功,mut

39、ex已被刪除。 OS_ERR_DEL_ISR,試圖在中斷服務子程序中刪除mutex。 OS_ERR_INVALID_OPT,定義的opt參數(shù)無效,不是上面提到的2個參數(shù)之一。 OS_ERR_TASK_WAITING,定義了OS_DEL_NO_PEND,而有一個或一個以上的任務在等這個mutex。 OS_ERR_EVENT_TYPE,pevent不是指向mutex的指針。 OS_ERR_PEVENT_NULL,已經(jīng)沒有可以使用的OS_EVENT數(shù)據(jù)結構了。l 返回值:返回值:如果如果mutex已經(jīng)刪除,則返回空指針;如果已經(jīng)刪除,則返回空指針;如果mutex沒能刪沒能刪除,則返回除,則返回pev

40、ent互斥型信號量的操作 OSMutexCreat() OSMutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()等待一個互斥型信號量,OSMutexPend()函數(shù)OSMutexPend()的原型如下:void OSMutexPend(OS_EVENT *pevent,INT16U timeout,INT8U *err);參數(shù):prevent:指向mutex的指針。timeout:以時鐘節(jié)拍數(shù)目定義的等待超時時限。如果在這一時限中得不到mutex,任務將恢復執(zhí)行。Timeout的值為0,表示將無限

41、期地等待mutex。Timeout的最大值是65535個時鐘節(jié)拍。如果如果mutex被優(yōu)先級較低的任務占用了,那么被優(yōu)先級較低的任務占用了,那么OSMutexPend()()會將占用會將占用mutex的任務的優(yōu)先級提升到優(yōu)先級的任務的優(yōu)先級提升到優(yōu)先級天花板天花板。 err:指向其出錯代碼的指針。出錯代碼為以下值之一: OS_NO_ERR,調(diào)用成功,mutex可以使用。 OS_TIMEOUT,在定義的時限內(nèi)得不到mutex。 OS_ERR_EVENT_TYPE,用戶沒能向OSMutexPend()傳遞指向mutex的指針。 OS_ERR_PEVENT_NULL,pevent是空指針。 OS_E

42、RR_PEND_ISR,試圖在中斷服務子程序中獲得mutex?;コ庑托盘柫康牟僮?OSMutexCreat() OSMutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()釋放一個互斥型信號量, OSMutexPost()函數(shù)OSMutexPost()的原型如下:INT8U OSMutexPost(OS_EVENT *pevent)參數(shù): prevent:指向mutex的指針。 返回值:OS_NO_ERR,調(diào)用成功,mutex被釋放。OS_ERR_EVENT_TYPE,向OSMutexPost()傳遞

43、的不是指向mutex的指針。OS_ERR_PEVENT_NULL,pevent是空指針。OS_ERR_POST_ISR, 試圖在中斷服務子程序中調(diào)用。OS_ERR_NOT_MUTEX_OWNER,發(fā)出mutex的任務實際上并不占有mutex。互斥型信號量的操作 OSMutexCreat() OSMutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()無等待地請求一個信號量, OSMutexAccept()OSMutexAccept()的原型如下:INT8U OSMutexAccept(OS_EVENT *pevent, INT8U *err); 參數(shù): prevent:指向管理某資源的mutex。 err:指向以下出錯代碼之一: OS_NO_ERR,調(diào)用成功。 OS_ERR_EVENT_TYPE,pevent不是指向mutex類型的指針。 OS_ERR_PEVENT_NULL,pevent是空指針。 OS_ERR_PEND_ISR,在中斷服務子程序中調(diào)用OSMutexAccept()。 返回值: 如果mutex有效,OSMutexAc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論