10.消息队列的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_38245860/article/details/80685625

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中获取信号量、或者接受邮件。


猜你喜欢

转载自blog.csdn.net/sinat_38245860/article/details/80685625
10.