20230201_1811_emb/1811Project_LPc/Src/Usr/Task/Task-DianZiCang/TimerTask.c
Rjh913828050 78f3903d1d 类型:重构
内容:1811项目下位机软件第一版完整程序
人员:任家豪
2023-10-08 13:56:23 +08:00

134 lines
3.9 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;
/* 将定时器任务开启写入日志 */
TaskFileLogWrite("TaskTimer: Join in!!\n", strlen("TaskTimer: Join in!!\n"), &RealWbyte);
while (1) {
TaskWatchdogFreed(gTaskTimerWatchdogId);
OSTimeDly(1000);
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;
}
}
}
}
}
}
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;
}