公司动态

FreeRTOS任务通知操作

📅 2026/7/27 6:03:56
FreeRTOS任务通知操作
模拟二值信号量/** * brief task1 * param pvParameters : 传入参数(未用到) * retval 无 */ void task1(void *pvParameters) { uint8_t key 0; while (1) { if (Task2Task_Handler ! NULL) { key key_scan(0); switch (key) { case KEY0_PRES: /* 发送任务通知 */ { xTaskNotifyGive((TaskHandle_t)Task2Task_Handler); /* 接收任务通知的任务句柄 */ break; } default: { break; } } } vTaskDelay(10); } } /** * brief task2 * param pvParameters : 传入参数(未用到) * retval 无 */ void task2(void *pvParameters) { uint32_t notify_val 0; uint32_t task2_num 0; while (1) { notify_val ulTaskNotifyTake((BaseType_t )pdTRUE, /* 通知值在函数退出时清零类似二值信号量 */ (TickType_t )portMAX_DELAY); /* 等待时间 */ if (notify_val ! 0) { lcd_fill(6, 131, 233, 313, lcd_discolor[task2_num % 11]); /* LCD区域刷新 */ } } }模拟计数型信号量/** * brief task1 * param pvParameters : 传入参数(未用到) * retval 无 */ void task1(void *pvParameters) { uint8_t key 0; while (1) { key key_scan(0); if (Task2Task_Handler ! NULL) { switch (key) { case KEY0_PRES: /* 发送任务通知 */ { xTaskNotifyGive((TaskHandle_t)Task2Task_Handler); /* 接收任务通知的任务句柄 */ break; } default: { break; } } } vTaskDelay(10); } } /** * brief task2 * param pvParameters : 传入参数(未用到) * retval 无 */ void task2(void *pvParameters) { uint32_t notify_val 0; uint32_t task2_num 0; while (1) { notify_val ulTaskNotifyTake((BaseType_t )pdFALSE, /* 通知值在函数退出时递减类似计数型信号量 */ (TickType_t )portMAX_DELAY); /* 等待时间 */ lcd_show_xnum(166, 111, notify_val - 1, 2, 16, 0, BLUE); /* 在LCD上显示任务通知值 */ lcd_fill(6, 131, 233, 313, lcd_discolor[task2_num % 11]); /* LCD区域刷新 */ vTaskDelay(1000); } }模拟消息邮箱/** * brief task1 * param pvParameters : 传入参数(未用到) * retval 无 */ void task1(void *pvParameters) { uint8_t key 0; while (1) { key key_scan(0); if ((Task2Task_Handler ! NULL) (key ! 0)) { xTaskNotify((TaskHandle_t )Task2Task_Handler, /* 接收任务通知的任务句柄 */ (uint32_t )key, /* 要更新的bit位 */ (eNotifyAction )eSetValueWithOverwrite); /* 更新方式为覆写 */ } vTaskDelay(10); } } /** * brief task2 * param pvParameters : 传入参数(未用到) * retval 无 */ void task2(void *pvParameters) { uint32_t notify_val 0; uint32_t task2_num 0; while (1) { xTaskNotifyWait((uint32_t )0x00000000, /* 进入函数时不清除任务通知值 */ (uint32_t )0xFFFFFFFF, /* 函数退出时清零任务通知值 */ (uint32_t* )notify_val, /* 接收到的通知值 */ (TickType_t )portMAX_DELAY); /* 等待时间 */ switch (notify_val) { case KEY0_PRES: /* LCD区域刷新 */ { lcd_fill(6, 126, 233, 313, lcd_discolor[task2_num % 11]); break; } case KEY1_PRES: /* LED0闪烁 */ { LED0_TOGGLE(); break; } default: { break; } } } }模式事件组#define EVENTBIT_0 (10) /* 事件位 */ #define EVENTBIT_1 (11) #define EVENTBIT_ALL (EVENTBIT_0 | EVENTBIT_1) /** * brief task1 * param pvParameters : 传入参数(未用到) * retval 无 */ void task1(void *pvParameters) { uint8_t key 0; while (1) { if (Task2Task_Handler ! NULL) { key key_scan(0); switch (key) { case KEY0_PRES: { xTaskNotify((TaskHandle_t )Task2Task_Handler, /* 接收任务通知的任务句柄 */ (uint32_t )EVENTBIT_0, /* 要更新的bit位 */ (eNotifyAction )eSetBits); /* 更新方式为设置bit位 */ break; } case KEY1_PRES: { xTaskNotify((TaskHandle_t )Task2Task_Handler, /* 接收任务通知的任务句柄 */ (uint32_t )EVENTBIT_1, /* 要更新的bit位 */ (eNotifyAction )eSetBits); /* 更新方式为设置bit位 */ break; } default: { break; } } } vTaskDelay(10); } } /** * brief task2 * param pvParameters : 传入参数(未用到) * retval 无 */ void task2(void *pvParameters) { uint32_t notify_val 0; uint32_t event_val 0; uint32_t task2_num 0; while (1) { xTaskNotifyWait((uint32_t )0x00000000, /* 进入函数时不清除任务通知值 */ (uint32_t )0xFFFFFFFF, /* 函数退出时清零任务通知值 */ (uint32_t* )notify_val, /* 接收到的通知值 */ (TickType_t )portMAX_DELAY); /* 等待时间 */ if (notify_val EVENTBIT_0) /* 模拟事件0发生 */ { event_val | EVENTBIT_0; } else if (notify_val EVENTBIT_1) /* 模拟事件1发生 */ { event_val | EVENTBIT_1; } lcd_show_xnum(182, 110, event_val, 1, 16, 0, BLUE); /* LCD上显示事件值 */ if (event_val EVENTBIT_ALL) { event_val 0; /* 模拟事件组清零 */ lcd_fill(6, 131, 233, 313, lcd_discolor[task2_num % 11]); } } }