原文链接:https://blog.csdn.net/weixin_44576486/article/details/108908613?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22108908613%22%2C%22source%22%3A%22qq_45809384%22%7D&ctrtid=0kokB
TimeSlicePolling.h
#ifndef __TIMESLICEPOLLING_H
#define __TIMESLICEPOLLING_H
#include "sys.h"
#include "usart.h"
/******************************************************************************************************
*定时器任务处理函数
*@param
*******************************************************************************************************/
#define TASK_NUM 3 //任务数
//任务结构
typedef struct _TASK_COMPONETS
{
u8 Run ; //程序运行标记
u16 Timer; //定时器
u16 ItvTime; //任务运行间隔
void ( *TaskHook )(void) ; //要运行的任务结构
} TASK_COMPONETS ; //任务组合
//任务清单
typedef enum _TASK_LIST
{
TASK_TEST1 , //按键扫描
TASK_TEST2 , //串口接收
TASK_TEST3 , //LED翻转
} TASK_LIST;
//任务函数
void Task_Test1( void ) ;
void Task_Test2( void ) ;
void Task_Test3( void );
//定义任务结构体变量
extern TASK_COMPONETS TaskComps[TASK_NUM] ;
//任务处理函数
void Task_Process(void ) ;
void Task_timer(void ) ;
void TaskProcess(void);
#endif
TimeSlicePolling.c
#include “TimeSlicePolling.h”
/******************************************************************************************************
*定时器任务处理函数
*@param
*******************************************************************************************************/
void Task_Test1(void )
{
u2_printf(" test=1!\r\n");
}
void Task_Test2( void )
{
u2_printf(" test=2!\r\n");
}
void Task_Test3( void )
{
u2_printf(" test=3!\r\n");
}
//定义任务结构体变量
TASK_COMPONETS TaskComps[TASK_NUM] =
{
{ 0, 2 , 2 , Task_Test1 },
{ 0, 2 , 2 , Task_Test2 },
{ 0, 10 , 10 , Task_Test3 }
};
/**************************************************************************************
* FunctionName : Task_Process()
* Description : 任务处理
**************************************************************************************/
void Task_Process(void )
{
u8 i = 0 ;
for( i = 0 ; i < TASK_NUM ; i++ )
{
if( TaskComps[i].Run) //不为0
{
TaskComps[i].Run = 0 ; //标志清0
TaskComps[i].TaskHook(); //运行函数
}
}
}
/**************************************************************************************
* FunctionName : TaskRemarks()
* Description : 任务标志处理
* EntryParameter : None
* ReturnValue : None
* attention : ***在定时器中断中调用此函数即可***
**************************************************************************************/
void Task_timer(void )
{
u8 i;
for (i=0; i<TASK_NUM; 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 : 任务处理|判断什么时候该执行那一个任务
* EntryParameter : None
* ReturnValue : None
* * attention : ***放在mian的while(1)即可***
**************************************************************************************/
void TaskProcess(void)
{
u8 i;
for (i=0; i<TASK_NUM; i++) // 逐个任务时间处理
{
if (TaskComps[i].Run) // 时间不为0
{
TaskComps[i].TaskHook(); // 运行任务
TaskComps[i].Run = 0; // 标志清0
}
}
}