本文共 1394 字,大约阅读时间需要 4 分钟。
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发送也不能在中断中使用
转载地址:http://giwsi.baihongyu.com/