本文共 1279 字,大约阅读时间需要 4 分钟。
1.邮箱和消息队列的区别:
邮箱发送的是内存地址(指针传递),并没有进行内存赋值,如果邮箱发送缓冲区变成局部变量,如果函数退出之后,这些局部变量就被回收了,发送的东西肯定是不对的,邮箱发送的地址不要放在局部变量中。
消息队列可以直接复制内存块到另外一个内存块,传送的是内存中的内容。
消息队列可以直接用局部变量作为buffer。
邮箱大小固定4字节,消息队列大小不固定,用户自定义,如果定义消息队列大小为4字节,则跟邮箱类似了。
2.邮箱的相关操作API:
init初始化/creat创建 发送 接收 detach脱离/delete删除
静态消息队列初始化:
rt_mq_init(rt_mq_t mq, const char *name,//消息的名字 void *msgpool,//定义好的内存区地址 rt_size_t msg_size,//自定义消息的最大字节 rt_size_t pool_size,//内存区大小 rt_uint8_t flag)//FIFO | pariority
动态消息队列创建:
rt_mq_create(const char *name, rt_size_t msg_size, rt_size_t max_msgs, rt_uint8_t flag)
消息队列发送:
rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t size)//一般的消息发送
rt_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size)//紧急发送,抢占其他消息发送,先发送urgent消息
消息队列接收:
rt_mq_recv(rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout)
静态消息队列脱离:
rt_mq_detach(rt_mq_t mq)
动态消息队列删除:
rt_mq_delete(rt_mq_t mq)
tips:为什么RTT中的异常返回是负值?
答:个人观点,RTT创始人是linux早起开发者,向linux看齐,如果返回是个负值,肯定出错了,好判断。
消息大小定义为4则消息队列退化为邮箱
4.消息队列的同步问题
线程1给线程2发送了消息,线程2有没有收到呢?
解决方法:在线程2中释放信号量(sem)、或者发送邮件(mailbox),在线程1中获取信号量、或者接受邮件。
转载地址:http://wswsi.baihongyu.com/