uC/OS的消息邮箱使用经验

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://zhuge.blog.csdn.net/article/details/55261344

uC/OS下任务之间通信的方式之一有消息邮箱,使用消息邮箱有两种方式:

(1)数据的存放

(2)传递指向一个数据的指针,就是传递多个数据。

 经验小结如下:

一、数据存放,存放单个数据

邮箱可以传递任何类型数据,在传递时,先将数据用(void*)进行类型变化,变为void*这种万用类型,而在接收邮箱数据时,再还原为本身的数据类型,举例如下:

OSMboxPost(Mbox,(void*)key_value);

其中key_value是一个字符型变量,该变量的类型为INT8U,先转换为(void*),在接收消息端

key = (INT8U)OSMboxPend(Mbox,0,&err);

其中key为INT8U格式,注意在OSMboxPend前面增加了类型转换(INT8U)


二、传递指针

       发送:OSMboxPost(Mbox,(void*)SendData);

接收:data_ptr = (INT8U*)OSMboxPend(Mbox,0,&err);

其中SendData为传递的数据名称,data_ptr为接收数据指针。


另外:邮箱中不能存放传递0值,因为把一个0值放入邮箱,经过void *类型变化后,变成了void *0,而判断邮箱中是否有数据正是通过判断邮箱中指向Message的指针是否为0来判断,这样虽然放入了一个0变量,但邮箱中却无法判断这个0值,认为邮箱中还是空。


还有就是,在执行一次OSMboxPend后,会将邮箱清空,只有下次有新的数据到邮箱后,才能等到数据,这一点与现实中的邮箱email是类似的,一旦查看新邮件后,在新邮件序列中,就没有了该次新邮件提醒了,这一点,在OSMboxPend函数中也有体现:

 OS_ENTER_CRITICAL();
    pmsg = pevent->OSEventPtr;
    if (pmsg != (void *)0) 

{                                     /* See if there is already a message*/
        pevent->OSEventPtr = (void *)0;           /* Clear the mailbox(清除邮箱)*/
        OS_EXIT_CRITICAL();


展开阅读全文

没有更多推荐了,返回首页