消息邮箱是一种通信机制,它能使任务或中断服务向另一个任务发送一个指针型的变量,这个指针指向一个包含指定“消息”的数据结构。消息邮箱发送的不是消息本身,而是消息的地址指针。使用消息邮箱之前,必须先建立消息邮箱,并且要指定指针的初始值。一般情况下,这个初始值是NULL,但也可以在初始化时,就使其在最开始就包含一条消息。
消息邮箱主要用于两种目的:① 通知一个事件的发生;② 作二值信号量用。
消息邮箱初始值的设置方法如下:
(1) 如果使用消息邮箱是用于通知一个事件的发生(发送一条消息),那么就要初始化该消息邮箱为NULL,因为在开始时,事件还没有发生。
(2) 如果作二值信号量用,即用于共享某些资源,那么就要初始化该消息邮箱为一个非NULL的指针。消息邮箱具有如下特点:
(1) 消息邮箱中的内容是一个指向消息的指针,指针指向的内容即是消息;
(2) 消息邮箱为满时,消息邮箱只包含一个指向消息的指针;消息邮箱为空时,消息邮箱的指针指向NULL;
(3) 消息邮箱只能接收和发送一则消息,消息邮箱为满时,将丢弃新消息,保留旧消息。
µC/OS-Ⅱ提供了七种对消息邮箱的操作,消息邮箱函数所属文件是OS_MBOX.C。
OSMboxPend()函数用于任务等待消息邮箱中的消息。任务或者中断发出的消息是指针型的变量,在不同的应用中消息的使用也可能不同。该函数具有如下特点:
- 如果调用时消息邮箱中已有消息,那么该消息被返回给调用者,并从消息邮箱中清除该消息。
- 调用时,如果消息邮箱中没有消息,则OSMboxPend()函数挂起当前任务直到得到需要的消息或等待超时期满。
- 该函数的调用者只能是任务,中断不能调用。
- OSMboxPend()函数返回接收的消息指针。
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
{
void *pmsg;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
#if OS_ARG_CHK_EN > 0
if (perr == (INT8U *)0) { /* Validate 'perr' */
return ((void *)0);
}
if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
*perr = OS_