FreeRTOS - 消息队列

这篇具有很好参考价值的文章主要介绍了FreeRTOS - 消息队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.消息队列的概念及应用

消息队列(queue):可以在任务与任务间、中断和任务间传递消息,实现任务接收来自其他任务或中断的不固定的消息

FreeRTOS - 消息队列

1.1任务需求

1、使用消息队列检测串口输入

2、通过串口发送字符串openled1,openled2,openled3,分别打开板载led1,led2,led3

3、通过串口发送字符串closeled1,closeled2,closeled3,分别关闭板载led1,led2,led3

1.2API

函数原型

#include “FreeRTOS.h”

#include “queue.h”

QueueHandle_t xQueueCreate( ①UBaseType_t uxQueueLength, ②UBaseType_t uxItemSize );

功能概述

创建一个消息队列,并返回消息队列句柄

参数

①:队列一次可容纳消息的最大长度

②:队列中每个消息体大小

返回值

NULL:创建失败

Any other value :创建成功,返回消息队列句柄

注意事项

队列可以用于任务与任务通信,也是用于中断与任务通信

可在调度器开启之前,创建消息队列

函数原型

#include “FreeRTOS.h”

#include “queue.h”

BaseType_t xQueueSend/xQueueSendToFront/xQueueSendToBack(

① QueueHandle_t xQueue,

②const void * pvItemToQueue,

③ TickType_t xTicksToWait );

功能概述

在任务中往队列中传入消息

xQueueSend 等价于xQueueSendToBack 入到队尾

xQueueSendToFront 入到队头

参数

①:消息队列句柄

②:要发送的消息的地址

③:阻塞等待时间

返回值

pdPASS:发送成功

errQUEUE_FULL:队列已经满,发送失败

注意事项

None

函数原型

#include “FreeRTOS.h”

#include “queue.h”

BaseType_t xQueueSendFromISR/xQueueSendToFrontFromISR/xQueueSendToBackFromISR (

① QueueHandle_t xQueue,

②const void * pvItemToQueue,

③ BaseType_t *pxHigherPriorityTaskWoken);

功能概述

在中断中往队列中传入消息

xQueueSendFromISR 等价于xQueueSendToBackFromISR 入到队尾

xQueueSendToFrontFromISR 入到队头

参数

①:消息队列句柄

②:要发送的消息的地址

③:NULL

返回值

pdTRUE:发送成功

errQUEUE_FULL:队列已经满,发送失败

注意事项

调用此函数,会触发上下文切换(当前被中断的任务优先级低于解除阻塞的任务)

在启动调度器之前不能调用此函数

函数原型

#include “FreeRTOS.h”

#include “queue.h”

BaseType_t xQueueReceive(

①QueueHandle_t xQueue,

②void *pvBuffer,

③TickType_t xTicksToWait );

功能概述

在任务中读取消息队列消息

参数

①:消息队列句柄

②:接收消息的缓冲区

③:阻塞等待时间

返回值

pdPASS:创建失败

errQUEUE_EMPTY:消息队列为空

注意事项

None

函数原型

#include “FreeRTOS.h”

#include “queue.h”

BaseType_t xQueueReceiveFromISR(

① QueueHandle_t xQueue,

② void *pvBuffer,

③BaseType_t *pxHigherPriorityTaskWoken );

功能概述

在中断中读取消息队列消息

参数

①:消息队列句柄

②:接收消息的缓冲区

③:NULL

返回值

pdPASS:创建失败

pdFAIL:消息队列为空

注意事项

调用此函数,会触发上下文切换(当前被中断的任务优先级低于解除阻塞的任务)

在启动调度器之前不能调用此函数

二.函数应用

  1. STM32CubeMX中FreeRTOS配置Queue消息队列

FreeRTOS - 消息队列
  • 字符串类型char 所以unit8_t。

  1. KEIL 消息队列接收和发送功能

FreeRTOS - 消息队列

HAL_UART_MspInit USART串口初始化

  • USART.C

开启中断_HAL_UART_EABLE_IT()

__HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)

@arg USART_IT_CTS:  CTS change interrupt

@arg USART_IT_LBD:  LIN Break detection interrupt

@arg USART_IT_TXE:  Transmit Data Register empty interrupt 
TDR寄存器为空时产生的中断标志位

 @arg USART_IT_TC:   Transmission complete interrupt
DR寄存器发送完最后一个位时产生的中断标志位。


 @arg USART_IT_RXNE: Receive Data register not empty interrupt

  @arg USART_IT_IDLE: Idle line detection interrupt

 @arg USART_IT_PE:   Parity Error interrupt

 @arg USART_IT_ERR:  Error interrupt(Frame error, noise error, overrun error)
FreeRTOS - 消息队列
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{

  if(uartHandle->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspDeInit 0 */

  /* USER CODE END USART1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_USART1_CLK_DISABLE();

    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

    /* USART1 interrupt Deinit */
    HAL_NVIC_DisableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspDeInit 1 */
  //开启中断,中断为接收寄存器不为空 
     __HAL_UART_ENABLE_IT(uartHandle, UART_IT_RXNE);
  /* USER CODE END USART1_MspDeInit 1 */
  }
  • STM32f1xx_it.c

获取 SR 寄存器标志位状态,获取此时的串口状态
__HAL_UART_GET_FLAG (__HANDLE__, __FLAG__) 
@arg UART_FLAG_CTS:  CTS Change flag (not available for UART4 and UART5).
@arg UART_FLAG_LBD:  LIN Break detection flag.
@arg UART_FLAG_TC:   Transmission Complete flag.
@arg UART_FLAG_RXNE: Receive data register not empty flag

前文有对该函数说明

BaseType_t xQueueSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, 
 BaseType_t *pxHigherPriorityTaskWoken );
extern osMessageQueueId_t CmdQueueHandle;

void USART1_IRQHandler(void)
{
    /* USER CODE BEGIN USART1_IRQn 0 */
    uint8_t Data;
    //判断接收标志置位
    if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)==SET)
    {
        //读取接收寄存器
        //当读取接收寄存器后,UART_FLAG_RXNE自动清除
        Data = huart1.Instance ->DR; 
         //进行入队操作               
        xQueueSendFromISR(CmdQueueHandle,&Data,NULL);
    }
    /* USER CODE END USART1_IRQn 0 */
    HAL_UART_IRQHandler(&huart1);
    /* USER CODE BEGIN USART1_IRQn 1 */
    
    /* USER CODE END USART1_IRQn 1 */
}
  • freertos.c (实现消息队列的接收)

函数原型

#include “FreeRTOS.h”

#include “queue.h”

BaseType_t xQueueReceive(

①QueueHandle_t xQueue, :消息队列句柄

②void *pvBuffer, 接收消息的缓冲区

③TickType_t xTicksToWait );阻塞等待时间文章来源地址https://www.toymoban.com/news/detail-404116.html

void Uart_Task(void const * argument)
{
    /* USER CODE BEGIN Uart_Task */
    /* 创建一个索引*/
    uint8_t u8_index;
    /* Infinite loop */
    for(;;)
    {
        /*每次读取消息之前,把索引初始化为0;*/
        u8_index = 0;
        /* 一直等待接收消息,第一个消息应该放在消息缓冲区的第一个元素上 */
        if(xQueueReceive(CmdQueueHandle,&CmdBuff[u8_index++],portMAX_DELAY) == pdPASS)
        {
            while(xQueueReceive(CmdQueueHandle,&CmdBuff[u8_index++],50));
            /*保证完整一包的字符串信息*/
            CmdBuff[u8_index] = '\0';
            printf("%s/r/n",CmdBuff);
        }
        osDelay(1);
    }
  /* USER CODE END Uart_Task */
}

到了这里,关于FreeRTOS - 消息队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FreeRTOS 消息队列 详解

    目录 什么是队列? 消息队列特点 1. 数据入队出队方式 2. 数据传递方式 3. 多任务访问 4. 出队、入队阻塞 消息队列相关 API 函数 1. 创建队列 2. 写队列 3. 读队列 消息队列实操 队列又称 消息队列 ,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任 务

    2024年02月08日
    浏览(32)
  • FreeRTOS - 消息队列

    消息队列(queue):可以在任务与任务间、中断和任务间传递消息,实现任务接收来自其他任务或中断的不固定的消息 1、使用消息队列检测串口输入 2、通过串口发送字符串openled1,openled2,openled3,分别打开板载led1,led2,led3 3、通过串口发送字符串closeled1,closeled2,closele

    2023年04月08日
    浏览(36)
  • FreeRTOS教程4 消息队列

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 本文主要学习 FreeRTOS 消息队列的相关知识, 包括消息队列概述、创建删除复位队列、写入/读取数据到队列等关于队列的基础知识 在一个实时操作系统构成的

    2024年03月14日
    浏览(32)
  • FreeRTOS-消息队列详解

    ✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!! 📃个人主页: @rivencode的个人主页 🔥系列专栏: 玩转FreeRTOS 💬保持学习、保持热爱、认真分享、一起进步!!! 本文将详细全方位的讲解FreeRTOS的队列消息,其实在FreeRTOS中队列的重要性也不言

    2024年02月05日
    浏览(36)
  • FreeRTOS源码分析-7 消息队列

    目录 1 消息队列的概念和作用 2 应用 2.1功能需求 2.2接口函数API 2.3 功能实现 3 消息队列源码分析 3.1消息队列控制块 3.2消息队列创建 3.3消息队列删除 3.4消息队列在任务中发送 3.5消息队列在中断中发送 3.6消息队列在任务中接收 3.7消息队列在中断中接收  消息队列(queue),可

    2024年02月14日
    浏览(29)
  • 消息队列-RabbitMQ:MQ作用分类、RabbitMQ核心概念及消息生产消费调试

    1)什么是 MQ MQ (message queue),从字面意思上看, 本质是个队列,FIFO 先入先出 ,只不过队列中存放的内容是 message 而已,还是一种 跨进程的通信机制 , 用于上下游传递消息 。在互联网架构中,MQ 是一种非常常见的上下游 “ 逻辑解耦 + 物理解耦” 的消息通信服务 。 使用了

    2024年02月20日
    浏览(33)
  • Message queue 消息队列--RabbitMQ 【基础入门】

                                🎉🎉欢迎来到我的CSDN主页!🎉🎉                     🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚     🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门】》。🎯🎯                     🎁如果感觉还

    2024年01月20日
    浏览(43)
  • 【FreeRTOS】详细讲解FreeRTOS中消息队列并通过示例讲述其用法

      在裸机系统中,两个程序间需要共享某个资源通常使用全局变量来实现;但在含操作系统(下文就拿 FreeRTOS 举例)的开发中,则使用消息队列完成。那么这两者有啥区别呢?🤔🤔🤔   其实在FreeRTOS系统中也能够像裸机似的,使用全局变量实现多程序共享某个资源(这里

    2024年02月09日
    浏览(31)
  • Microsoft Message Queue(MSMQ:微软消息队列)简介

    最近在安装公司的一个产品时,接触到了MSMQ,在此对MSMQ做一个简单的介绍,以便各位能对它有一个快速、直观的认识。本文针对于Microsoft Message Queue,以下提到的消息队列均指代Microsoft Message Queue。 2.1、消息队列是什么 MSMQ是一个Windows上的功能。主要用于多个应用之间实现相

    2024年02月09日
    浏览(43)
  • FreeRTOS通过消息队列实现串口命令解析(串口中断)

    作者:Jack_G 时间:2023.08.08 版本:V1.0 上次修改时间: 环境: quad quad quad quad STM32Cube MX V6.8.1 quad quad quad quad STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 quad quad quad quad Keil: V5.29 正常配置,不过 需要勾选全局中断 ,后续在接收中断中将接收到的数据送入消息队列。 在usa

    2024年02月14日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包