📄 watchdog.c
字号:
/****************************************************************
** *
** FILE : WatchDog.C *
** COPYRIGHT : (c) 2001 .Xiamen Yaxon NetWork CO.LTD *
** *
** *
** By : CCH 2002.1.15 *
****************************************************************/
#include "includes.h"
#include "bsp.h"
#include "tools.h"
#include "errtask.h"
#include "watchdog.h"
#include "errcode.h"
#include "zprint.h"
/*
********************************************************************************
* DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define MAX_CELL 20
#define MAX_LIVETIME 20 * 10 /* UNIT: 100 ms */
/*
********************************************************************************
* DEFINE WCB_STRUCT
********************************************************************************
*/
typedef struct {
INT16U nused;
INT16U b_nused;
INT16U livetime[MAX_CELL];
INT16U b_livetime[MAX_CELL];
} WCB_STRUCT;
/*
********************************************************************************
* DEFINE MODULE VARIANT
********************************************************************************
*/
static WCB_STRUCT wcb;
static OS_STK WatchDogTaskStack[STACK_WATCHDOGTASK];
static void InitWatchDogTask(void)
{
INT8U i;
for (i = 0; i < MAX_CELL; i++) {
wcb.livetime[i] = 0;
wcb.b_livetime[i] = 0;
}
wcb.nused = 0;
wcb.b_nused = 0;
}
static void CheckWatchDog(void)
{
INT8U i, nused;
nused = 0;
for (i = 0; i < MAX_CELL; i++) {
if (wcb.livetime[i] != wcb.b_livetime[i]) ErrExit(ERR_WATCHDOG_MEM);
if (wcb.livetime[i] > 0) {
nused++;
wcb.livetime[i]--;
wcb.b_livetime[i]--;
if (wcb.livetime[i] == 0)
{
ErrExit(ERR_WATCHDOG_OVERFLOW);
}
}
}
if (nused != wcb.nused || nused != wcb.b_nused) ErrExit(ERR_WATCHDOG_MEM);
}
static void WatchDogTask(void *pd)
{
pd = pd;
#if DEBUG_UARTNo_SYSTEM <=1
PrintFromUART(DEBUG_UARTNo_SYSTEM, "启动WatchDogTask......\n");
#endif
InitWatchDogTask();
for (;;) {
OSTimeDly(2);
CheckWatchDog();
ClearWatchdog(); /* clear watch dog */
}
}
INT8U ApplyWatchDogID(void)
{
INT8U i;
for (i = 0; i < MAX_CELL; i++) {
if (wcb.livetime[i] == 0 && wcb.b_livetime[i] == 0) {
wcb.livetime[i] = MAX_LIVETIME;
wcb.b_livetime[i] = MAX_LIVETIME;
wcb.nused++;
wcb.b_nused++;
return i;
}
}
ErrExit(ERR_WATCHDOG_APPLY);
return 0xff;
}
void ResetWatchDog(INT8U id)
{
if (id >= MAX_CELL || wcb.livetime[id] == 0) ErrExit(ERR_WATCHDOG_ID);
OS_ENTER_CRITICAL();
wcb.livetime[id] = MAX_LIVETIME;
wcb.b_livetime[id] = MAX_LIVETIME;
OS_EXIT_CRITICAL();
}
void CreateWatchDogTask(void)
{
OSTaskCreate(WatchDogTask, (void *)0, &WatchDogTaskStack[STACK_WATCHDOGTASK], PRIO_WATCHDOGTASK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -