FreeRTOS--消息队列

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

        消息队列就是通过 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

                  

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS是一个开源的实时操作系统内核,被广泛应用于嵌入式系统中。ESP32是一款具有双核处理器和Wi-Fi功能的芯片,通过使用ESP-IDF开发框架可以进行软件开发。在ESP32-IDF开发中,使用FreeRTOS的消息队列可以实现不同任务之间的通信。 在ESP32开发中,可以通过中断服务程序(Interrupt Service Routine,ISR)来发送消息消息队列,并在任务中通过接收方法响应。 首先,我们需要创建一个全局的消息队列句柄,可以使用xQueueCreate函数来创建一个消息队列。例如,可以使用以下代码创建一个大小为10的消息队列: xQueueHandle messageQueue = xQueueCreate(10, sizeof(int)); 然后,在中断服务程序中,可以使用xQueueSendFromISR方法将消息发送到消息队列中。例如,可以使用以下代码将一个整数值发送到消息队列中: int value = 100; xQueueSendFromISR(messageQueue, &value, NULL); 在任务中,可以使用xQueueReceive方法从消息队列中接收消息并进行响应。例如,可以使用以下代码从消息队列中接收一个整数值并打印出来: int receivedValue; xQueueReceive(messageQueue, &receivedValue, portMAX_DELAY); printf("Received value: %d\n", receivedValue); 需要注意的是,在接收消息时,可以通过指定第三个参数来设置等待时间。例如,使用portMAX_DELAY表示无限等待,即直到接收到消息为止。 通过以上步骤,我们可以实现在ESP32开发中使用FreeRTOS消息队列进行中断服务消息发送与响应。这种方式可以实现不同任务之间的通信和同步,提高系统的并发性和实时性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值