模拟二值信号量:
/** * @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* )¬ify_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 (1<<0) /* 事件位 */ #define EVENTBIT_1 (1<<1) #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* )¬ify_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]); } } }