[FreeRTOS]消息队列的创建和使用-STM32CUBEMX

目录

一、前言

二、消息队列

2.1 什么是消息队列

2.2 消息队列的作用

三、STM32CUBEMX配置

3.1 创建消息队列

3.1.1 配置FreeRTOS

3.1.2 添加消息队列

3.1.3 配置队列参数

3.1.4 生成代码

3.2 V1官方API函数

3.2.1 osMessageCreate

3.2.2 osMessagePut

3.2.3 osMessageGet

3.2.4 osMessagePeek

3.2.5 osMessageDelete

3.3 V2官方API函数

3.3.1 xQueueSend

3.3.2 xQueueSendToFront

3.3.3 xQueuePeek

3.2.4 xQueueReceive

四、代码实现

五、效果查看


一、前言

        本文将介绍FreeRTOS中,消息队列的使用。芯片选择STM32F103C8T6,通过STM32CUBMEX移植FreeRTOS后,进行本文内容的学习。

二、消息队列

2.1 什么是消息队列

        消息队列是一种先进先出(FIFO, First In First Out)的数据结构,用于在任务或中断之间传递消息。在FreeRTOS中,消息队列可以存储有限数量的、大小固定的数据项。每个数据项被称为队列项目,队列所能保存的最大项目数量称为队列的长度。

2.2 消息队列的作用

        消息队列主要用于任务间的数据交换和同步。通过消息队列,一个任务可以将数据发送到队列中,而另一个任务可以从队列中读取这些数据。这种方式使得任务间的通信更加灵活和高效。

三、STM32CUBEMX配置

3.1 创建消息队列

3.1.1 配置FreeRTOS

        首先,按照之前文章中的教程,启用FreeRTOS,配置基本的RTOS工程。

        配置文章:STM32CUBEMX部署生成FreeRTOS

3.1.2 添加消息队列

        在FreeRTOS配置中,找到"Tasks and Queues"下的Queue选项,点击“Add”按钮添加一个新的消息队列。

3.1.3 配置队列参数

        设置队列的名称、队列深度(即最大消息数)、消息大小(以字节为单位)以及分配方式(动态或静态)。

3.1.4 生成代码

        配置完成后,点击“Project”菜单下的“Generate Code”按钮生成项目代码。

3.2 V1官方API函数

        FreeRTOS提供了丰富的API函数来操作消息队列,主要包括以下几个(下述函数需使用CMSIS V1):

3.2.1 osMessageCreate

        创建并初始化一个消息队列。

3.2.2 osMessagePut

        向消息队列中发送一个消息。

3.2.3 osMessageGet

        从消息队列中接收一个消息,并将其从队列中删除。这是常规的出队列方法。

3.2.4 osMessagePeek

        从消息队列中查看一个消息,但不将其从队列中删除。注意:这里仅获取数据,但并不出队,所以其他任务仍然可以取出该数据。

3.2.5 osMessageDelete

        删除一个消息队列。

3.3 V2官方API函数

        本文中使用的是CMSIS V2,其与V1所使用的函数是不同的。

3.3.1 xQueueSend

        向消息队列中发送一个消息。

3.3.2 xQueueSendToFront

        队首入队,这意味着该数据会优先出队。

3.3.3 xQueuePeek

        从消息队列中查看一个消息,但不将其从队列中删除

3.2.4 xQueueReceive

        从消息队列中接收一个消息,并将其从队列中删除。这是常规的出队列方法。

四、代码实现

        注意需要引入头文件:queue.h

        打开编译后的代码,在freertos.c中我们可以发现CUBEMX使用osMessageQueueNew函数创建了一个消息队列。

        我们让默认任务去写队列,让任务2去读队列。

/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
		data += 10;
		xQueueSend(QueueDataHandle,&data,0);
		printf("Put Data :%d \n",data);
    osDelay(1000);
  }
  /* USER CODE END StartDefaultTask */
}

/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
		uint32_t temp = 0;
		xQueueReceive(QueueDataHandle,&temp,100);
		printf("Get Data :%d \n",temp);
    osDelay(1000);
  }
  /* USER CODE END StartTask02 */
}

五、效果查看

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西西菜鸟

打赏支持获得问题解答机会

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值