看门狗是什么
看门狗(Watchdog)是一种用于监控系统运行状态的保护机制,广泛应用于电子设备、嵌入式系统和计算机领域。
看门狗的主要作用
防止程序失控 当系统因电磁干扰或软件漏洞陷入死循环时,看门狗通过超时检测强制重启,避免系统长时间停滞
提升系统可靠性 在无人值守的嵌入式设备(如智能家居控制器、工业传感器)中,看门狗可确保设备长期稳定运行,减少人工干预需求
应对突发故障 在服务器或汽车电子系统中,看门狗能快速响应硬件故障(如CPU过载、内存泄漏),触发应急措施(如降频、切换备用模块)
程序代码
#include "DSP2833x_Device.h" #include "DSP2833x_Examples.h"
/****************************************************************************** * 函 数 名 : DogInit * 函数功能 : 看门狗初始化 * 形 参 : 无 * 返 回 值 : 无 *******************************************************************************/ void DogInit(void)//看门狗初始化 { EALLOW; SysCtrlRegs.WDCR= 0x002F;//使能看门狗,计数周期约279.62ms(超过279.62ms不喂狗就产生复位) EDIS; /* 计数周期计算方法(单位:秒): 256/( OSCCLK/512/ (2的(k-1)次方) ) * * OSCCLK代表时钟源频率,本开发板是由外部30Mhz晶振提供的,所以在这里OSCCLK为30M * * k代表WDCR寄存器后三位的十进制值,在本例为二进制111也就是十进制值7 */ }
/****************************************************************************** * 函 数 名 : FeedDogs * 函数功能 : 喂狗 * 形 参 : 无 * 返 回 值 : 无 *******************************************************************************/ void FeedDogs(void) { //必须要先向WDKEY写入0X55,紧接着写入0xAA,否则喂狗失败;没有任何原因,手册规定的 EALLOW; SysCtrlRegs.WDKEY=0x55; SysCtrlRegs.WDKEY=0xAA; EDIS; }
/****************************************************************************** * 函 数 名 : main * 函数功能 : 主函数 * 形 参 : 无 * 返 回 值 : 无 *******************************************************************************/ void main(void) { InitSysCtrl(); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable();
DogInit();//看门狗初始化
while(1) { FeedDogs();//喂狗 DELAY_US(278000);//延时278ms } }
测试方法
1、因为本程序是下载存放到芯片RAM存储区,不必担心锁芯片的问题,所以可以直接在CCS软件里用debug调试的方法测试程序
2、通过上述代码注释可以知道此程序设置了279.62ms的看门狗,所以也就意味着必须要在这段时间内喂一次狗,否则就复位,主函数循环里面放278ms延时,也就是间隔278ms喂一次狗,可以看到我debug全速运行程序、暂停、一切正常,如下两图
3、当把喂狗的时间间隔改成280ms的时候,已经超过了设置的279.62ms喂狗时间,debug一全速运行、再点暂停就能看到程序崩溃了,因为CCS软件在debug的途中芯片被复位了,所以可以判断出是因为没有按时喂狗,导致看门狗触发了芯片复位,如下两图可以看到debug崩溃
源程序下载链接
链接:https://pan.baidu.com/s/1MBzlATcGcwtV3WskP2wEZg?pwd=2d0g 提取码:2d0g