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;
}

总结

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

相关文章
|
IDE 调度 开发工具
如何在S32DS中使用SystemView分析FreeRTOS
如何在S32DS中使用SystemView分析FreeRTOS
如何在S32DS中使用SystemView分析FreeRTOS
|
18天前
|
消息中间件 API
【FreeRTOS(二)】FreeRTOS新手入门——计数型信号量和二进制信号量的基本使用并附代码解析
【FreeRTOS(二)】FreeRTOS新手入门——计数型信号量和二进制信号量的基本使用并附代码解析
|
18天前
|
芯片
【STM32】STM32简述中断的基础知识
【STM32】STM32简述中断的基础知识
|
2月前
|
存储 小程序
【FreeRTOS】队列的使用
【FreeRTOS】队列的使用
|
2月前
|
API
FreeRTOS入门教程(队列详细使用示例)
FreeRTOS入门教程(队列详细使用示例)
68 0
|
2月前
|
存储 安全
FreeRTOS入门教程(队列的概念及相关函数介绍)
FreeRTOS入门教程(队列的概念及相关函数介绍)
53 0
|
2月前
|
存储 消息中间件 API
FreeRTOS深入教程(软件定时器源码分析)
FreeRTOS深入教程(软件定时器源码分析)
130 0
|
2月前
|
API 调度
FreeRTOS深入教程(中断管理)
FreeRTOS深入教程(中断管理)
139 0
|
NoSQL Shell C语言
用GCC开发STM32,正点原子开发板的一个库函数版本例程示例
用GCC开发STM32,正点原子开发板的一个库函数版本例程示例
用GCC开发STM32,正点原子开发板的一个库函数版本例程示例
STM32F103移值FreeRtos笔记
STM32F103移值FreeRtos笔记
82 0

热门文章

最新文章