
/////////////////////////////////////////////////////////////////////////////// // 在此添加任务名 typedef enum { TASK_BASE = 0, // 基础任务 TASK_HMI, // TASK_COLLECT, TASK_UPLOAD, TASK_IOSCAN, // ... TASKS_MAX // 总的可供分配的定时任务数目 } taskList_e; // 任务名列表 /////////////////////////////////////////////////////////////////////////////// typedef struct { uint8_t run; // 任务运行标记:0-不运行,1-运行 uint8_t suspend; // 任务挂起标记: 0-正常,1-挂起 uint16_t count; // 任务运行次数计数 uint32_t timer; // 最近一次运行时刻 uint32_t interval; // 任务运行时间间隔 void (*taskHook) (void); // 要运行的任务函数指针 } task_t; // 任务结构定义 extern task_t task[TASKS_MAX]; // 任务列表 #include "timebase.h" static uint8_t firstRun[TASKS_MAX]; void task_process (void) { for (int i = 0; i < TASKS_MAX; i++) { // 逐个任务状态查询 uint32_t time = systime_ms(); // 当前时间 #if 0 /* 缺陷:有溢出风险 */ if (time >= task[i].timer) { // 任务间隔时间到 task[i].timer = time + task[i].interval; // 定时重置 task[i].run = 1; } #else if (task[i].suspend) { // 设置挂起,跳至处理下一任务 continue; } if (firstRun[i] == 0) { // 首次运行,判断首次运行时间 if (time < task[i].timer) { continue; } else { firstRun[i] = 1; task[i].run = 1; task[i].timer = time; } } if ((time - task[i].timer) >= task[i].interval) { task[i].timer = time; task[i].run = 1; } #endif if (task[i].run) { if (task[i].taskHook != NULL) { task[i].taskHook(); // 运行任务 task[i].count++; } task[i].run = 0; // 标志清0 } } } #endif /** * 改变任务运行周期 */ void task_chang_runcycle (taskList_e n, uint32_t interval) { if (n < TASKS_MAX) { task[n].interval = interval; } } /* * 任务挂起 / 恢复 */ void task_suspend (taskList_e n, uint8_t en) { if (n >= TASKS_MAX) { return; } if (en) { // 挂起 task[n].run = 0; task[n].suspend = 1; } else { // 恢复 task[n].suspend = 0; } } |
没有任何描述性的文字,不知道是啥 |