1.设计一个结构体: 代码: // 任务结构 typedef struct _TASK_COMPONENTS { uint8 Run; // 程序运行标记:0-不运行,1运行 uint8 Timer; // 计时器 uint8 ItvTime; // 任务运行间隔时间 void (*TaskHook)(void); // 要运行的任务函数 } TASK_COMPONENTS; // 任务定义 这个结构体的设计非常重要,一个用4个参数,注释说的非常详细,这里不在描述。 2. 任务运行标志出来,此函数就相当于中断服务函数,需要在定时器的中断服务函数中调用此函数,每隔TaskComps.Timer时间执行一次对应的函数。这里独立出来,并于移植和理解。 代码: void TaskRemarks(void) { uint8 i; for (i=0; i逐个任务时间处理 { if (TaskComps.Timer) // 时间不为0 { TaskComps.Timer--; // 减去一个节拍 if (TaskComps.Timer == 0) // 时间减完了 { TaskComps.Timer = TaskComps.ItvTime; // 恢复计时器值,重新开始计时 TaskComps.Run = 1; // 任务可以运行 } } } } 大家认真对比一下次函数,和上面定时复用的函数是不是一样的呢? 3. 任务处理 代码: void TaskProcess(void) { uint8 i; for (i=0; i逐个任务时间处理 { if (TaskComps.Run) // 时间不为0 { TaskComps.TaskHook(); // 运行任务 TaskComps.Run = 0; // 标志清0 } } } 此函数就是判断什么时候该执行那一个任务了,实现任务的管理操作,应用者只需要在main()函数中调用此函数就可以了, 并不需要去分别调用和处理任务函数。 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 到此,一个时间片轮询应用程序的架构就建好了, 简单吧?此架构只需要两个函数,一个结构体 |
欢迎光临 迅维网 (https://www.chinafix.com/) | Powered by Discuz! X3.4 |