RT-Thread学习笔记——消息队列

本文详细介绍了RT-Thread操作系统中消息队列的工作机制、相关函数,以及基于STM32的实践应用。消息队列支持不定长度消息收发,通过FIFO原则管理消息,支持发送紧急消息。文中还给出了STM32开发板的实验示例,展示了消息队列在线程间通信和中断服务中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文学习RT-Thread的消息队列,支持不定长度消息的收发,涉及消息队列的工作机制、消息队列相关函数以及基于STM32的RT-Thread消息队列应用示例,采用RTT&正点原子联合出品潘多拉开发板进行实验,基于STM32L475VET6。

一、消息队列的工作机制

消息队列能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中。其他线程也能够从消息队列中读取相应的消息,而当消息队列是空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。消息队列是一种异步的通信方式。 

如下图所示,线程或中断服务例程可以将一条或多条消息放入消息队列中。同样,一个或多个线程也可以从消息队列中获得消息。当有多个消息发送到消息队列时,通常将先进入消息队列的消息先传给线程,也就是说,线程先得到的是最先进入消息队列的消息,即先进先出原则 (FIFO)。 

消息队列工作示意图
消息队列工作示意图(来源RT-Thread编程指南)

 

二、消息队列的相关函数

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,
                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值