/** * @file task_manager.cpp * @brief 任务标志调度与时基驱动实现。 */ #include "main.h" #include "sys/task_manager.h" task_scheduler_t g_scheduler = {0}; /** * @brief 初始化任务管理器内部状态。 */ void task_manager_init(void) { g_scheduler.task_flags = 0U; g_scheduler.tick_100us = 0U; g_scheduler.tick_1ms = 0U; g_scheduler.tick_10ms = 0U; g_scheduler.tick_100ms = 0U; g_scheduler.tick_1s = 0U; } /** * @brief 设置一个或多个待执行任务标志。 * @param[in] task_mask 待置位的任务位图掩码。 */ void task_manager_set(uint32_t task_mask) { g_scheduler.task_flags |= task_mask; } /** * @brief 原子地取出当前所有待执行任务标志并清零。 * @retval 返回当前待执行任务位图。 */ uint32_t task_manager_take_pending(void) { uint32_t pending; __disable_irq(); pending = g_scheduler.task_flags; g_scheduler.task_flags &= ~pending; __enable_irq(); return pending; } /** * @brief 推进一次 100us 调度节拍并按周期置位待执行任务。 * @note 按 500us / 1ms / 10ms / 100ms / 1s 档次分别置位对应任务组。 */ void task_manager_tick_100us(void) { g_scheduler.tick_100us++; if((g_scheduler.tick_100us % 5U) == 0U) { task_manager_set(1UL << TASK_ADC_VREF_SAMPLE); } if((g_scheduler.tick_100us % 10U) == 0U) { g_scheduler.tick_1ms++; task_manager_set((1UL << TASK_ADC_TEMP_SAMPLE) | (1UL << TASK_ADC_PROCESS)); } if((g_scheduler.tick_100us % 100U) == 0U) { g_scheduler.tick_10ms++; task_manager_set((1UL << TASK_CAN_RX_POLL) | (1UL << TASK_CAN_RX_PARSE)); } if((g_scheduler.tick_100us % 1000U) == 0U) { g_scheduler.tick_100ms++; task_manager_set((1UL << TASK_CAN_TX_PREPARE) | (1UL << TASK_CAN_TX_SEND) | (1UL << TASK_STATUS_LED)); } if((g_scheduler.tick_100us % 10000U) == 0U) { g_scheduler.tick_1s++; task_manager_set((1UL << TASK_HEARTBEAT) | (1UL << TASK_DIAGNOSTIC_PRINT)); } }