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();
新闻热点
疑难解答