本文大部分内容来自任哲-嵌入式实时操作系统UC/OS-II原理及应用一书。
1、uC/OS把信号量、消息邮件和消息队列这类用于任务同步和通信的数据结构叫做事件;
2、对于等待事件任务的记录,uC/OS采用了与任务就绪表类似的方法,其使用一个8位类型的数组OSEventTbl[]作为记录等待事件的记录表,即等待任务表;同样也有相应的OSEventGrp表示等待任务表中的任务组;
3、任务控制块ECU,用来描述诸如信号量、邮箱和消息队列这些事件,其结构如下:
#if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
typedef struct {
INT8U OSEventType; /* Type of event control block (see OS_EVENT_TYPE_???) */
INT8U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
INT16U OSEventCnt; /* Semaphore Count (not used if other EVENT type) */
void *OSEventPtr; /* Pointer to message or queue structure */
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
} OS_EVENT;
#endif
应用程序中的任务通过指针pevent来访问事件控制块;
3、相对这几个事件,消息队列比较复杂,这里主要分析一下消息队列,其由三个部分组成:事件控制块、消息队列和消息。
消息队列相当于一个共用了任务等待列表的消息邮箱数组,事件控制块成员OSEventPtr指向一个叫做队列控制块(QS_Q)的结构,该结构管理一个数组MsgTbl[],该数组中的元素都是一些指向消息指针。
其相关的说明如下: