STM32Cubemxide使用freertos的消息队列(QUEUE)

1.为什么要使用freertos消息队列

1.1概述

  • 队列主要是作为任务间通信的主要形式。
  • 可以用于在任务之间 以及中断和任务之间发送消息。
  • 队列用作线程安全的 FIFO(先进先出)缓冲区, 新数据被发送到队列的后面,但也可以发送到前面。

1.2阻塞的情况

  • 一个任务试图从一个空队列中读取时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中的数据变得可用,或者阻塞时间过期
  • 一个任务试图写入到一个满队列时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中出现可用空间,或者阻塞时间过期
  • 假如同一个队列上有多个处于阻塞状态的任务, 那么具有最高优先级的任务将最先解除阻塞。
  • 中断只能使用以 “FromISR” 结尾的 API 函数。
    总结:就是说队列空和满的情况下,是不会有读数据和写数据的情况的,任务可以直接走,或等有时间在走,一直等。也有多个任务同时去拿同一个队列的消息,如果没有顺序,那么也会导致数据乱。这种情况在全局变量下就比较常见,还有就是中断下拿数据,要关闭总中断,防止干扰。

1.实战案例

在这里插入图片描述

在这里插入图片描述

3.实际代码

	static uint32_t value = 0;
void producer_thread(void const * argument)
{
  /* USER CODE BEGIN producer_thread */
	(void) argument;
  /* Infinite loop */
  for(;;)
  {
    osDelay(300);
		if (osMessagePut(osQueueHandle, value, 100) == osOK)
    {
				value++;
    }
  }
  /* USER CODE END producer_thread */
}
void consumer_thread(void const * argument)
{
  /* USER CODE BEGIN consumer_thread */
	(void) argument;
	osEvent event;
  /* Infinite loop */
  for(;;)
  {
    event = osMessageGet(osQueueHandle, 100);

    if (event.status == osEventMessage)
    {
      //if (event.value.v == value)
      //{
				  printf("value is %d\r\n",value);
					HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
      //}
		}
  }
  /* USER CODE END consumer_thread */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值