uC/OS-II消息邮箱及其操作

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

uC/OS-II消息邮箱及其操作_第1张图片

一. 消息邮箱的操作

1. 创建消息邮箱
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...
有可能邮箱发多次,才收了一次;也有可能发了一次,却收了多次。

你可能感兴趣的:(uC/OS-II消息邮箱及其操作)