首先定义一个任务结构体
#define TASKS_MAX 3
// 任务结构typedef struct _TASK_COMPONENTS
{
uint8 Run; // 程序运行标记:0-不运行,1运行
uint8 Timer; // 计时器
uint8 ItvTime; // 任务运行间隔时间
void (*TaskHook)(void); // 要运行的任务函数
} TASK_COMPONENTS; // 任务定义
//任务函数列表
void Task1()
{
}
void Task2()
{
}
void Task3()
{
}
/**************************************************************************************
* Variable definition 任务结构体
**************************************************************************************/
static TASK_COMPONENTS TaskComps[] =
{
{0, 60, 60, Task1}, // 显示时钟
{0, 20, 20, Task2}, // 按键扫描
{0, 30, 30, Task3}, // 显示工作状态
// 这里添加你的任务。。。。
};
/**************************************************************************************
* FunctionName : TaskRemarks()
* Description : 任务标志处理 这个函数要放在定时器里。
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
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; // 任务可以运行
}
}
}
}
/**************************************************************************************
* FunctionName : TaskProcess()
* Description : 任务处理 放到main函数里去执行的。
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
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
}
}
}
上面的效果还不错。如果能把全局变量之间的冲突处理好。这个小型的系统是一个非常不错的选择。而且程序结构清晰,方便维护和移植。