#include "TimerTask.h" #include "McuBspTimer.h" #include "WatchDogTask.h" #include "FileSysTask.h" #include #include #include #include typedef struct { unsigned char Enable; // 该定时器事件的使能情况 unsigned char StartOrEnd; // 该定时器事件的开始结束标志 unsigned int Count; // 该定时器事件的循环次数,最大值表示无限循环 unsigned int Period; // 该定时器事件的循环周期 unsigned int RefreshTick; // 该定时器事件的刷新时间 TASK_TIMER_CALLBACK Callback; // 该定时器事件对象的执行 } TASK_TIMER_EVENT; static TASK_TIMER_EVENT TaskTimerEvent[TASK_TIMER_NUM_MAX] = {{0}}; static int gTaskTimerWatchdogId = -1; // 定时器任务的看门狗ID void TaskTimer(void *arg) { char i; unsigned int Realtime; unsigned int RealWbyte; int ret; /* 将定时器任务开启写入日志 */ do { ret = TaskFileLogWrite("TaskTimer: Join in!!\n", strlen("TaskTimer: Join in!!\n"), &RealWbyte); TaskWatchdogFreed(gTaskTimerWatchdogId); OSTimeDly(1); } while (ret > 0); while (1) { for (i = 0; i < TASK_TIMER_NUM_MAX; i++) { if (TaskTimerEvent[i].Enable == 1) { if (TaskTimerEvent[i].StartOrEnd == 0) { continue; } McuBspTimerTick(MCU_BSP_TIMER_0, &Realtime); if (Realtime < TaskTimerEvent[i].RefreshTick) { Realtime = (4294967295u - TaskTimerEvent[i].RefreshTick) + Realtime; } else { Realtime = Realtime - TaskTimerEvent[i].RefreshTick; } if (Realtime / TaskTimerEvent[i].Period > 0) { TaskTimerEvent[i].Callback(); McuBspTimerTick(MCU_BSP_TIMER_0, &Realtime); TaskTimerEvent[i].RefreshTick = Realtime; if (TaskTimerEvent[i].Count == 0xffffffff) { continue; } TaskTimerEvent[i].Count--; if (TaskTimerEvent[i].Count == 0) { TaskTimerEvent[i].StartOrEnd = 0; } } } } TaskWatchdogFreed(gTaskTimerWatchdogId); OSTimeDly(1000); } } void TaskTimerInit(void) { /* 初始化一个定时器为1s */ McuBspTimerInit(MCU_BSP_TIMER_0, 1000); /* 初始化一个1ms定时器 */ McuBspTimerInit(MCU_BSP_TIMER_1, 1); /* 注册看门狗 */ gTaskTimerWatchdogId = TaskWatchdogRegEvent("TaskTimer"); } /* 返回一个从开机开始的毫秒数 */ unsigned int TaskTimerMsTickGet(void) { unsigned int Tick; McuBspTimerTick(MCU_BSP_TIMER_1, &Tick); return Tick; } /* 注册事件 */ int TaskTimerRegEventId(void) { int i; for (i = 0; i < TASK_TIMER_NUM_MAX; i++) { if (TaskTimerEvent[i].Enable != 1) { TaskTimerEvent[i].Enable = 1; return i; } } return -1; } /* 开始执行事件,, period循环周期, count循环次数 */ int TaskTimerStartEvent(int *id, unsigned int period, unsigned int count, TASK_TIMER_CALLBACK callback) { unsigned int Realtime = 0; if ((*id >= TASK_TIMER_NUM_MAX) || (id < 0)) { return -1; } if ((period == 0) || (callback == NULL)) { return -1; } McuBspTimerTick(MCU_BSP_TIMER_0, &Realtime); TaskTimerEvent[*id].Count = count; TaskTimerEvent[*id].Period = period; TaskTimerEvent[*id].Callback = (TASK_TIMER_CALLBACK)callback; TaskTimerEvent[*id].RefreshTick = Realtime; TaskTimerEvent[*id].StartOrEnd = 1; return 0; } /* 停止执行事件 */ int TaskTimerEndEvent(int *id) { if ((*id >= TASK_TIMER_NUM_MAX) || (id < 0)) { return -1; } TaskTimerEvent[*id].StartOrEnd = 0; return 0; } int TaskTimerDelEvent(int *id) { if ((*id >= TASK_TIMER_NUM_MAX) || (id < 0)) { return -1; } TaskTimerEndEvent(id); *id = -1; TaskTimerEvent[*id].Enable = 0; return 0; }