一、前言
为了方便理解和查阅本人所需的知识,在此做笔记。
二、框架
1.任务结构
typedef struct _TASK_COMPONENTS
{
uint8 Run; // 程序运行标记:0-不运行,1运行
uint8 Timer; // 计时器
uint8 *ItvTime; // 任务运行间隔时间
void (*TaskHook)(void); // 要运行的任务函数
} TASK_COMPONENTS; // 任务定义
2.任务运行标志出来,此函数就相当于中断服务函数
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; // 任务可以运行
}
}
}
}
3.任务处理
void TaskProcess(void)
{
uint8 i;
for (i = 0; i < TASKS_MAX; i++) // 逐个任务时间处理
{
if (TaskComps[i].Run) // 时间不为0
{
if(NULL != TaskComps[i].TaskHook)
{
TaskComps[i].TaskHook(); // 运行任务
}
TaskComps[i].Run = 0; // 标志清0
}
}
}
4.任务列表
static TASK_COMPONENTS TaskComps[] =
{
{0, 60, (uint32*)&TaskDisplayTime, TaskDisplayClock}, // 显示时钟
{0, 20, 20, TaskKeySan}, // 按键扫描
{0, 30, 30, TaskDispStatus}, // 显示工作状态
// 这里添加你的任务。。。。
};
5.任务清单
typedef enum _TASK_LIST
{
TAST_DISP_CLOCK, // 显示时钟
TAST_KEY_SAN, // 按键扫描
TASK_DISP_WS, // 工作状态显示
// 这里添加你的任务。。。。
TASKS_MAX // 总的可供分配的定时任务数目
} TASK_LIST;
6.中断
void TIM_IRQHandler (void)
{
if ( TIM_GetITStatus( TIM, TIM_IT_Update) != RESET ) //确保是否产生了中断
{
TaskRemarks();
TIM_ClearITPendingBit(TIM , TIM_IT_Update); //清除中断标志
}
}
7.主函数
int main(void)
{
InitSys(); // 初始化
while (1)
{
TaskProcess(); // 任务处理
}
}