RT_Thread学习笔记_5、邮箱、消息队列

邮箱

  1. 邮箱的工作原理:
  2. 相较于其他IPC的特点:
    1. 数据交互功能
    2. 开销低,效率高
  3. 邮箱控制块:
    struct rt_mailbox
    {
        struct rt_ipc_object parent;                        /**< inherit from ipc_object */
    
        rt_uint32_t         *msg_pool;                      /**< start address of message buffer 邮件缓冲区地址*/
    
        rt_uint16_t          size;                          /**< size of message pool 容量*/
    
        rt_uint16_t          entry;                         /**< index of messages in msg_pool 邮件数目*/
        rt_uint16_t          in_offset;                     /**< input offset of the message buffer 邮箱的进偏移*/
        rt_uint16_t          out_offset;                    /**< output offset of the message buffer */
    
        rt_list_t            suspend_sender_thread;         /**< sender thread suspended on this mailbox 邮箱满时,挂起的发送线程*/
    };
    typedef struct rt_mailbox *rt_mailbox_t;

      

  4. 两种发送函数的区别再有邮箱可能会满时。

    /*
    当数据的值小于四个字节,可以直接写入value,若大于4字节,要把数据的指针传给value。
    如果邮箱满了,返回值会报错。
    */
    rt_err_t rt_mb_send(rt_mailbox_t mb, rt_uint32_t value);
    
    /*当邮箱满了,使用这个函数,线程可以等
    可能造成阻塞,不能放在中断
    */
    rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
                             rt_uint32_t  value,
                             rt_int32_t   timeout);

      

消息队列

  1. 消息队列是对邮箱的扩展,消息队列能接收来自线程和中断的不同长度的消息,并把消息缓存在内存空间里,其他消息可以从消息队列里读取相应的消息,并进行处理。
  2. 特点:支持紧急消息
  3. 控制块
    struct rt_messagequeue
    {
        struct rt_ipc_object parent;                        /**< inherit from ipc_object */
    
        void                *msg_pool;                      /**< start address of message 
                                                               queue 指向供给消息的地址*/
    
        rt_uint16_t          msg_size;                      /**< message size of each message
                                                             消息的长度,以4字节对齐*/
        rt_uint16_t          max_msgs;                      /**< max number of messages
                                                         max_msgs=msg_pool/(msg_size+4)
                                                因为存放消息的是循环列表,所以需要4字节存指针*/
    
        rt_uint16_t          entry;                         /**< index of messages in the 
                                                            queue 消息个数,进入+1,出去-1*/
    
        void                *msg_queue_head;                /**< list head 第一条消息*/
        void                *msg_queue_tail;                /**< list tail */
        void                *msg_queue_free;                /**< pointer indicated the free 
                                                            node of queue 未被使用的消息框*/
    };
    typedef struct rt_messagequeue *rt_mq_t;

      

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值