版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_38245860/article/details/80681206
1.邮箱简介:
单个邮箱大小的限制:4字节,邮箱总大小:用户设置sizeof()/4
2.例程源码解析及邮箱的相关操作
init初始化/creat创建 发送 接收 detach脱离/delete删除
邮箱控制块与存放邮件的内存池创建
/* 邮箱控制块 */
static struct rt_mailbox mb;
/* 用于放邮件的内存池 */
static char mb_pool[128];
邮箱静态初始化:
rt_err_t result;
/* 初始化一个mailbox */
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;
}
邮箱动态初始化
rt_mailbox_t mb_d;
mb_d=rt_mb_create("mb_d",32,RT_IPC_FLAG_FIFO);
if(RT_NULL==mb_d){rt_kprintf("creat mailbox failed.\n"); return -1;}
邮件的发送:
rt_mb_send(&mb, (rt_uint32_t)&mb_str1[0]);
//发送成功返回RT_EOK;如果邮箱已经满了,返回-RT_EFULL。
rt_mb_send_wait(rt_mailbox_t mb,
rt_uint32_t value,
rt_int32_t timeout)//发送成功返回RT_EOK;如果邮箱已经满了,返回-RT_EFULL。
邮件的接收:
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;
/* 延时10个OS Tick */
rt_thread_delay(10);
}
3.注意事项:
不能在中断中接收,会导致中断的挂起,但是可在中断中发送邮件 wait发送也不能在中断中使用