注意,把下面
typedef struct
{
u8 Run; //任务状态:1--Run/0--Stop
u16 TIMCount; //定时计数器,TIMCount变成0的时候,把Run置1
u16 TRITime; //重载计数器
void (*TaskHook) (void); //任务函数
} TASK_COMPONENTS;
注意:
这个定义结构体的函数从task.c 挪动到task.h,目的是为了在task.c和task.h这2
哥文件中都能正常使用结构体TASK_COMPONENTS,如果只是放在task.c ,那么
task.h里就没法用结构体TASK_COMPONENTS,编译就会报错
那么计时函数,要放在定时器1ms的中断函数才符合逻辑“
void Timer0_Isr(void) interrupt 1 //1MS执行一次
{
Task_Marks_Handler_Callback(); //系统计时
}
毕竟是按每毫秒处理1次的:
//========================================================================
// 函数: 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.TIMCount) // If the time is not 0假如不为0
{
Task_Comps.TIMCount--; // Time counter decrement 计数变量--
if(Task_Comps.TIMCount == 0) // If time arrives 假如计数变量为0
{
/*Resume the timer value and try again */
Task_Comps.TIMCount = Task_Comps.TRITime; //d对应变量重新装载初值
Task_Comps.Run = 1; //The task can be run Run标志位置1
}
}
}
}
而下面的函数:
void Task_Pro_Handler_Callback(void)
要放在主循环里:
//========================================================================
// 函数: 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.Run) /* If task can be run */
{
Task_Comps.Run = 0; /* Flag clear 0 */
Task_Comps.TaskHook(); /* Run task */
}
}
}
我们直接放在主循环的后面:
记得去掉void!
下面复习一下:
接着是按键,不能长时间延时!
接着是文件的创建:
记得添加路径:
最重要的是周期性任务调度:
包括结构体的定义: