这是一个非常使用的单片机时间片轮询任务的程序
具有新增任务和删除任务的功能。
新增任务具有一次执行和循环执行两种模式。
// TASKPROCES.h 头文件
#ifndef __TASKPROCES_H__
#define __TASKPROCES_H__
#define TASKS_MAX 10 //最大可运行任务数
typedef void (*TaskHook)(void);
void TaskRemarks(void);
void TaskProcess(void);
void Create_Task(uint16_t Time_Cnt,uint16_t Reload, TaskHook task);
void Delete_Task(TaskHook task);
void Init_TaskList(void);
#endif
在头文件中有一个地方需要注意
#define TASKS_MAX 10 //最大可运行任务数
通过这个宏可以设置本程序可以执行最大多少个任务。
接下来就是 TASKPROCES.c 文件,对这几个函数的具体实现了
// TASKPROCES.c C文件
typedef struct
{
uint8_t Run; // 程序运行标记:0-不运行,1运行 置1时可以运行程序了
uint16_t Timer; // 计时器计数值,看定时器调度时间
uint16_t TimeReset; // 为0时不能重复调用
TaskHook task_handle; // 要运行的任务函数
} TASK_COMPONENTS; // 别名
TASK_COMPONENTS TaskComps[ TASKS_MAX ];
/*******************************************************************************
函 数 名: void Init_TaskList(void)
输入参数:
返回参数:
功能描述: 初始化任务结构体
*******************************************************************************/
void Init_TaskList(void)
{
uint8_t id = 0;
for (id = 0;id < TASKS_MAX; id++)
{
TaskComps[id].Run = FALSE; // 首先停止
TaskComps[id].Timer = 0; // 计数值
TaskComps[id].TimeReset = 0; // 重装值
TaskComps[id].task_handle = 0; // 函数名,指针类型
}
}
/*******************************************************************************
函 数 名: void Create_Task(uint16_t Time_Cnt,uint16_t Reload, TaskHook task)
输入参数:
返回参数:
功能描述: 创建定时任务。
*******************************************************************************/
void Create_Task(uint16_t Time_Cnt,uint16_t Reload, TaskHook task)
{
uint8_t id;
for (id = 0;id < TASKS_MAX; id++)
{
if (TaskComps[id].task_handle == 0)
{ id += 99;}
}
id -= 100;
TaskComps[id].Run = FALSE; // 首先停止
TaskComps[id].Timer = Time_Cnt; // 计数值
TaskComps[id].TimeReset = Reload; // 重装值
TaskComps[id].task_handle = task; // 函数名,指针类型
}
/*******************************************************************************
函 数 名: void Delete_Task(TaskHook task)
输入参数:
返回参数:
功能描述: 删除(取消)定时任务。
*******************************************************************************/
void Delete_Task(TaskHook task)
{
uint8_t id = 0;
if (task == 0)
return;
for (id = 0;id < TASKS_MAX; id++)
{
if (TaskComps[id].task_handle == task)
id += 99;
}
if (id < 100) //没有匹配的任务
return;
id -= 100;
TaskComps[id].Run = FALSE; // 首先停止
TaskComps[id].Timer = 0; // 计数值
TaskComps[id].TimeReset = 0; // 重装值
TaskComps[id].task_handle = 0; // 函数名,指针类型
while ((id + 1) < TASKS_MAX)
{
TaskComps[id].Run = TaskComps[id + 1].Run;
TaskComps[id].Timer = TaskComps[id + 1].Timer;
TaskComps[id].TimeReset = TaskComps[id + 1].TimeReset;
TaskComps[id].task_handle = TaskComps[id + 1].task_handle;
id++;
}
}
/*******************************************************************************
函 数 名: void TaskRemarks(void)
输入参数:
返回参数:
功能描述: 在定时器中断中调用此函数
*******************************************************************************/
void TaskRemarks(void)
{
uint8_t 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].TimeReset; // 恢复计时器值,从新下一次
TaskComps[i].Run = TRUE; // 任务可以运行
}
}
}
}
/*******************************************************************************
函 数 名: TaskProcess()
输入参数:
返回参数:
功能描述: 遍历任务标志
*******************************************************************************/
uint8_t task_cnt = 0;
void TaskProcess(void)
{
if (TaskComps[task_cnt].Run == TRUE) // 时间不为0
{
TaskComps[task_cnt].task_handle(); // 运行任务
TaskComps[task_cnt].Run = FALSE; // 标志清0
}
if (++task_cnt > TASKS_MAX)
task_cnt = 0;
}