//时间片轮询的架构
// 任务结构
typedef struct _TASK_COMPONENTS
{
uint8 Run; // 程序运行标记:0-不运行,1运行
uint8 Timer; // 计时器
uint8 ItvTime; // 任务运行间隔时间 用于初始化定时器的时间
void (*TaskHook)(void); // 要运行的任务函数 用于传入执行的函数
} TASK_COMPONENTS; // 任务定义
//任务标志处理函数 将此函数放置于定时器的服务中断中
void TaskRemarks(void)
{
uint8 i;
for (i=0; i<TASKS_MAX; i++) // 逐个任务时间处理
{
if (TaskComps[i].Timer) // 时间不为0
{
TaskComps[i].Timer--; // 减去一个节拍
if (TaskComps[i].Timer == 0) // 时间减完了
{
TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢复计时器值,从新下一次
TaskComps[i].Run = 1; // 任务可以运行
}
}
}
}
//通过这个函数来判断 任务的执行情况
//任务处理函数 用于处理达到标志位的函数 放在main函数里面
void TaskProcess(void)
{
uint8 i;
for (i=0; i<TASKS_MAX; i++) // 逐个任务时间处理
{
if (TaskComps[i].Run) // 时间不为0
{
TaskComps[i].TaskHook(); // 运行任务 运行的函数
TaskComps[i].Run = 0; // 标志清0
}
}
}
// 注意 初始化的顺序代表着具体执行时间的优先级关系
// 如果有某一块的程序反应慢了 可以改变定时器的设定值