如果要在任务与任务之间传递一个数据,可以用消息邮箱,它的原理是在存储器中建立一个数据缓冲区,然后就以这个缓冲区为中介来实现任务间的数据传递。
有可能邮箱发多次,才收了一次;也有可能发了一次,却收了多次。

一. 消息邮箱的操作
OS_EVENT *OSMboxCreate (void *msg);
调用此函数须先定义msg的初始值,在一般的情况下,这个初始值为NULL;但也可以事先定义一个邮箱,然后把邮箱指针做为参数。
2. 向消息邮箱发送消息
INT8U OSMboxPost (OS_EVENT *pevent, void *msg);
//该函数可以以广播的方式向事件等待任务表中的所有任务发送消息
//OS_POST_OPT_BROADCAST 把消息向所有等待任务发送
//OS_POST_OPT_NONE 只向优先级最高的等待任务发送
INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg, INT8U opt);
3. 请求消息邮箱
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);
它的主要作用是查看邮箱指针OSEventPtr是否为NULL。如果不是NULL,则把邮箱中的消息指针返回给调用函数的任务;如果为NULL时,则使任务进行等待状态,并引发一次任务高度。
4. 查询邮箱的状态
INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata);
把相关信息存放在一个结构OS_MBOX_DATA中。
5. 删除邮箱
OS_EVENT *OSMboxDel (OS_EVENT *pevent, INT8U opt, INT8U *err);
二. 例子:
/* 创建邮箱 */
Str_Box = OSMboxCreate((void*)0);
/* MyTask 任务 */
void MyTask(void *pdata)
{
for (;;)
{
sprintf(s, "%d", Times);
OSMboxPost(Str_Box, s);
Times++;
OSTimeDlyHMSM(0,0,1,0); /* 等待1s */
}
}
/* YouTask 任务 */
void YouTask(void *pdata)
{
for (;;)
{
ss = OSMboxPend(Str_Box, 10, &err);
PC_DispStr(10,++y, /* 字符的显示位置 */
ss, /* 被显示的字符 */
DISP_BGND_BLACK+DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,1,0); /* 等待1s */
}
}当然例子是有问题的,首先如果任务不是交替调度的话,显示的内容就可能不是顺序的0,1,2,3.4...
有可能邮箱发多次,才收了一次;也有可能发了一次,却收了多次。
消息邮箱在任务间数据传递的应用与实例解析
本文详细介绍了消息邮箱的概念及其在任务间数据传递中的操作方法,包括创建邮箱、发送消息、请求消息、查询邮箱状态及删除邮箱等关键步骤。并通过一个具体的例子演示了如何使用消息邮箱实现任务间的数据交互。尽管示例存在调度问题,但展示了消息邮箱的基本用法。

1962

被折叠的 条评论
为什么被折叠?



