FreeRTOS-CubeMX 配置之消息队列的创建

单片机型号:STM32F103VE

CubeMX中的配置:

1、常规配置。时钟树、需要的外设,参考任务创建

FreeRTOS-CubeMX 配置之消息队列的创建_第1张图片

 FreeRTOS-CubeMX 配置之消息队列的创建_第2张图片

 2、消息队列和消息收发任务创建

xQueueCreate()              // 队列创建函数
xQueueSendToBack()	        // 消息发送API函数 等于xQueueSend()
xQueueSendToFront()         // 发送到队前

xQueueReceive()             // 接收消息且删除队列中消息
xQueuePeek()		        // 接收消息但不删除
uxQueueMessagesWaiting()    // 用于查询队列中当前有效数据单元个数

3、创建消息队列

FreeRTOS-CubeMX 配置之消息队列的创建_第3张图片

         其中,Queue Size为消息队列中消息容量

实例代码

void F_Task1(void const * argument)
{
  /* USER CODE BEGIN F_Task1 */
	BaseType_t xStatus;
	uint32_t Buf = 10086;
  /* Infinite loop */
  for(;;)
  {
    if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == SET)
		{
			HAL_Delay(50);
			if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == SET)
			{
				xStatus = xQueueSendToBack(Queue01Handle, &Buf, 0);	
				if(xStatus != pdPASS)
				{
					printf("Queue can't send!\r\n");
				}
				else
				{
					printf("Queue %d is send!\r\n", Buf);
				}
			}
			while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == SET);
		}
  }
  /* USER CODE END F_Task1 */
}

按键1控制发送消息10086,容量为3,故队列最多存在3个,超过会显示发送失败

void J_Task(void const * argument)
{
  /* USER CODE BEGIN J_Task */
  BaseType_t xStatus;
	uint32_t Buf = 66666;
  /* Infinite loop */
  for(;;)
  {
    if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == SET)
		{
			HAL_Delay(50);
			if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == SET)
			{
				xStatus = xQueueReceive(Queue01Handle, &Buf, 0);
				if(xStatus != pdPASS)
				{
					printf("Queue can't read!\r\n");
				}
				else
				{
					printf("Queue %d is read!\r\n", Buf);
				}
			}
			while(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == SET);
		}
  }
  /* USER CODE END J_Task */
}

按键2控制接收消息,并且会将消息从队列中删除

实例结果

FreeRTOS-CubeMX 配置之消息队列的创建_第4张图片

 


补充

        代码编写时,发现keil编译不报错,但是下载后发现按键后串口不打印。

        后面发现是因为将发送任务重for循环语句注释了,可能是因为注释了循环,导致程序在此函数卡死。

FreeRTOS-CubeMX 配置之消息队列的创建_第5张图片

 

你可能感兴趣的:(FreeRTOS,单片机,stm32,嵌入式硬件)