前言
本文学习RT-Thread的消息队列,支持不定长度消息的收发,涉及消息队列的工作机制、消息队列相关函数以及基于STM32的RT-Thread消息队列应用示例,采用RTT&正点原子联合出品潘多拉开发板进行实验,基于STM32L475VET6。
一、消息队列的工作机制
消息队列能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中。其他线程也能够从消息队列中读取相应的消息,而当消息队列是空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。消息队列是一种异步的通信方式。
如下图所示,线程或中断服务例程可以将一条或多条消息放入消息队列中。同样,一个或多个线程也可以从消息队列中获得消息。当有多个消息发送到消息队列时,通常将先进入消息队列的消息先传给线程,也就是说,线程先得到的是最先进入消息队列的消息,即先进先出原则 (FIFO)。

二、消息队列的相关函数
1、创建动态消息队列函数:创建动态消息队列时先从对象管理器中分配一个消息队列对象,然后给消息队列对象分配一块内存空间,组织成空闲消息链表,这块内存的大小 =[消息大小 + 消息头(用于链表连接)的大小]X 消息队列最大个数,接着再初始化消息队列,此时消息队列为空。创建动态消息队列的函数接口如下所示:
rt_mq_t rt_mq_create(const char *name,
rt_size_t msg_size,
rt_size_t max_msgs,
rt_uint8_t flag);
(1)入口参数:
name:消息队列的名称。
msg_size:消息队列中一条消息的最大长度,单位字节。
max_msgs:消息队列的最大个数。
flag:消息队列采用的等待方式,它可以取如下数值:RT_IPC_FLAG_FIFO 或RT_IPC_FLAG_PRIO。
(2)返回值:
RT_EOK:发送成功 消息队列对象的句柄成功。
RT_NULL:失败。
2、删除动态消息队列函数:当动态消息队列不再被使用时,应该删除它以释放系统资源,一旦操作完成,动态消息队列将被永久性地删除。删除动态消息队列时,如果有线程被挂起在该消息队列等待队列上,则内核先唤醒挂起在该消息等待队列上的所有线程(线程返回值是 - RT_ERROR),然后再释放消息队列使用的内存,最后删除消息队列对象。函数接口如下:
rt_err_t rt_mq_delete(rt_mq_t mq);
(1)入口参数:
mq:消息队列对象的句柄。
(2)返回值:
RT_EOK:成功。
3、创建静态消息队列函数:创建静态消息队列和《RT-Thread编程指南》所讲的初始化静态消息队列是一样的,静态消息队列对象的内存是在系统编译时由编译器分配的,一般放于读数据段或未初始化数据段中。消息队列初始化后所有消息都挂在空闲消息链表上,消息队列为空,函数接口如下:
rt_err_t rt_mq_init(rt_mq_t mq,
const char *name,
void *msgpool,