FreeRTOS--消息队列

本文详细介绍了FreeRTOS中消息队列的概念、作用,包括其FIFO原则以及中断方式的实现。重点讲解了xQueueCreate、xQueueSend、xQueueSendFromISR和xQueueReceive等关键API函数,并提供了测试例程演示如何在任务间和中断服务程序中使用这些功能进行通信。

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

一、消息队列的概念及其作用

        消息队列就是通过 RTOS 内核提供的服务,任务或中断服务子程序可以将一个消息放入到队列一个或者多个任务可以通过 RTOS 内核服务从队列中得到消息,通常先进入消息队列的消息先传给任务,任务先得到的是最先进入到消息队列的消息,即先进先出的原则( FIFO)。
        任务间消息队列的实现是指各个任务之间使用消息队列实现任务间的通信。

       中断方式消息队列的实现是指中断函数和 FreeRTOS 任务之间使用消息队列。
 

         实际应用中, 建议不要在中断中实现消息处理, 用户可以在中断服务程序里面发送消息通知任务, 在任务中实现消息处理, 这样可以有效地保证中断服务程序的实时响应。同时此任务也需要设置为高优先级, 以便退出中断函数后任务可以得到及时执行。

二、消息队列API函数

1、函数 xQueueCreate 用于创建消息队列

QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, /* 消息个数 */
                            UBaseType_t uxItemSize );  /* 每个消息大小,单位字节 */

返回值:如果创建成功会返回消息队列的句柄

2、函数 xQueueSend 用于任务中消息发送
 

BaseType_t xQueueSend(
                      QueueHandle_t xQueue,       /* 消息队列句柄 */
                      const void * pvItemToQueue, /* 要传递数据地址 */
                      TickType_t xTicksToWait     /* 等待消息队列有空间的最大等待时间 */
);

每次发送都是将消息队列创建函数 xQueueCreate 所指定的单个消息大小复制到消息队列空间中。

返回值: 如果消息成功发送返回 pdTRUE,否则返回 errQUEUE_FULL。

 3、函数 xQueueSendFromISR 用于中断服务程序中消息发送

BaseType_t xQueueSendFromISR
(
   QueueHandle_t xQueue,                 /* 消息队列句柄 */
   const void *pvItemToQueue,            /* 要传递数据地址 */
   BaseType_t *pxHigherPriorityTaskWoken /* 高优先级任务是否被唤醒的状态保存 */
);

        pxHigherPriorityTaskWoken :是否有高优先级任务准备就绪。 如果函数执行完毕后,此参数的数值是 pdTRUE,说明有高优先级任务要执行, 否则没有 。

返回值:如果消息成功发送返回 pdTRUE,否则返回 errQUEUE_FULL。

4、 函数 xQueueReceive 用于接收消息队列中的数据

BaseType_t xQueueReceive( QueueHandle_t xQueue,     /* 消息队列句柄 */
                          void * const pvBuffer,    /* 接收消息队列数据的缓冲地址 */
                          TickType_t xTicksToWait ) /* 等待消息队列有数据的最大等待时间 */

返回值: 如果接到到消息返回 pdTRUE,否则返回 pdFALSE。
        此函数是用于任务代码中调用的,故不可以在中断服务程序中调用此函数, 中断服务程序使用的是xQueueReceiveFromISR

三、测试例程

1、使用 xQueueSend  消息发送

 测试步骤:1.使用xQueueCreate创建两个队列

                   2.根据串口接收的指令分别 xQueueSend 去往xQueue1和xQueue2中发送消息

                   3.创建两个任务分别使用xQueueReceive去接收xQueue1和xQueue2的消息

2、使用xQueueSendFromISR 进行消息发送

测试步骤:1.初始化TIM2 ,开启CC1和CC2,开启中断

                  2.创建两个消息队列

                 3.根据串口接收的指令分别开启定时器CC1和CC2

                 4.在定时器中断回调函数 xQueueSendFromISR  进行消息的发送

                 5.创建两个任务分别使用xQueueReceive去接收xQueue1和xQueue2的消息

例程:https://gitee.com/hutaooooooo/git_keil/tree/master/freetos_xQueueCreate

                  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值