通用时间片调度器

暴露任务结构体和入口

typedef struct {
    uint32_t period_ms;     // 周期(ms),0 = 禁用
    uint32_t last_tick;     // 时间戳,调度器自动维护
    Task_Callback callback; // 回调
} Task_Config;

遍历任务表 周期到就回调

void com_scheduler_run(Task_Config *tasks, uint8_t count)
{
    uint32_t now_tick = HAL_GetTick();
    for (uint8_t i = 0; i < count; i++) {
        if (tasks[i].callback == NULL || tasks[i].period_ms == 0) 
        {
            continue;
        }
        if ((now_tick - tasks[i].last_tick) >= tasks[i].period_ms) 
        {
            tasks[i].last_tick = now_tick;   // 先更新时间戳
            tasks[i].callback();             // 再执行回调
        }
    }
}

定义任务表+统一入口

static Task_Config app_tasks[] = 
{
    { .period_ms = 10, .callback = app_process_key_scan }, // 10ms:按键扫描
    // { .period_ms = 50, .callback = xxx }, // 以后加任务只需追加一行
};

void app_process_tasks(void) 
{
    com_scheduler_run(app_tasks, sizeof(app_tasks) / sizeof(app_tasks[0]));
}

主循环

只调一个入口:app_process_tasks()

添加新评论