第7章任务的同步与通讯之信号量_第1页
第7章任务的同步与通讯之信号量_第2页
第7章任务的同步与通讯之信号量_第3页
第7章任务的同步与通讯之信号量_第4页
第7章任务的同步与通讯之信号量_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章 任务的同步与通信l基本概念lc/os-II的通讯方式互斥与同步互斥由资源共享 引起的即对于某个共享资源,如果一个任务正在使用,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源后,则其他任务只能等待,等到该任务释放该资源后,等待的任务之一才能使用它,进程间的这种相互制等待的任务之一才能使用它,进程间的这种相互制约关系称为约关系称为互斥互斥 同步由合作引起同步由合作引起 相关的任务在执行上要有先后次序,一个任务要相关的任务在执行上要有先后次序,一个任务要等其伙伴发来通知,或建立了某个条件后才能继续等其伙伴发来通知,或建立了某个条件后才能继续执行,否则只能等

2、待。执行,否则只能等待。这种关系称为进程这种关系称为进程同步同步 并发任务之间必须建立一些制约关系。其中一种制约关系叫做直接制约关系,另一种制约关系叫做间接制约关系。通信 在多任务实时系统中,经常需要在任务之间或者中断服务之间进行传递消息,这种消息传递机制被称为任务间的通信。传递消息的办法:全局变量各种消息机制: 信号量 邮箱 消息队列第7章 任务的同步与通信l基本概念lc/os-II的通讯方式c/os-II的通讯方式 信号量机制 互斥型信号量 信号量集机制 消息邮箱 消息队列在c/os-II中,任务之间的通信是利用事件来实现的两个任务使用事件进行通信的示意图事件事件任务任务1任务任务2发送事

3、件请求事件每个事件用一个数据结构事件控制块每个事件用一个数据结构事件控制块ECB事件控制块结构typedef struct INT8U OSEventType; /* 事件类型 */ INT8U OSEventGrp; /* 等待任务所在的组 */ INT16U OSEventCnt; /* 计数器(当事件是信号量时) */ void *OSEventPtr; /* 指向消息或者消息队列的指针 */INT8U OSEventTblOS_EVENT_TBL_SIZE; /* 等待任务列表 */ OS_EVENT;定义在文件定义在文件c/os-II.H中定义中定义事件类型OSEventType #

4、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-OSEventTblprio 3 &= OS

5、MapTblprio & 0 x07) = 0) pevent-OSEventGrp &= OSMapTblprio 3; 等待任务列表中查找最高优先级的任务程序清单如下。 y = OSUnMapTblpevent-OSEventGrp; x = OSUnMapTblpevent-OSEventTbly; prio = (y OSEventGrp |= OSMapTblprio 3; pevent-OSEventTblprio 3 |= OSMapTblprio & 0 x07;空事件控制块链表空事件控制块链表OS_CFG.H 中的中的#define OS_MAX_EV

6、ENTS定义最大事件定义最大事件C/OS-II的初始化形成这个表对事件控制块进行的操作一般包括:l初始化一个事件控制块。l使一个任务进入就绪态。l使一个任务进入等待某事件的状态。l因为等待超时而使一个任务进入就绪态。以上的操作都隐含在不同的通讯方式的操作中!以上的操作都隐含在不同的通讯方式的操作中!主要内容 信号量机制 互斥型信号量 信号量集机制 消息邮箱 消息队列C/OS-II信号量的数据结构typedef struct INT8U OSEventType; /* 事件类型 */ INT8U OSEventGrp; /* 等待任务所在的组 */ INT16U OSEventCnt; /* 计

7、数器(当事件是信号量时) */ void *OSEventPtr; /* 指向消息或者消息队列的指针 */INT8U OSEventTblOS_EVENT_TBL_SIZE; /* 等待任务列表 */ OS_EVENT;C/OS-II中的信号量由中的信号量由2部分组成:一部分是部分组成:一部分是16位的无符号整型信号量位的无符号整型信号量的计数值(的计数值(065535);另一部分由等待该信号量的任务组成的等待任务表。);另一部分由等待该信号量的任务组成的等待任务表。OS_EVENT_TYPE_SEMC/OS-II信号量信号量操作的函数操作的函数lOSSemCreat()l OSSemDel(

8、)lOSSemPend()l OSSemPost()l OSSemQuery()lOSSemAccept()这些函数的使用须在OS_CFG.H中将配置常数OS_SEM_EN置为1。建立一个信号量,OSSemCreate() OSSemCreate()的原型如下:OS_EVENT *OSSemCreate(INT16U value); 参数:value表示建立的信号量的初始值,可以是065535的任何值。 返回值:OSSemCreate()返回指向事件控制块的指针。如果没有可用的事件控制块,OSSemCreate()函数返回空指针。举例0 x000000000000000000000000000

9、000000000000000000000000000000000000000OSEventTbl 任务等待表 一个刚创建且计数器初值为10的信号量NULL0 x000AOS_EVENT_TYPE_SEMpeventOSEventCntOSEventPtrOSEventGrpOSSemCreate(10)举例 信号量的值是多少?信号量的值是多少? 有任务等待信号灯?如有任务等待信号灯?如果有,优先级是多少?果有,优先级是多少?C/OS-II信号量信号量操作的函数操作的函数lOSSemCreat()l OSSemDel()lOSSemPend()l OSSemPost()l OSSemQuery

10、()lOSSemAccept()这些函数的使用须在OS_CFG.H中将配置常数OS_SEM_EN置为1。删除一个信号量,OSSemDel()OSSemDel()的函数原型如下:OS_EVENT *OSSemDel(OS_EVENT *pevent, INT8U opt, INT8U *err); 参数:pevent,指向信号量的指针。 opt,该项定义信号量的删除条件。若当等待任务表中已没有等待任务时才删除信号量,opt选择OS_DEL_NO_PEND,若在等待任务表中无论是否有等待任务都立即删除信号量,opt选择OS_DEL_ALWAYS。 返回值:如果信号量已被删除了,则返回空指针;若信号

11、量没能被删除,则返回pevent。后一种情况下,应该查看出错代码,以查明原因。err, 指向包含错误码的变量的指针。返回的错误码可能为下述几种之一。OS_NO_ERR,调用成功,信号量已被删除。OS_ERR_DEL_ISR,试图在中断服务子程序中删除信号量。OS_ERR_INVALID_OPT,没有将opt参数定义为2种合法参数之一。OS_ERR_TASK_WAITING,有一个或一个以上的任务在等待信号量。OS_ERR_EVENT_TYPE,pevent不是指向信号量的指针。C/OS-II信号量信号量操作的函数操作的函数lOSSemCreat()l OSSemDel()lOSSemPend(

12、)l OSSemPost()l OSSemQuery()lOSSemAccept()这些函数的使用须在OS_CFG.H中将配置常数OS_SEM_EN置为1。等待一个信号量,OSSemPend()OSSemPend()函数原型如下:void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );参数:参数: pevent:指向信号量的指针。:指向信号量的指针。 timeout:允许一个任务在经过了指定数目的时钟节拍后还没有得到需要:允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的信号量时恢复运行状态。如果该值为的信号量时恢复

13、运行状态。如果该值为0则表示任务将持续的等待信号量。则表示任务将持续的等待信号量。最大的等待时间为最大的等待时间为65535个时钟节拍。个时钟节拍。 err: 指向包含错误码的变量的指针OS_NO_ERR :信号量不为0。OS_TIMEOUT :信号量没有在指定的周期数内置起。OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断调用该函数,但C/OS-仍然包含了检测这种情况的功能。OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针。C/OS-II信号量信号量操作的函数操作的函数lOSSemCreat()l OSSemDel()lOSSemPend()

14、l OSSemPost()l OSSemQuery()lOSSemAccept()这些函数的使用须在OS_CFG.H中将配置常数OS_SEM_EN置为1。发出一个信号量OSSemPost() 参数:pevent:指向信号量的指针 返回值:OS_NO_ERR :信号量成功的置起。OS_SEM_OVF :信号量的值溢出。OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针。OSSemPost()函数原型如下:INT8U OSSemPost(OS_EVENT *pevent);C/OS-II信号量信号量操作的函数操作的函数lOSSemCreat()l OSSemDel()lOSS

15、emPend()l OSSemPost()l OSSemQuery()lOSSemAccept()这些函数的使用须在OS_CFG.H中将配置常数OS_SEM_EN置为1。查询一个信号量的当前状态,OSSemQuery()OSSemQuery()函数原型如下:INT8U OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata);参数:pevent:一个指向信号量的指针。pdata:一个指向数据结构OS_SEM_DATA的指针,该数据结构包含下述域:INT16U OSCnt; /* 当前信号量标识号码 */INT8U OSEventTblOS_EVENT_T

16、BL_SIZE; /*信号量等待队列*/INT8U OSEventGrp; 返回值:OS_NO_ERR 表示调用成功。OS_ERR_EVENT_TYPE 表示未向信号量传递指针。C/OS-II信号量信号量操作的函数操作的函数lOSSemCreat()l OSSemDel()lOSSemPend()l OSSemPost()l OSSemQuery()lOSSemAccept()这些函数的使用须在OS_CFG.H中将配置常数OS_SEM_EN置为1。无等待地请求一个信号量,OSSemAccept()OSSemAccept()函数原型如下:INT16U *OSSemAccept(OS_EVENT

17、*pevent) 参数:pevent:是指向需要查询的设备的信号量。 返回值:当调用OSSemAccept()函数时,设备信号量的值大于零,说明设备就绪,这个值被返回调用者,设备信号量的值减1。如果调用OSSemAccept()函数时,设备信号量的值等于0,说明设备没有就绪,返回0。举例试编写一个应用程序,其中有一个函数试编写一个应用程序,其中有一个函数Fun( )和两个任务和两个任务(任务(任务MyTask( )与任务与任务YouTask( ))。应用程序中的两个)。应用程序中的两个任务都可以调用函数任务都可以调用函数Fun( ),但不能同时调用。,但不能同时调用。#include “inc

18、ludes.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; /定义任务堆栈区OS_STK MyTaskStkTASK_STK_SIZE; /定义任务堆栈区OS_STK YouTaskStkTASK_STK_SIZE; /定义任务堆栈区void Fun(INT8U x,INT8U y);

19、/函数声明void StartTask(void *data); /声明起始任务void MyTask(void *data); /声明任务void YouTask(void *data); /声明任务/*主函数*/void main(void) OSInit(); /初始化c/os-II Fun_Semp=OSSemCreate(1); /定义信号量 PC_DOSSaveReturn(); /保存DOS环境 PC_VectSet(uCOS,OSCtxSw); /安装c/os-II中断 OSTaskCreate(StartTask, /创建任务StartTask (void *)0, /给任务

20、传递参数 &StartTaskStkTASK_STK_SIZE-1, /设置任务堆栈栈顶指针 0); /使任务的优先级别为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_TICKS_PER_SEC); /设置c/os-II时钟频率 O

21、S_EXIT_CRITICAL(); OSStatInit(); /初始化统计任务 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(); OSTimeDlyHMSM(0,0,3,0); /等待3s /

22、*任务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); /调用函数Fun( ) OSSemPost(Fun_Semp); /发送信号量 OSTimeDlyHMSM(0,0,1,0); /等待1s P操作临界区V操作/*任务YouTa

23、sk*/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); /调用函数Fun( ) OSSemPost(Fun_Semp); /发送信号量 OSTimeDlyHMSM(0,0,2,0); /等待2s P操作临界区V操作/*Fun( )*/void

24、 Fun(INT8U x,INT8U y) PC_DispStr(x,y, “调用了Fun()函数”, DISP_BGND_BLACK+DISP_FGND_WHITE);/*END*/举例应用程序中有一个函数应用程序中有一个函数Fun( ),如果想使任,如果想使任务务MyTask( )必须经过任务必须经过任务YouTask( )允许才允许才能调用这个函数一次,试写出这两个任务的能调用这个函数一次,试写出这两个任务的示意性代码。示意性代码。示意性代码如下:OS_EVENT *Fun_Semp; /定义一个信号量void main(void) /主函数main( ) Fun_Semp=OSSemC

25、reate(0); /创建一个初值为0的信号量 void YouTask(void *pdata) /任务YouTask UINT8U err; OSSemPost(Fun_Semp); /发送信号量 void MyTask(void *pdata) /任务MyTask UINT8U err; OSSemPend(Fun_Semp,0,&err); /请求信号量 Fun( ); /调用函数Fun( ) 主要内容 信号量机制 互斥型信号量 信号量集机制 消息邮箱 消息队列信号量可以解决互斥,为什么还需要专门的互斥信号灯?优先级反转l 在可剥夺型内核中,当任务以独占方式使用共享资源时在可剥

26、夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现,会出现低优先级任务先于高优先级任务而被运行的现象,这种现象叫做象,这种现象叫做任务优先级反转任务优先级反转(priority inversion)举例下面是一个使用信号量实现独占式访问共享下面是一个使用信号量实现独占式访问共享资源而出现了任务优先级反转的应用程序示资源而出现了任务优先级反转的应用程序示例。例。/*Test*/#include “includes.h”#define TASK_STK_SIZE 512 /任务堆栈长度OS_STK StartTaskStkTASK_STK_SIZE; /定义

27、任务堆栈区OS_STK MyTaskStkTASK_STK_SIZE; /定义任务堆栈区OS_STK YouTaskStkTASK_STK_SIZE; /定义任务堆栈区OS_STK YouTaskStkTASK_STK_SIZE; /定义任务堆栈区OS_STK HerTaskStkTASK_STK_SIZE; /定义任务堆栈区INT16S key;char *s1=“MyTask正在运行”; char *s2=“YouTask正在运行”;char *s3=“HerTask正在运行”;char *ss=“MyTask请求信号量”;INT8U err; /用于退出的键INT8U y=0; /字符显

28、示位置INT32U Times;OS_EVENT *Semp; /定义事件控制块void StartTask(void *data); /声明起始任务void MyTask(void *data); /声明任务void YouTask(void *data); /声明任务void HerTask(void *data); /声明任务/*主函数*/void main(void) OSInit(); /初始化c/os-II PC_DOSSaveReturn(); /保存DOS环境 PC_VectSet(uCOS,OSCtxSw); /安装c/os-II中断 Semp=OSSemCreate(1);

29、 /定义信号量 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_SetTickRate(OS_TICKS_PER_SEC); /设置

30、c/os-II时钟频率 OS_EXIT_CRITICAL(); OSStatInit(); /初始化统计任务 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( ; ; ) /如果按下ESC键,则退出c/os-II if(PC_Ge

31、tKey(&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); OSSemPend(Semp,0,&err);

32、/请求信号量 PC_DispStr(10,+y, s1, DISP_BGND_BLACK+DISP_FGND_WHITE); OSSemPost(semp); /发送信号量 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_FGND_WHITE); OSTimeDlyHMSM(0,0,

33、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( ); OSSemPost(semp); /发送信号量 OSTimeDly

34、HMSM(0,0,1,0); /等待1s 优先级反转解决办法 优先级继承协议(priority inheritance protocol) 优先级天花板协议(priority ceiling protocol)优先级继承协议基本思想 当一个任务阻塞了一个或多个高优先级任务时,该任务将不使用其原来的优先级,而使用被该任务所阻塞的所有任务的最高优先级作为其执行临界区的优先级。 当该任务退出临界区时,又恢复到其最初的优先级。 优先级反转解决办法 优先级继承协议(priority inheritance protocol) 优先级天花板协议(priority ceiling protocol)优先级天

35、花板协议 每个信号量有个优先级天花板,为所有使用该信号量的任务的最高优先级。 在优先级天花板协议中,如果任务获得信号量,则在任务执行临界区的过程中,任务的优先级将被抬升到所获得信号量的优先级天花板。 C/OS-II采用这种采用这种C/OS-II的互斥型信号量数据结构由由3个元素组成:个元素组成: 1个标志,指示个标志,指示mutex是否可是否可以使用(以使用(0或或1) 1个优先级,个优先级,天花板天花板 1个等待该个等待该mutex的任务列表的任务列表0 xFF信号量表示可用信号量表示可用互斥型信号量的操作 OSMutexCreat() OSMutexDel() OSMutexPend()

36、, OSMutexPost() , OSMutexAccept() , OSMutexQuery()建立一个互斥型信号量,OSMutexCreat()函数OSMutexCreat()的原型如下:OS_EVENT *OSMutexCreat(INT8U prio,INT8U *err); 参数:prio: 优先级天花板(PIP)。err:指向其出错代码的指针: OS_NO_ERR,调用成功,mutex已被成功地建立。 OS_ERR_CREAT_ISR,试图在中断服务子程序中建立mutex。 OS_PRIO_EXIST,优先级为PIP的任务已经建立。 OS_ERR_PEVENT_NULL,已经没有

37、OS_ENENT结构可以使用的了。 OS_PRIO_INVALID,定义的优先级非法,其值大于OS_LOWEST_PRIO返回值:返回值:返回一个指针,该指针指向分配给返回一个指针,该指针指向分配给mutex的事件控制块。如果得不到事件控制的事件控制块。如果得不到事件控制块,则返回一个空指针。块,则返回一个空指针。互斥型信号量的操作 OSMutexCreat() OSMutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()删除一个互斥型信号量,OSMutexDel()OSMutexDel()的原型如下

38、:OS_EVENT *OSMutexDel(OS_EVENT *pevent, INT8U opt, INT8U *err);参数:prevent:指向mutex的指针。opt: 该选项定义mutex的删除条件。可以选择只能在已经没有任何任务在等待该mutex时,才能删除(OS_DEL_NO_PEND);或者,不管有没有任务在等待这个mutex,立即删除(OS_DEL_NO_ALWAYS),在这种情况下,所有等待mutex的任务都立即进入就绪态。err:指向其出错代码的指针。出错代码为以下值之一: OS_NO_ERR,调用成功,mutex已被删除。 OS_ERR_DEL_ISR,试图在中断服务

39、子程序中删除mutex。 OS_ERR_INVALID_OPT,定义的opt参数无效,不是上面提到的2个参数之一。 OS_ERR_TASK_WAITING,定义了OS_DEL_NO_PEND,而有一个或一个以上的任务在等这个mutex。 OS_ERR_EVENT_TYPE,pevent不是指向mutex的指针。 OS_ERR_PEVENT_NULL,已经没有可以使用的OS_EVENT数据结构了。l 返回值:返回值:如果如果mutex已经删除,则返回空指针;如果已经删除,则返回空指针;如果mutex没能删没能删除,则返回除,则返回pevent互斥型信号量的操作 OSMutexCreat() OS

40、MutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()等待一个互斥型信号量,OSMutexPend()函数OSMutexPend()的原型如下:void OSMutexPend(OS_EVENT *pevent,INT16U timeout,INT8U *err);参数:prevent:指向mutex的指针。timeout:以时钟节拍数目定义的等待超时时限。如果在这一时限中得不到mutex,任务将恢复执行。Timeout的值为0,表示将无限期地等待mutex。Timeout的最大值是65535个时钟

41、节拍。如果如果mutex被优先级较低的任务占用了,那么被优先级较低的任务占用了,那么OSMutexPend()()会将占用会将占用mutex的任务的优先级提升到优先级的任务的优先级提升到优先级天花板天花板。 err:指向其出错代码的指针。出错代码为以下值之一: OS_NO_ERR,调用成功,mutex可以使用。 OS_TIMEOUT,在定义的时限内得不到mutex。 OS_ERR_EVENT_TYPE,用户没能向OSMutexPend()传递指向mutex的指针。 OS_ERR_PEVENT_NULL,pevent是空指针。 OS_ERR_PEND_ISR,试图在中断服务子程序中获得mutex

42、。互斥型信号量的操作 OSMutexCreat() OSMutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()释放一个互斥型信号量, OSMutexPost()函数OSMutexPost()的原型如下:INT8U OSMutexPost(OS_EVENT *pevent)参数: prevent:指向mutex的指针。 返回值:OS_NO_ERR,调用成功,mutex被释放。OS_ERR_EVENT_TYPE,向OSMutexPost()传递的不是指向mutex的指针。OS_ERR_PEVENT_NU

43、LL,pevent是空指针。OS_ERR_POST_ISR, 试图在中断服务子程序中调用。OS_ERR_NOT_MUTEX_OWNER,发出mutex的任务实际上并不占有mutex。互斥型信号量的操作 OSMutexCreat() OSMutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()无等待地请求一个信号量, OSMutexAccept()OSMutexAccept()的原型如下:INT8U OSMutexAccept(OS_EVENT *pevent, INT8U *err); 参数: pre

44、vent:指向管理某资源的mutex。 err:指向以下出错代码之一: OS_NO_ERR,调用成功。 OS_ERR_EVENT_TYPE,pevent不是指向mutex类型的指针。 OS_ERR_PEVENT_NULL,pevent是空指针。 OS_ERR_PEND_ISR,在中断服务子程序中调用OSMutexAccept()。 返回值: 如果mutex有效,OSMutexAccept()函数则返回1,如果mutex被其他任务占用,OSMutexAccept()则返回0。互斥型信号量的操作 OSMutexCreat() OSMutexDel() OSMutexPend() , OSMutexPost() , OSMutexAccept() , OSMutexQuery()获取

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论