⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 watchdog.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 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 + -