FreeRTOS 任务通知模拟消息邮箱
举例
void task1_task(void *pvParameters)
{
u8 key;
BaseType_t err;
while(1)
{
key=KEY_Scan(0); //扫描按键
if(key)
{
err=xTaskNotify((TaskHandle_t )Keyprocess_Handler, //接收任务通知的任务句柄
(uint32_t )key, //任务通知值
(eNotifyAction )eSetValueWithOverwrite); //覆写的方式发送任务通知
if(err==pdFAIL)
{
printf("任务通知发送失败\r\n");
}
}
vTaskDelay(10); //延时10ms,也就是10个时钟节拍
}
}
void Keyprocess_task(void *pvParameters)
{
uint32_t NotifyValue;
BaseType_t err;
while(1)
{
err=xTaskNotifyWait((uint32_t )0x00, //进入函数的时候不清除任务bit
(uint32_t )ULONG_MAX, //退出函数的时候清除所有的bit
(uint32_t* )&NotifyValue, //保存任务通知值
(TickType_t )portMAX_DELAY); //阻塞时间
if(err==pdTRUE) //获取任务通知成功
{
switch((u8)NotifyValue)
{
case WKUP_PRES:
printf("WKUP_PRES here\r\n");
break;
case KEY2_PRES:
printf("KEY2_PRES here\r\n");
break;
case KEY0_PRES:
printf("KEY0_PRES here\r\n");
break;
}
}
}
}
实验现象