UCos-II事件的理解

在UCOS_II系统中,两个任务之间采用事件进行通讯。
UCos-II事件的理解

我们说的事件一般包括信号量、邮箱、消息或消息队列。事件在使用前需要先创建,而创建事件要用到事件控制块,这个事件控制块存储事件的信息。
UCos-II事件的理解
可以看出,创建事件本质上就是对这个结构体进行初始化。先来逐个弄清楚个成员所代表的意义,

INT8U OSEventType:代表事件类型,用8位无符号字符表示,具体定义如下UCos-II事件的理解

INT16U OSEventCNT:如果该事件是一个信号量,此项代表信号量计数值。信号量用来决定多个任务对某一共享资源的访问权限。比如初始化 OSSemPost的值为3,则最多3个任务占用该共享资源。
当某一个任务想要访问这个资源时。
1、创建信号量,用OSSemCreate函数。
2、请求信号量,用 OSSemPend 函数,如果此时OSEventCNT>0,则表示有空闲信号量可以使用,可以申请成功,相应的信号量计数器减1。如果OSEventCNT=0,表示该共享资源已被其他任务占用完,只能等待,等到其他任务解除占用并释放信号量时才能使用。
3、释放信号量,该任务结束占用共享资源时,要用 OSSemPost函数释放信号量。

*OSEventPtr:事件为邮箱时使用。任务之间传递数据(此数据称之为“消息”)时,可以在内存中创建一个消息缓冲区,这样传递消息只需传递消息指针*OSEventPtr,此指针的数据结构称之为邮箱。
1、创建邮箱,用 OSMboxCreate函数创建一个邮箱,该函数原型为:
OS_EVENT *OSMboxCreate (void *msg);
函数中的参数 msg 为消息的指针,函数的返回值为消息邮箱的指针。
2、向邮箱发送消息,调用OSMboxPost函数。
2、请求邮箱,调用函数 OSMboxPend,这个函数的主要作用就是查看邮
箱指针 OSEventPtr 是否为 NULL,如果不是 NULL 就把邮箱中的消息指针返回给调用函数的任务,同时用 OS_NO_ERR 通过函数的参数 err 通知任务获取消息成功;如果邮箱指针OSEventPtr 是 NULL,则使任务进入等待状态,并引发一次任务调度。

OSEventTb1[ ]:作为等待事件任务的记录表,即等待任务表,该位为“1”来表示这一位对应的任务为事件的等待任务,“0”不是等待任务。

OSEventGrp:等待事件的任务组。

UCos-II事件的理解

以下用一个信号量来举例说明OSEventTbl[]和OSEventGrp之间的关系。
UCos-II事件的理解

OSEventName:事件名