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的问题)