1. 消息邮箱Mbox
Mbox用于多任务间单一消息的传递,uC/OS-II使用ECB管理Mbox的基本信息,OSEventPtr指向创建Mbox时指定的内存空间。事件的创建由具体的事件管理程序实现。主要包含在C源文件OS_MBOX.C中。
- OS_EVENT *OSMboxCreate(void *msg);
- void *OSMboxPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
- void *OSMboxAccept(OS_EVENT *pevent);
- INT8U OSMboxPost(OS_EVENT *pevent, void *msg);
- INT8U OSMboxPostOpt(OS_EVENT *pevent, void *msg, INT8U opt);
- OS_EVENT *OSMboxDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
- INT8U OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *);
2. 消息队列msgQ
(1) msgQ基本内容
msgQ是uC/OS-II任务间通信的机制,可实现多条消息传递,即可以同时存储多条消息。uC/OS-II使用循环队列管理机制。主要包含在C源文件OS_Q.C中。
msgQ管理:使用指针数组存储所有消息的位置;使用QCB标识指针数组中消息的基本信息;使用ECB管理整个msgQ。QCB在编译时分配空间,即当前系统中可用的msgQ个数是预先设置的,系统运行时不能修改。
(2) msgQ全局变量
- OS_EXT OS_Q *OSQTbl[OS_MAX_QS]; //QCB结构体数组
- OS_EXT OS_Q *OSQFreeList; //空闲QCB头指针
- typedef struct os_q{ //消息队列控制块
struct os_q *OSQPtr; //用于构建空闲QCB链表
void **OSQStart; //指向msgQ指针数组的起始位置
void **OSQEnd; //指向msgQ指针数组的结束位置
void **OSQIn; //指向msgQ指针数组下一个可以插入消息的位置
void **OSQOut; //指向msgQ指针数组下一个可以读出消息的位置
INT16U OSQSize; //msgQ指针数组的大小
INT16U OSQEntries; //msgQ指针数组当前可以读取的消息个数