结构体数组的周期性任务调度
0.新建一个task.c和一个task.h,并添加到工程


1.task.c
#include "task.h"
static TASK_COMPONENTS Task_Comps[]=
{
//状态 计数 周期 函数
{0, 1, 1, Sample_Display}, /* task 1 Period: 1ms */
{0, 10, 10, Sample_MatrixKey}, /* task 2 Period: 10ms */
{0, 10, 10, Sample_adcKey}, /* task 3 Period: 10ms */
{0, 300, 300, Sample_NTC}, /* task 4 Period: 300ms */
{0, 500, 500, Sample_RTC}, /* task 5 Period: 500ms */
/* Add new task here */
};
u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps[0]);
//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Marks_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++) //循环好几次,几个任务几个循环
{
if(Task_Comps[i].TIMCount) /* If the time is not 0 */ //如果计数不为0
{
Task_Comps[i].TIMCount--; /* Time counter decrement */ //计数减减
if(Task_Comps[i].TIMCount == 0) /* If time arrives */ //如果计数减到0
{
/*Resume the timer value and try again */
Task_Comps[i].TIMCount = Task_Comps[i].TRITime; //重装计数
Task_Comps[i].Run = 1; /* The task can be run */ //将run置为1
}
}
}
}
//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2012-10-22
//========================================================================
void Task_Pro_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++) //循环好几次,几个任务几个循环
{
if(Task_Comps[i].Run) /* If task can be run */ //如果哪个任务的run参数为1
{
Task_Comps[i].Run = 0; /* Flag clear 0 */ //那么就将rin标志清0
Task_Comps[i].TaskHook(); /* Run task */ //并且执行这个任务的任务
}
}
}
2.task.h
#ifndef __TASK_H
#define __TASK_H
#include "config.h" //调用头文件
typedef struct
{
u8 Run; //任务状态:Run/Stop
u16 TIMCount; //定时计数器
u16 TRITime; //重载计数器
void (*TaskHook) (void); //任务函数
} TASK_COMPONENTS;
void Task_Marks_Handler_Callback(void);
void Task_Pro_Handler_Callback(void);
#endif
3.中断函数里面进行计数:Task_Marks_Handler_Callback();
main 里面去执行:Task_Pro_Handler_Callback();