138 lines
4.0 KiB
C
138 lines
4.0 KiB
C
#include "TimerTask.h"
|
|
#include "McuBspTimer.h"
|
|
|
|
#include "WatchDogTask.h"
|
|
#include "FileSysTask.h"
|
|
|
|
#include <cpu.h>
|
|
#include <os.h>
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
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;
|
|
}
|