📄 os_wdt.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 + -