86 lines
2.4 KiB
C
86 lines
2.4 KiB
C
#include "WatchDogTask.h"
|
||
#include "FileSysTask.h"
|
||
|
||
#include "McuBspWatchdog.h"
|
||
|
||
#include <cpu.h>
|
||
#include <os.h>
|
||
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
|
||
typedef struct {
|
||
unsigned char TaskWatchdogTime; // 单位,S
|
||
unsigned char TaskWatcbdogEnable; // 看门狗事件使能
|
||
char TaskName[64]; // 注册该看门狗事件的任务名称
|
||
} TASK_WATCHDOG_EVENT;
|
||
|
||
static TASK_WATCHDOG_EVENT gTaskWatchdogSta[TASK_WATCHDOG_NUM_MAX] = {{0}}; // 事件池
|
||
static unsigned char gTaskWatchdogTimeOut = 0; // 看门狗超时
|
||
|
||
void TaskWatchDog(void *arg)
|
||
{
|
||
char i;
|
||
unsigned int RealWbyte;
|
||
/* 将看门狗任务开启写入日志 */
|
||
TaskFileLogWrite("TaskWatchDog: Join in!!\n", strlen("TaskWatchDog: Join in!!\n"), &RealWbyte);
|
||
while (1) {
|
||
for (i = 0; i < TASK_WATCHDOG_NUM_MAX; i++) {
|
||
if (gTaskWatchdogSta[i].TaskWatcbdogEnable == 1) {
|
||
gTaskWatchdogSta[i].TaskWatchdogTime++;
|
||
if (gTaskWatchdogSta[i].TaskWatchdogTime > 60) {
|
||
/* 将程序跑飞的任务ID写入日志文件 */
|
||
char LogData[64] = {0};
|
||
sprintf(LogData, "TaskWatchDog: %s fleet!!\n", gTaskWatchdogSta[i].TaskName);
|
||
TaskFileLogWrite(LogData, strlen(LogData), &RealWbyte);
|
||
gTaskWatchdogTimeOut = 1;
|
||
}
|
||
}
|
||
}
|
||
if (gTaskWatchdogTimeOut == 1) {
|
||
McuBspWatchdogStopFreedWatchdog();
|
||
} else {
|
||
McuBspWatchdogFreedWatchdog();
|
||
}
|
||
OSTimeDly(1000);
|
||
}
|
||
}
|
||
|
||
void TaskWatchdogInit(void)
|
||
{
|
||
McuBspWatchdogInit();
|
||
}
|
||
|
||
void TaskWatchDogRestart(void)
|
||
{
|
||
gTaskWatchdogTimeOut = 1;
|
||
}
|
||
|
||
int TaskWatchdogRegEvent(const char *TaskName)
|
||
{
|
||
int8_t i;
|
||
if (TaskName == NULL) {
|
||
return -1;
|
||
}
|
||
for (i = 0; i < TASK_WATCHDOG_NUM_MAX; i++) {
|
||
if (gTaskWatchdogSta[i].TaskWatcbdogEnable != 1) {
|
||
gTaskWatchdogSta[i].TaskWatchdogTime = 0;
|
||
gTaskWatchdogSta[i].TaskWatcbdogEnable = 1;
|
||
memcpy(gTaskWatchdogSta[i].TaskName, TaskName, strlen(TaskName));
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
int TaskWatchdogFreed(int8_t id)
|
||
{
|
||
if ((id >= TASK_WATCHDOG_NUM_MAX) || (id < 0)) {
|
||
return -1;
|
||
}
|
||
if (gTaskWatchdogSta[id].TaskWatcbdogEnable == 1) {
|
||
gTaskWatchdogSta[id].TaskWatchdogTime = 0;
|
||
}
|
||
return 0;
|
||
}
|