#task
#include "task.h"
#if (!USE_HAL)
static uint32_t _systickCounter;
#endif
static taskCb_t taskTab[MAX_TASK_NUM] = {0};
/********************************************************************************
Description: 系统滴答中断 1ms
*********************************************************************************/
#if (!USE_HAL)
void SysTick_Handler(void)
{
_systickCounter++;
}
#endif
/********************************************************************************
Description: 获取系统滴答
*********************************************************************************/
#if (!USE_HAL)
uint32_t getSysTick(void)
{
return _systickCounter;
}
#endif
/********************************************************************************
Description: 注册任务
*********************************************************************************/
uint8_t taskRegister(void(*cb)(), uint32_t period)
{
uint8_t i;
for (i = 0; i < (sizeof(taskTab) / sizeof(taskCb_t)); i++)
{
if(taskTab[i].fun == NULL)
{
taskTab[i].fun = cb;
taskTab[i].period = period;
return 1;
}
}
return 0;
}
/********************************************************************************
Description: 注销任务
*********************************************************************************/
uint8_t taskUnRegister(void(*cb)())
{
uint8_t i;
for (i = 0; i < (sizeof(taskTab) / sizeof(taskCb_t)); i++)
{
if(taskTab[i].fun == cb)
{
memset((void *)&taskTab[i], 0, sizeof(taskCb_t));
return 1;
}
}
return 0;
}
/********************************************************************************
Description: 运行任务
*********************************************************************************/
uint8_t taskRun(void)
{
uint8_t i;
for (i = 0; i < (sizeof(taskTab) / sizeof(taskCb_t)); i++)
{
if(taskTab[i].fun != NULL)
{
#if (!USE_HAL)
taskTab[i].currentTick = _systickCounter;
#else
taskTab[i].currentTick = HAL_GetTick();
#endif
if(taskTab[i].currentTick > taskTab[i].lastTick)
{
if( taskTab[i].currentTick - taskTab[i].lastTick >= taskTab[i].period )
{
taskTab[i].lastTick = taskTab[i].currentTick;
taskTab[i].fun();
return 1;
}
}
}
}
return 0;
}
//task.h
#ifndef __TASK_H__
#define __TASK_H__
#include "stdint.h"
//#include "stdbool.h"
#include "string.h"
#include "main.h"
#define USE_HAL 0 //使用Hal库
typedef struct
{
uint32_t currentTick;
uint32_t lastTick;
uint32_t period;
void(*fun)(void);
} taskCb_t;
#define MAX_TASK_NUM 10
extern uint8_t taskRegister(void(*cb)(), uint32_t period);
extern uint8_t taskUnRegister(void(*cb)());
extern uint8_t taskRun(void);
#if (!USE_HAL)
extern uint32_t getSysTick(void);
void SysTick_Handler(void);
#endif
#endif