消息邮箱:任务和任务之间传递数据,在存储器中建立一个数据缓冲区,用这个缓冲区进行数据通信。
如果把数据缓冲区的指针赋值给OSEventPtr,同时OSEventType为常数OS_EVENT_TYPE_MBOX,则该事件控制块就叫做消息邮箱。
1. 创建消息邮箱
函数原型:
OS_EVENT *OSMboxCreate( void *msg);//消息指针
返回值: 消息邮箱的指针,
2. 向消息邮箱发送消息
任务可以通过调用函数 OSMutexPost()向消息邮箱发送消息。函数原型:
INT8U OSMboxPost( OS_EVENT *pevent, void *msg);
msg为消息缓冲区的指针,
OSMboxPost(OS_EVENT *pevent, void *msg); // 消息邮箱指针
可以广播的形式向事件等待任务表中的所有任务发送消息:
INT8U OSMboxPostOpt( OS_EVENT *pevent, //消息邮箱指针
void *msg, //消息指针
INT8U opt);// 广播选项
opt= OS_POST_OPT_BROADCAST,则意味着把消息向所有等待任务广播。
= OS_POST_OPT_NONE,则把消息只向优先级别最高的等待任务发送。
3. 请求消息邮箱
当一个任务请求邮箱时需要调用函数OSMboxPend(),这个函数的主要作用就是查看邮箱指针OSEVENTPtr是否为NULL,
void * OSMboxPend(OS_EVENT *pevent, //请求消息邮箱指针
INT16U timeout,// 等待时限
INT8U *err);
任务在请求邮箱失败时也可以不进行等待继续运行。调用如下函数:
void *OSMboxAccept( OS_EVENT *pevent); // 消息邮箱指针
4.查询邮箱状态
任务可以调用函数OSMboxQuery()查询当前状态,并存放在OS_MBOX_DATA中。函数原型:
INT8U OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *pdata);
OS_MBOX_DATA:
typedef struct {
void *OSMsg;
INT8U OSEventTbl[OS_EVENT_TBL_SIZE];
INT8U OSEVENTGRP;
}OS_MBOX_DATA;
5. 删除邮箱
调用OSMboxDel删除一个邮箱,函数原型:
OS_EVENT *OSMBoxDel( OS_EVENT *pevent, //消息邮箱指针
INT8U opt, //删除选项
INT8U *err);