// 定义定时器结构体
typedef struct {
uint32_t interval; // 定时器的时间间隔
void (*callback)(); // 定时器到达时间后需要执行的函数
uint32_t start_time; // 定时器的开始时间
int8_t is_running; // 定时器是否正在运行
int8_t is_periodic;
} Timer;
// 定义定时器数组,用于存储多个定时任务
#define MAX_TIMERS 10
Timer timers[MAX_TIMERS];
uint32_t bsp_GetRunTime(void)//获取运行时间
{
return xTaskGetTickCount();//这里给到一个从系统获得的时基计数(跑操作系统或分时调度都可取到,用1ms的时基下建立个计数器即可)
}
uint32_t bsp_CheckRunTime(uint32_t _LastTime)//比较当前时间和上一次时间返回差值
{
uint32_t now_time;
uint32_t time_diff;
now_time = xTaskGetTickCount();
if (now_time >= _LastTime)
{
time_diff = now_time - _LastTime;
}
else
{
time_diff = _LastTime - now_time;
time_diff = 0xFFFFFFFF - time_diff;
}
return time_diff;
}
// 定义定时器中断函数
void timer_interrupt(void) {
// 遍历所有的定时器
for (int i = 0; i < MAX_TIMERS; i++) {
// 如果定时器正在运行,并且当前时间大于等于定时器的开始时间加上定时器的时间间隔
if (timers[i].is_running && bsp_CheckRunTime(timers[i].start_time)>=timers[i].interval) {
// 执行定时器的回调函数
timers[i].callback();
// 如果是只执行一次的定时器,则停止定时器
if (timers[i].is_periodic == 0) {
timers[i].is_running = 0;
} else {
// 如果是周期循环执行的定时器,则重新计算定时器的开始时间
timers[i].start_time = bsp_GetRunTime();
}
}
}
}
// 定义启动定时器的函数
void start_timer(unsigned long interval, void (*callback)(), int is_periodic, int *timer_id) {
// 获取当前系统时间
uint32_t current_time = bsp_GetRunTime();
// 遍历所有的定时器,找到第一个没有正在运行的定时器
for (int i = 0; i < MAX_TIMERS; i++) {
if (!timers[i].is_running) {
// 启动定时器
timers[i].interval = interval;
timers[i].callback = callback;
timers[i].start_time = current_time;
timers[i].is_running = 1;
timers[i].is_periodic = is_periodic;
// 返回定时器的ID
*timer_id = i;
break;
}
}
}
// 定义停止定时器的函数
void stop_timer(int timer_id) {
// 根据定时器ID停止定时器
if (timer_id >= 0 && timer_id < MAX_TIMERS) {
timers[timer_id].is_running = 0;
}
}
调用:
// 启动一个定时任务,隔60000毫秒执行一次autoStart函数,只执行一次
start_timer(60000, autoStart, 0, &autoOntimer_id);
// 启动一个定时任务,隔30000毫秒执行一次WrErrorFlag函数,循环执行
start_timer(30000, WrErrorFlag, 1 ,&errortimer_id);