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

📄 os_wdt.c

📁 C语言源代码及相关资料
💻 C
字号:
/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**                                      
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               OS_WDT.c
** Last modified Date:      
** Last Version:            1.0.0
** Descriptions:            
**
**--------------------------------------------------------------------------------------------------------
** Created by:              
** Created date:            
** Version:                 1.0.0
** Descriptions:            
**
**--------------------------------------------------------------------------------------------------------
** Modified by:             
** Modified date:           
** Version:                 
** Descriptions:            
**
*********************************************************************************************************/

#include    "config.h"
/********************************************************************************************************
  任务监控控制块定义
********************************************************************************************************/

typedef struct watchdog{ 
    uint32  uiTaskID;                                                   /* 任务ID号                     */
    uint8   bRunState;                                                  /* 是否运行看门狗检测程序       */
    uint32  uiCurCnt, uiLastCnt;                                        /* 看门狗计数器                 */ 
} WATCHDOG;

WATCHDOG OSWatchDog[OSMaxTask];                                         /* 看门狗结构体数组             */

uint32  GuiTaskCnt = 0;                                                 /* 受看门狗监控程序监控的任务数 */
 
/********************************************************************************************************
** Function name: OSWatchDogInit
** Descriptions : 看门狗定时器初始化和任务组看门狗结构体初始化
** Input        : timeout           看门狗溢出时间    
** Output       : 无 
** Return       : 无
*********************************************************************************************************/
void OSWatchDogInit(uint32 timeout)
{
    uint32  i;
    char  wdtpara[40] = "ClkSrc=0";                                   /* 看门狗初始化参数,选择内部RC振荡器    */
    char  wdtparaTO[20] = " TimeOut=3000";
    char  wdtparaRE[] = " RstEn=1";
    
    sprintf(wdtparaTO, " TimeOut=%d ", timeout);
    strcat(wdtpara, wdtparaTO);
    strcat(wdtpara, wdtparaRE); 
    WDTInit(WDT0, wdtpara, NULL);                                       /* 看门狗定时器初始化           */
    SetVICIRQ(WDT0_IRQ_CHN, 10, (uint32)WDT0_ISR);                      /* 设置看门狗中断               */
    
    for (i=0; i<OSMaxTask; i++) {                                       /* 任务组看门狗结构体初始化     */
        OSWatchDog[i].uiTaskID = 0;
        OSWatchDog[i].bRunState = FALSE;
        OSWatchDog[i].uiCurCnt = 0;
        OSWatchDog[i].uiLastCnt = 0;   
    }
    
    WDTFeed(WDT0);                                                     /* 启动看门狗                   */
}

/*********************************************************************************************************
** Function name: OSWatchDogCreate
** Descriptions : 建立看门狗监控程序
** Input        : taskid            任务ID号
** Output       : 无 
** Return        : 无
*********************************************************************************************************/
void OSWatchDogCreate(int taskid)
{
    OSWatchDog[GuiTaskCnt].uiTaskID   = taskid;                         /* 保存任务ID号                 */
    OSWatchDog[GuiTaskCnt].bRunState = TRUE;                            /* 置看门狗监控标志             */
    GuiTaskCnt++;                                                       /* 受监控的任务数加1            */
}

/********************************************************************************************************
** Function name: OSWatchDogReset
** Descriptions : 看门狗软件复位
** Input        : taskid            任务ID号
** Output       : 无 
** Return       : 操作信息
*********************************************************************************************************/
uint32 OSWatchDogReset(int taskid)
{
    uint32  i;
    
    for (i=0; i<GuiTaskCnt; i++) {
        if (taskid == OSWatchDog[i].uiTaskID) {                           /* 找到对应的ID号               */
            if (TRUE == OSWatchDog[i].bRunState) {                        /* 看门狗处于监控状态           */
                OSWatchDog[i].uiCurCnt++;                                 /* 计数器加1                    */
                return WATCHDOG_SUCCESS;
            }
            else
                return WATCHDOG_NOTRUN;                                 /* 任务未处于看门狗监控状态     */
        }
    } 
    
    if (i >= GuiTaskCnt) {
        return WATCHDOG_ERRORID;                                        /* 任务ID有误                   */
    }
}

/********************************************************************************************************
** Function name: OSWatchDogDelete
** Descriptions : 删除看门狗监控程序
** Input        : taskid            任务ID号
** Output       : 无 
** Return       : 操作信息
*********************************************************************************************************/
uint32 OSWatchDogDelete(int taskid)
{
    uint32  i;
    
    for (i=0; i<GuiTaskCnt; i++) {
        if (taskid == OSWatchDog[i].uiTaskID) {                         /* 找到对应的ID号               */
            if (TRUE == OSWatchDog[i].bRunState) {                      /* 任务处于看门狗监控状态       */
                OSWatchDog[i].bRunState = FALSE;                        /* 禁止看门狗监控程序           */
                GuiTaskCnt--;                                           /* 看门狗监控任务数减1		    */
                return WATCHDOG_SUCCESS;                                /* 看门狗操作成功               */
            }
            else {
                return WATCHDOG_NOTRUN;                                 /* 任务未处于看门狗监控状态     */
            }
        }
    } 
    
    if (i >= GuiTaskCnt) {
        return WATCHDOG_ERRORID;                                        /* 任务ID有误                   */ 
    }
}

/********************************************************************************************************
** Function name: OSWatchDogMonitor
** Descriptions : 看门狗监控程序,如果任务运行正常,则"喂狗",否则停止"喂狗",串口上传故障任务信息
** Input        : 无
** Output       : 无 
** Return       : 无
*********************************************************************************************************/
void OSWatchDogMonitor(void)
{
    uint32  i;
    uint32  uiTaskNatural;                                              /* 任务运行标志(1:正常)      */
    char    cSendData[40];
    
    uiTaskNatural = TRUE;
    for (i=0; i<GuiTaskCnt; i++) {
        if (TRUE == OSWatchDog[i].bRunState) {                          /* 任务处于看门狗监控状态       */
            if (OSWatchDog[i].uiLastCnt == OSWatchDog[i].uiCurCnt) {    /* 当前计数与上次计数相同       */
                uiTaskNatural = FALSE;                                  /* 任务故障                     */
                                                                        /* 故障任务信息打印             */
                sprintf(cSendData, "Task ID: %d fail!\r\n", OSWatchDog[i].uiTaskID);
                UartWrite(UART0, (uint8 *)cSendData, sizeof("Task ID: %d fail!\r\n"), NULL);
                for(i=0; i<0xff; i++);
            } else {
                OSWatchDog[i].uiLastCnt = OSWatchDog[i].uiCurCnt;       /* 保存当前计数                 */
            }
        }
    }
    
    if(uiTaskNatural) {                                                 /* 任务正常运行,则进行喂狗     */
        WDTFeed(WDT0); 
    }  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -