什么叫看门狗测试
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么叫看门狗测试相关的知识,希望对你有一定的参考价值。
什么叫看门狗测试:看门狗分硬件看门狗和软件看门狗。硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零(俗称“喂狗”),因此程序正常工作时,定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不在定时周期内复位看门狗,就使得看门狗定时器溢出产生复位信号并重启系统。软件看门狗原理上一样,只是将硬件电路上的定时器用处理器的内部定时器代替,这样可以简化硬件电路设计,但在可靠性方面不如硬件定时器,比如系统内部定时器自身发生故障就无法检测到。当然也有通过双定时器相互监视,这不仅加大系统开销,也不能解决全部问题,比如中断系统故障导致定时器中断失效。 看门狗本身不是用来解决系统出现的问题,在调试过程中发现的故障应该要查改设计本身的错误。加入看门狗目的是对一些程序潜在错误和恶劣环境干扰等因素导致系统死机而在无人干预情况下自动恢复系统正常工作状态。看门狗也不能完全避免故障造成的损失,毕竟从发现故障到系统复位恢复正常这段时间内怠工。同时一些系统也需要复位前保护现场数据,重启后恢复现场数据,这可能也需要一笔软硬件的开销。 参考技术A 1. 看门狗相当于一个定时器,这个定时器在启用看门狗时开始计数,如果到了一定时间还未清看门狗,则看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。(实际可以想象成先复位系统,然后PC指向看门狗中断向量所保存的看门狗中断服务程序地址)。2. 发生看门狗溢出之后会PC将指向中断向量表中看门狗中断向量所保存的地址,并且CCR(系统状态寄存器,相当于PSW)中的I标志位为1,因此若要使用中断,在main函数中应该清除I标志位。并且,看门狗中断是不可屏蔽的。(这和中断相似,但要注意,看门狗中断是不可屏蔽的)。
3. 看门狗中断将引起系统复位,因此,所有系统寄存器将被复位成默认值,因此所有外设都已经变成了未初始化状态,若要继续使用外设,需要重新初始化外设。PC则复位成看门狗中断向量所保存的看门狗中断程序地址。
4. 需要注意的是,RAM的内容是不能掉电保持的,因此上电复位之后RAM里的内容是不确定的(系统寄存器占用的RAM除外),而看门狗复位并没有导致掉电,因此RAM里的内容还是以前的值(系统寄存器占用的RAM除外)。
5. 上电复位后,PC实际指向的是IDE自动生成的启动代码,这段启动代码负责为支持C语言做准备,具体工作有:初始化堆栈,初始化全局变量和静态变量等。因此,如果没有特殊情况需要处理,我们在看门狗中断中也应该直接跳转到启动代码(而不是main函数),或者把掉电复位的中断服务程序也安装给看门狗中断向量(通过修改Project.prm实现)。
6. 看门狗计数器不仅会超时溢出产生复位,当未按规定顺序写看门狗寄存器或者写错误的值时,将马上产生看门狗复位。
X5045看门狗 功能
#include <reg51.h>#define uchar unsigned char
#define WRSRb 0X01 //写状态寄存器指令;
#define WRITEb 0X02 //写数据指令;
#define READb 0X03 //读数据指令;
#define WRDIb 0X04 //禁止写操作指令;
#define RDSRb 0X05 //读状态寄存器指令;
#define WRENb 0X06 //允许写操作指令;
#define WAIT_TIM 200 //等待时间常数;
sbit SO =P2^0; //串行数据输出端
sbit SI =P2^1; //串行数据输入端
sbit SCK =P2^2; //串行时钟端
sbit CS =P2^3; //片选端
void X5045_Rst(); //复位看门狗
void X5045_Wren_Cmd(void); //允许写操作指令函数;
void X5045_Wrdi_Cmd(void); //禁止写操作指令函数;
void X5045_Write(uchar dt); //写一个字节数据函数;
uchar X5045_Read(voX5045_id); //读一个字节数据函数;
uchar X5045_Read_State(void); //读状态控制字函数;
void X5045_Write_State(uchar dt);//写状态控制字函数;
void X5045_Read_Nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr); //读n个字节数据函数;
void X5045_Write_Nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr); //写n个字节数据函数;
void X5045_Wait_End(uchar run_times);//等待函数;
//函数定义;
void X5045_Rst() //复位看门狗
CS=0;
CS=1;
//在写数据到x5045前 写入允许写操作指令字;
void X5045_Wren_Cmd(void) //向X5045写入允许写操作指令字;
CS=1; //
SCK=0; //
CS=0; //片选有效
write(WRENb); //写入允许写操作指令字
CS=1; //片选无效
SCK=0;
void X5045_Wrdi_Cmd(void) //向X5045写入禁止写操作指令字;
CS=1; //
SCK=0; //
CS=0; //片选有效
write(WRDIb); //写入禁止写操作指令字
CS=1; //片选无效
SCK=0;
//make clk for send data
void X5045_Write(uchar dt) //向X5045写入一个字节数据
uchar i;
for(i=0;i<8;i++) //8位
SCK=0;
SI=(bit)(dt&0x80); //先发高位
SCK=1; //上升沿锁存
dt=dt<<1; //左移
SI=0;
//make clk for receive data
uchar X5045_Read(void) //从X5045读一个字节数据;
uchar i;
uchar dt=0; //清0
SO=1;
for(i=0;i<8;i++) //8位
SCK=1;
SCK=0;
dt=dt<<1; //左移
if(SO) dt++; //数据线为1 则数据加1 为0不处理
return dt;
//5045状态寄存器读出程序
//X5045状态控制字:
//BIT: 7 6 5 4 3 2 1 0
// x x WD1 WD0 BL1 BL0 WEL WIP
//WIP:0---正在写操作;
// 1---写操作完成;
//WEL:0---写使能锁存器复位;
// 1---写使能锁存器置位;
//BL1 BL0:
// 00--不保护;
// 01--保护:01H--180H--1FFH;
// 10--保护:100H--1FFH;
// 11--保护:000H--1FFH;
//WD1 WD0:
// 00--1.4秒;
// 01--600毫秒;
// 10--200毫秒;
// 11--禁止看门狗;
//read state word from x5045;
uchar X5045_Read_State(void)
//从X5045读状态控制字;
uchar dt;
X5045_Wren_Cmd(); //向X5045写入允许写操作指令字;
CS=1;
SCK=0;
CS=0;
X5045_Write(RDSRb); //写读状态寄存器指令
dt=X5045_Read(); //读状态寄存器
SCK=0;
CS=1;
return dt;
//write state word to x5045 before do somthing;
void X5045_Write_State(uchar dt) //向X5045写状态控制字;
X5045_Wren_Cmd(); //向X5045写入允许写操作指令字
CS=1;
SCK=0;
CS=0;
X5045_Write(WRSRb); //写读状态寄存器指令
X5045_Write(dt); //写状态寄存器
SCK=0;
CS=1;
wait_end(WAIT_TIM);
//read n uchars from x5045;
void X5045_Read_Nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr)//读n个字节数据函数;
/*bit bA8,//选择EPROM上半部分/下半部分
uchar adr_L,//从EPROM中什么地址开始读;
uchar n, //要读的字节数;
uchar *adr)//所读的数据从什么地址开始存放;*/
//从X5045读n个字节数据;
uchar i ;
CS=1;
SCK=0;
CS=0;
X5045_Write(bA8?READb|0x08:READb);//选择EPROM上半/下半部分
X5045_Write(adr_L); //写EPROM中地址;
for(i=0;i<n;i++) //要读n个字节;
*adr=X5045_Read(); //读数据
adr++; //地址调整
SCK=0;
CS=1;
//write n uchars to x5045;//向X5045写n个字节数据;
void X5045_Write_Nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr)//写n个字节数据函数;
/*bit bA8,//选择EPROM上半部分/下半部分;
uchar adr_L,//从EPROM中什么地址开始写;
uchar n,//要写的字节数;
uchar *adr)//从什么地址开始取数据写;*/
uchar i ;
EA=0;
X5045_Wren_Cmd(); //向X5045写入允许写操作指令字
CS=1;
SCK=0;
CS=0;
X5045_Write(bA8?WRITEb|0x08:WRITEb);//选择EPROM上半/下半部分
X5045_Write(adr_L); //写EPROM中地址;
for(i=0;i<n;i++) //要写n个字节;
X5045_Write(*adr); //写数据
adr++; //地址调整
SCK=0;
CS=1;
X5045_Wait_End(WAIT_TIM); //写等待时间
EA=1;
// wait for be sure to complete
void X5045_Wait_End(uchar run_times)//等待向X5045写操作完成;
register uchar dt=0;
while(run_times--)
dt=X5045_Read_State(); //读状态
if(dt&0x01==0)
break;
参考技术A X5045中的看门狗对系统提供了保护功能。当系统发生故障而超过设置时间时,电路中的看门狗将通过RESET信号向CPU 作出反应
以上是关于什么叫看门狗测试的主要内容,如果未能解决你的问题,请参考以下文章