暴露任务结构体和入口
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()。