RT-Thread学习记录13 消息队列的使用

以下为看视频笔记..........

1. 消息队列工作机制

消息队列是RT-Thread中另一种常用的线程间通信方式,消息队列是对邮箱的扩展。

消息队列能够接收来自线程或中断服务例程中发出的不固定长度的消息,并把消息缓存在自己的内存空间中,而其他线程能够从消息队列中读取相应的消息并进行对应的处理。

 

RT-Thread学习记录13 消息队列的使用_第1张图片

2. 消息队列控制块

消息队列控制块是操作系统用于管理消息队列的一个数据结构

struct  rt_messagequeue
{
    struct   rt_ipc_object  parent;
    void                  *msg_pool;  //消息内存空间起始的地址
    rt_uint16_t          msg_size;    //消息队列中的消息框最大大小,以4的整数倍表示
    rt_uint16_t          max_msgs;    //消息队列中消息框的最大数目:msg_pool/(msg_size+4)[其中4表示消息用链表储存所使用的指针大小]
    rt_uint16_t          entry;       //消息队列实时消息框的个数指示,有新的消息进来就加一,读取了就减一
    void          *msg_queue_head;   //指针指向消息的头
    void          *msg_queue_tail;   //指针指向消息的尾
    void          *msg_queue_free;   //指针指向未使用的消息

}
typedef struct  rt_messagequeue   *rt_mq_t;

定义静态消息队列:struct  rt_messagequeue  static_mq

定义动态消息队列 :rt_mq_t  dynamic_mq

#define  RT_ALIGN_SIZE  4  //对内存的操作四字节对齐

3. 消息队列的操作



初始化与脱离,针对静态线程队列的API

rt_err_t  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)

rt_err_t  rt_mq_detach(rt_mq_t mq)

//第三个参数:定义一个内存空间,把地址赋给magpool,用来存储消息,flag参数可为:RT_IPC_FLAG_FIFO  RT_IPC_FLAG_PRIO。msg_size是代表每一个消息的长度,为4的倍数取值。pool_size为内存池大小


创建与删除,针对动态线程操作的API

rt_mq_t  rt_mq_create(const char *name,rt_size_t msg_size,rt_size_t max_msgs,rt_uint8_t flag)

rt_err_t  rt_mq_delete(rt_mq_t mq)

发送消息

rt_err_t  rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t size)//普通消息的发送,放到列表的尾部
rt_err_t  rt_mq_urgent(rt_mq_t mq, void *buffer, rt_size_t size) //紧急消息发送,放到列表的头部

接收消息

rt_err_t  rt_mq_recv(rt_ mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout)


4.代码历程在msgq_sample.c中

 

你可能感兴趣的:(rt_thread)