官网链接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_11
注意:1、邮箱中的每一封邮件只能容纳固定的 4 字节内容(针对 32 位处理系统,指针的大小即为 4 个字节,所以一封邮件恰好能够容纳一个指针),所以我们传递大量的数据可以通过传递数组指针的方式,来传递数据;2、msgpool 指向的缓冲区的字节数是 N,那么邮箱容量应该是 N/4。
代码:
#define THREAD_PRIORTY 6 //优先级
#define THREAD_STACK_SIZE 512 //栈大小
#define THREAD_TIMESLICE 5 //线程时间片
static struct rt_mailbox mb; //邮箱控制块
static char mb_pool[128]; //邮箱内存池
static char mb_str1[] = "I'm a mail!";
static char mb_str2[] = "this is another mail!";
static char mb_str3[] = "over";
//邮箱使用示例,其中一个线程往邮箱中发送邮件,一个线程往邮箱中收取邮件
/******************************************************************************************
*** 函数名称: mailbox_thread1_recv
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:线程1,接收邮箱
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_11
*** 编者 时间 版本
*** wagnlu 2020/11/16 V0.1
******************************************************************************************/
static void mailbox_thread1_recv(void* parameter)
{
char *str;
while(1)
{
rt_kprintf("thread1: try to recv mail\n");
//从邮箱中收取邮件
if(rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER) == RT_EOK)
{
rt_kprintf("thread1: get a mail from mailbox, the content:%s\n", str);
if(str == mb_str3)
{
break; //退出接收邮箱
}
rt_thread_mdelay(1000); //延迟1s
}
}
rt_kprintf("thread1 mailbox over\n");
rt_mb_detach(&mb); //执行邮箱对象脱离
}
/******************************************************************************************
*** 函数名称: mailbox_thread2_send
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:线程2,发送邮箱
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_11
*** 编者 时间 版本
*** wagnlu 2020/11/16 V0.1
******************************************************************************************/
static void mailbox_thread2_send(void* parameter)
{
rt_uint8_t count =0;
while(count <10)
{
count ++;
if(count &0x1)
{
rt_mb_send(&mb, (rt_uint32_t)&mb_str1); //发送mb_str1 地址到邮箱中
}
else
{
rt_mb_send(&mb, (rt_uint32_t)&mb_str2); //发送mb_str2 地址到邮箱中
}
rt_thread_mdelay(1000);
}
rt_mb_send(&mb, (rt_uint32_t)&mb_str3); //发送邮箱告诉线程1,2 已经运行结束
}
/******************************************************************************************
*** 函数名称: mailbox_thread2_send
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:线程2,发送邮箱
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_11
*** 编者 时间 版本
*** wagnlu 2020/11/16 V0.1
******************************************************************************************/
int mailbox_sample(void)
{
rt_err_t result;
rt_thread_t tid = RT_NULL; //创建一个线程句柄
//初始化一个邮箱
result = rt_mb_init( &mb, //邮箱控制块
"mbt", //名称是 mbt
&mb_pool[0], //邮箱用到的内存池是 mb_pool
sizeof(mb_pool)/4, //邮箱中的邮件数目,因为一封邮件占 4 字节
RT_IPC_FLAG_FIFO); //采用 FIFO 方式进行线程等待
if(result != RT_EOK)
{
rt_kprintf("init mailbox failed\n");
return -1;
}
tid = rt_thread_create( "mailobx thread1", //线程名称
mailbox_thread1_recv, //线程函数
RT_NULL, //线程入口函数参数
THREAD_STACK_SIZE, //栈大小
THREAD_PRIORTY, //优先级
THREAD_TIMESLICE); //线程时间片
if(tid != RT_NULL) //获得线程控制块,启动这个线程
{
rt_thread_startup(tid);
}
tid = rt_thread_create( "mailobx thread2", //线程名称
mailbox_thread2_send, //线程函数
RT_NULL, //线程入口函数参数
THREAD_STACK_SIZE, //栈大小
THREAD_PRIORTY, //优先级
THREAD_TIMESLICE); //线程时间片
if(tid != RT_NULL) //获得线程控制块,启动这个线程
{
rt_thread_startup(tid);
}
return 0;
}
MSH_CMD_EXPORT(mailbox_sample, mailbox sample) //导出 msh命令
效果: