STM32FreeRTOS队列的简介及操作

简介: STM32FreeRTOS队列的简介及操作

前言

本文主要带大家了解队列的基本知识和队列的基本操作。


一、队列基本知识介绍

队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以也称为消息队列。(本段话取自正点原子freeRTOS开发手册这里只做简单介绍想要详细了解可以去看看原子的手册,这里主要教大家如何去配置和使用队列)


二、队列的基本操作

cubeMX配置

image.png1.Queue name:队列名字

2.Queue size:队列大小

3.Lite size:队列里面每一个数据的类型

代码讲解

1.cubeMX自动生成的创建队列代码

/* Create the queue(s) */
  /* definition and creation of myQueue01 */
  osMessageQDef(myQueue01, 16, uint16_t);
  myQueue01Handle = osMessageCreate(osMessageQ(myQueue01), NULL);
  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

2.把一个消息写入队列函数

/**
* @brief Put a Message to a Queue.
* @param  queue_id  message queue ID obtained with \ref osMessageCreate.
* @param  info      message information.
* @param  millisec  timeout value or 0 in case of no time-out.
* @retval status code that indicates the execution status of the function.
* @note   MUST REMAIN UNCHANGED: \b osMessagePut shall be consistent in every CMSIS-RTOS.
*/
osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec)
{
  portBASE_TYPE taskWoken = pdFALSE;
  TickType_t ticks;
  ticks = millisec / portTICK_PERIOD_MS;
  if (ticks == 0) {
    ticks = 1;
  }
  if (inHandlerMode()) {
    if (xQueueSendFromISR(queue_id, &info, &taskWoken) != pdTRUE) {
      return osErrorOS;
    }
    portEND_SWITCHING_ISR(taskWoken);
  }
  else {
    if (xQueueSend(queue_id, &info, ticks) != pdTRUE) {
      return osErrorOS;
    }
  }
  return osOK;
}

3.从队列中读出消息函数

/**
* @brief Get a Message or Wait for a Message from a Queue.
* @param  queue_id  message queue ID obtained with \ref osMessageCreate.
* @param  millisec  timeout value or 0 in case of no time-out.
* @retval event information that includes status code.
* @note   MUST REMAIN UNCHANGED: \b osMessageGet shall be consistent in every CMSIS-RTOS.
*/
osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec)
{
  portBASE_TYPE taskWoken;
  TickType_t ticks;
  osEvent event;
  event.def.message_id = queue_id;
  event.value.v = 0;
  if (queue_id == NULL) {
    event.status = osErrorParameter;
    return event;
  }
  taskWoken = pdFALSE;
  ticks = 0;
  if (millisec == osWaitForever) {
    ticks = portMAX_DELAY;
  }
  else if (millisec != 0) {
    ticks = millisec / portTICK_PERIOD_MS;
    if (ticks == 0) {
      ticks = 1;
    }
  }
  if (inHandlerMode()) {
    if (xQueueReceiveFromISR(queue_id, &event.value.v, &taskWoken) == pdTRUE) {
      /* We have mail */
      event.status = osEventMessage;
    }
    else {
      event.status = osOK;
    }
    portEND_SWITCHING_ISR(taskWoken);
  }
  else {
    if (xQueueReceive(queue_id, &event.value.v, ticks) == pdTRUE) {
      /* We have mail */
      event.status = osEventMessage;
    }
    else {
      event.status = (ticks == 0) ? osOK : osEventTimeout;
    }
  }
  return event;
}

总结

队列操作大家可以试一试还是很简单的。

相关文章
|
传感器 开发工具 C语言
EXTI外部中断介绍(内置1.中断系统+2.中断执行流程+3.STM32中断+4.NVIC基本结构+5.NVIC优先级分组+6.EXTI简介+7.EXTI基本结构...)
EXTI外部中断介绍(内置1.中断系统+2.中断执行流程+3.STM32中断+4.NVIC基本结构+5.NVIC优先级分组+6.EXTI简介+7.EXTI基本结构...)
340 0
EXTI外部中断介绍(内置1.中断系统+2.中断执行流程+3.STM32中断+4.NVIC基本结构+5.NVIC优先级分组+6.EXTI简介+7.EXTI基本结构...)
|
内存技术
No.1 STM32F429IGT6开发板简介 (STM32F429/F767/H743)
No.1 STM32F429IGT6开发板简介 (STM32F429/F767/H743)
STM32:USART串口外设(内含:1.USART简介+2.USART基本结构+3.数据帧+4.起始位侦测+5.数据采样+6.波特率发生器)
STM32:USART串口外设(内含:1.USART简介+2.USART基本结构+3.数据帧+4.起始位侦测+5.数据采样+6.波特率发生器)
429 0
STM32:USART串口外设(内含:1.USART简介+2.USART基本结构+3.数据帧+4.起始位侦测+5.数据采样+6.波特率发生器)
|
物联网
STM32:TIM输入捕获硬件部分(内含:1.输入捕获简介+2.频率测量+3.通用/高级定时器的输入捕获电路分析(重点)+4.主从触发模式+5.输入捕获基本结构(重点)+6.PWM基本结构)
STM32:TIM输入捕获硬件部分(内含:1.输入捕获简介+2.频率测量+3.通用/高级定时器的输入捕获电路分析(重点)+4.主从触发模式+5.输入捕获基本结构(重点)+6.PWM基本结构)
608 0
STM32:TIM输入捕获硬件部分(内含:1.输入捕获简介+2.频率测量+3.通用/高级定时器的输入捕获电路分析(重点)+4.主从触发模式+5.输入捕获基本结构(重点)+6.PWM基本结构)
|
编解码 机器人 芯片
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
2272 0
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
|
存储 传感器 算法
STM32:宏观介绍STM32(内含:1.STM32用途简介+2.系列介绍+3.片上资源/外设+4.命名规则+5.系统结构+6.引脚定义+7.启动配置+8.最小系统电路+9.最小系统实物图)
STM32:宏观介绍STM32(内含:1.STM32用途简介+2.系列介绍+3.片上资源/外设+4.命名规则+5.系统结构+6.引脚定义+7.启动配置+8.最小系统电路+9.最小系统实物图)
691 1
STM32:宏观介绍STM32(内含:1.STM32用途简介+2.系列介绍+3.片上资源/外设+4.命名规则+5.系统结构+6.引脚定义+7.启动配置+8.最小系统电路+9.最小系统实物图)
|
存储 内存技术
STM32:DMA直接存储器存储(内含:1.DMA简介+2.存储器映像+3.DMA框图+4.DMA基本结构图+5.数据宽度对齐+6.两种经典转运情景)
STM32:DMA直接存储器存储(内含:1.DMA简介+2.存储器映像+3.DMA框图+4.DMA基本结构图+5.数据宽度对齐+6.两种经典转运情景)
353 0
STM32:DMA直接存储器存储(内含:1.DMA简介+2.存储器映像+3.DMA框图+4.DMA基本结构图+5.数据宽度对齐+6.两种经典转运情景)
|
传感器 存储 芯片
STM32第一课:STM硬件实物图+功能简介
STM32第一课:STM硬件实物图+功能简介
780 0
STM32第一课:STM硬件实物图+功能简介
《stm32嵌入式系统开发实战指南》一第1章 ARM处理器简介 1.0
本节书摘来自华章出版社《stm32嵌入式系统开发实战指南》一书中的第1章,第1.0节,作者 李志明 檀永 徐石明,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1377 0