一、基础知识点
[FreeRTOS 基础知识] 任务通知 概念
[FreeRTOS 内部实现] 任务通知
本实验是基于STM32F103开发移植FreeRTOS实时操作系统,任务通知实战操作。
使用工具:Keil、串口工具
二、代码讲解
1、使用osThreadCreate创建两个任务
osThreadDef(Task1, vTask_s, osPriorityHigh, 0, 1000);
Task1_Handle = osThreadCreate(osThread(Task1), NULL);
if( Task1_Handle != NULL )
{
printf("Succeeded in creating Sender1_Handle Queue. Procedure!\n\r");
}
else
{
printf("Fail in creating Sender1_Handle Queue. Procedure!\n\r");
}
osThreadDef(Task2, vTask_r, osPriorityNormal, 0, 1000);
Task2_Handle = osThreadCreate(osThread(Task2), NULL);
if( Task2_Handle != NULL )
{
printf("Succeeded in creating Seceiver_Handle Queue. Procedure!\n\r");
}
else
{
printf("Fail in creating Seceiver_Handle Queue. Procedure!\n\r");
}
2、task2 接收数据处理函数
void vTask_r(void const * argument)
{
uint32_t ulValue, ulResult;
for(;;)
{
ulResult = xTaskNotifyWait(0,0,&ulValue, portMAX_DELAY);
if (ulResult == pdPASS)
printf("BWD:xTaskNotifyWait ok, data:%d \n\r", ulValue);
vTaskDelay(pdMS_TO_TICKS(300)); // 延时300ms
}
}
使用xTaskNotifyWait()等待接收通知,接收数据成功后打印接收到的数值。
3、task1 发送数据处理函数
void vTask_s(void const * argument)
{
uint32_t i=0;
char c;
for(;;)
{
for (i =0;i < 3; i++)
{
c = 'a'+ i;
if (xTaskNotify(Task2_Handle, (uint32_t)c, eSetValueWithOverwrite ) == pdPASS)
printf("BWD --- send ok, data = %d \n\r", (uint32_t)c);
else
printf("BWD --- send fail.\n\r");
}
vTaskDelay(pdMS_TO_TICKS(300)); // 延时300ms
}
}
使用xTaskNotify()向指定task2任务发送通知,发送的数据使用覆盖的模式进行。
三、结果演示
从串口可以看出,由于发送的数据使用覆盖的方式,所以代码中循环调用xTaskNotify函数发送时,会将数据进行覆盖。因此task2接收时只会接收都最后一个数值量。