wenbo2005.online

学习记录 / FreeRTOS

消息队列

FreeRTOS2024-07-09

1,开启一个消息:

myQueue01+32+uint32_t

2,开启两个任务;

void StartDefaultTask(void const * argument)                        //在默认任务中,每1秒发送一个消息
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
    uint32_t tx_num=0;                                             //发送内容
  for(;;)
  {
        osDelay(1000);
        if(osMessagePut(myQueue01Handle,tx_num,100) == osOK)            //消息发送函数,阻塞100ms
        {
            osThreadSuspendAll ();                      //该操作防止串口发送被打断
            printf("Send:%d\r\n",tx_num);
            osThreadResumeAll();
            ++tx_num;
        }
  }
  /* USER CODE END StartDefaultTask */
}

//==================================================接收(该程序实现了每1秒翻转LED一次)

void StartTask_LED(void const * argument)                                //其中一个任务
{
  /* USER CODE BEGIN StartTask_LED */
  /* Infinite loop */
    osEvent event;
  for(;;)
  {
        event = osMessageGet(myQueue01Handle,100);                    //100ms可以替换成osWaitForever,一直等待接收
        if(event.status ==osEventMessage)
        {
            HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
            printf("Task_2 Send %d\r\n",event.value.v);
        }
  }
  /* USER CODE END StartTask_LED */
}

注意:如果任务二的优先级比上面任务高,则不会触发电平翻转,因为消息被任务二的osMessageGet函数接收后立即删除;因此可以将任务二的接收函数改为osMessagePeek,该函数接收消息后不会删除。

如果,tx_num数值有问题,在osMessagePeek函数中第一个if头上加---------event.value.v = 0;(uint16_t 与uint32_t的问题)