目录
邮箱用于进程间通信,不同于之前的互斥量,信号量和事件,邮箱具有数据交互功能。RTT的邮箱中每一封邮件只能容纳 固定的4字节内容 (针对32位处理系统,指针的大小即为4个字节,所以一封邮件恰好能够容纳一个指针),并且具备一定的存储功能,能够缓存一定数量的邮件数。
1. 创建
#define rtosMailboxCreate( \
handle, \
name, \
size, \
flag \
) \
{ \
handle = rt_mb_create(name, size, flag); \
}
参数size是邮箱支持的最大邮件数(分配给该邮箱的内存大小为size * 4)。参数flag同之前的定义,FIFO或PRIO。
handle的宏定义:
#define rtosMailbox_t rt_mailbox_t
2. 删除
#define rtosMailboxDelete( \
handle \
) \
{ \
rt_mb_delete(handle); \
}
3. 发送
#define rtosMailboxSend( \
handle, \
value, \
timeout \
) \
{ \
rt_mb_send_wait(handle, (uint32_t)&value, \
timeout); \
}
RT Thread有2个发送函数,这里选择带超时参数的,另外一个其实就是timeout = 0。
参数value是邮件内容,32位的变量,注意发送的是变量的地址。
4. 接收
#define rtosMailboxReceive( \
handle, \
value, \
timeout, \
ret \
) \
{ \
ret = rt_mb_recv(handle, (rt_uint32_t *)&value, \
timeout); \
}
参数value是返回值,即接收到的邮件内容,也是变量的地址。
返回0表示接收到邮件。
5. 实例
2个进程,一个发送邮件,一个接收邮件。
static rtosMailbox_t mailbox = NULL;
static void threadMailboxReceive(void *parameter)
{
while(1)
{
char *str;
uint32_t ret;
rtosMailboxReceive(mailbox, str, RTOS_WAIT_FOREVER, ret);
if(ret == RTOS_EOK)
{
Printf("Got a mail:%s\n", str);
rtosThreadSleep(100);
}
}
}
static void threadMailboxSend(void *parameter)
{
while(1)
{
char str1[] = "I'm a mail";
char str2[] = "I'm another mail";
Printf("Send a mail:%s\n", str1);
rtosMailboxSend(mailbox, str1, RTOS_WAIT_FOREVER);
rtosThreadSleep(2000);
Printf("\n");
Printf("Send a mail:%s\n", str2);
rtosMailboxSend(mailbox, str2, RTOS_WAIT_FOREVER);
rtosThreadSleep(2000);
Printf("\n");
}
}
发送进程发送2个字符串,注意这里的字符串是发送进程中的变量。
而接收进程接收到邮件后将字符串打印处理。
初始化2个进程为不同的优先级。
static void mailboxTestInit(void)
{
rtosMailboxCreate(mailbox, "mail", 2, RTOS_IPC_FLAG_FIFO);
rtosCreateThread(
handle1,
"Mailbox R",
threadMailboxReceive,
(void *)0,
NULL,
256,
RTOS_PRIORITY_MAX - 1,
100);
rtosCreateThread(
handle2,
"Mailbox S",
threadMailboxSend,
(void *)0,
NULL,
256,
RTOS_PRIORITY_MAX - 2,
100);
rtosStartThread(handle1);
rtosStartThread(handle2);
}
打印结果如下:
Send a mail:I'm a mail
Got a mail:I'm a mail
Send a mail:I'm another mail
Got a mail:I'm another mail
Send a mail:I'm a mail
Got a mail:I'm a mail
Send a mail:I'm another mail
Got a mail:I'm another mail