国内老牌的广州网站建设,济南网站设计开发,广州推广优化,wordpress qq 微博一直以来对于嵌入式中的watch dog#xff08;看门狗#xff09;都比较陌生#xff0c;一直都不知道它到底是做什么的#xff0c;单从名字上看也不知其所以然#xff0c;然后就在网上找到了一篇blog#xff0c;就是再说看门狗的作用和概述#xff0c;原文如下#xff1a… 一直以来对于嵌入式中的watch dog看门狗都比较陌生一直都不知道它到底是做什么的单从名字上看也不知其所以然然后就在网上找到了一篇blog就是再说看门狗的作用和概述原文如下 1、概述 WATCHDOG对于没有底层开发经验的开发人员来说可能比较陌生但是它在系统起到非常重要的作用相当于系统警察当系统发生严重错误如程序进入死循环等不能 恢复的时候WATCHDOG能够让系统重启。WATCHDOG的应用主要是在嵌入式操作系统中避免了系统在无人干预时长时间挂起的情况。 2、WATCHDOG模块 在比较高档的嵌入式硬件芯片中都有一个WATCHDOG模块如果在MCU/MPU中没有集成WATCHDOG一般会在此嵌入式系统中加一个专门的WATCHDOG芯片来实现WATCHDOG机制。此模块主要的功能包括 1、提供WATCHDOG控制寄存器和配置寄存器供软件开发人员根据系统需要进行灵活配置。 2、提供一接口使应用软件能够定时给WATCHDOG“喂狗”。 3、提供WATCHDOG机制当系统进入不可恢复错误时能产生一个不可屏蔽中断来通知系统自动重启一般这样也有改变为其他处理方式的只有相应的复位信号才能清除它。 3、WATCHDOG的实现方式 对于WATCHDOG模块的实现不同的硬件芯片有不同的方式这里介绍2中工作方式 1、利用系统操作系统时钟来实现WATCHDOG 在Intel XScale系列中利用了操作系统时钟的比较寄存器3OSMR3做为WATCHDOG的运行主体当系统的WATCHDOG激活后软件就必须在一定时间内从OSMR3读出当前的计数然后加上一定的计数值下一次到期的计数值再写回到OSMR3中软件一直周期性的重复这个过程如果软件没有重新写入新的计数使定时器到期此OSMR3会利用一个GPIO触发系统复位。 2、芯片的专门WATCHDOG模块 对于现在的很多芯片已经集成了专门的WATCHDOG模块比如ARM11的芯片WATCHDOG模块中提供了比较灵活的配置和控制机制 A、宽范围设置过期时间间隔,从0。5秒到128秒可以用户配置 B、可以灵活配置在低功耗下使用或者停止WATCHDOG功能 C、可以灵活配置在DEBUG等状态下使用或者停止WATCHDOG功能 根据不同的系统设置好相应的寄存器激活WATCHDOG后需要应用程序周期性的服务WATCHDOG即我们所说的“喂狗”对于 WATCHDOG模块需要定时向Watchdog Service Register按顺序写入0x5555,0xaaaa.一般 在WATCHDOG模块中还会提供Watchdog Reset Status Register从中可以找到复位的具体原因。 3、单片机的WATCHDOG实现 许多单片机片内自带看门狗电路单片机复位时将片内自带看门狗电路禁止只有当程序访问该电路时电路启动。如51系列单片机对SFR中的0A6H 地址顺序写入01EH、#0E1H而96系列单片机则对SFR中的0A6H地址顺序写入1EH、#0E1H工控主机板上看门狗电路本身并不要求复位后重新启动但BIOS在复位后将板上看门狗禁止启动和喂狗方法与单片机相同。如研祥的FSC-1713主板在WatchDog编程状态只要执行如下两条指令 outportb(0x2e,0xf6) outportb(0x2f,TIME-OUT-VALUE)
可实现WatchDog的启停其中TIME-OUT-VALUE ≠0启动TIME-OUT-VALUE 0停止[2] 。能够用指令禁止看门狗是为了适应用户程序开发阶段的需要这同时给看门狗启动和运行失败留下了后门在看门狗启动时或启动前遇干扰而使程序跑飞则看门狗启动失败无法行使监控职能。 4、结论 WATCHDOG在嵌入式系统中发挥着非常重要的作用其实现方式也千差万别根据不同的硬件设计可以选用不同的WATCHDOG但它们的作用是一样的保证系统在出现不可恢复错误时能够自动让系统重启。
参考资料
1.Intel XScale Pocessor Developers Manual
2.Arm11 芯片用户手册
3.WatchDog失效机理与对策研究 以上就是原文对我理解看门狗有一定的帮助也希望能够帮助大家。 linux嵌入式系统开发之看门狗---应用篇 “小涛哥你的这个什么板子是不是坏了啊为啥老是重启好奇怪啊….”小王好奇的指着我心爱的板子说。
“笨死啦没看到吗 我昨天化了一上午写的一个看门狗程序…”我生气而又无奈的说。
“等等啥看门狗我听过哈巴狗牡羊狗落水狗流浪狗还就是没听说过你的说的那个啥子 看门狗 ”小王嘴一噘锁“哼你是看我不懂忽悠我的吧”..
“切不懂就是不懂这还就是你没听过的 看门狗 ”我故意提高了音调说。 算啦也不卖官腔了开始今天的课程----linux嵌入式系统开发之看门狗----应用篇。 话说这个看门狗还真是形象。什么个意思呢就是一直“狗”它会盯着系统的定时器如果定时器的时间值到了你还没有喂它东西的话它肯定就不爽了就把你的系统重启惩罚一下你为啥这么久了不喂它东西吃。所以嘛为了保持系统正常运行就要在定时器到之前不断的喂它东西吃贿赂一下它。 回到这个程序为了不是看门狗叫重启咱们的电脑就不断地要从终端输入字符来喂狗清空定时器让计时值总是从0开始计数这样的话就可以保持狗不会饥饿也就不会重启我们的电脑了。不多说了咱们结合代码来详细介绍。
必要的头文件#include stdio.h #include stdlib.h #include string.h #include sys/types.h #include sys/stat.h #include unistd.h #include fcntl.h #include sys/ioctl.h #include errno.h #include sys/time.h #include unistd.h #include time.h #include getopt.h #include sys/signal.h #include termios.h struct watchdog_info{ unsigned int options; //options the card/driver supprots 19 unsigned int firmware_version; //firmcard version of the card unsigned char identity[32]; //identity of the board 21 };
#define WATCHDOG_IOCTL_BASE W #define WDIOC_GETSUPPORT _IOR(WATCHDOG_IOCTL_BASE, 0, struct watchdog_info) #define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int) #define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int) 27 #define WDIOS_DISABLECARD 0x0001 /* Turn off the watchdog timer */ #define WDIOS_ENABLECARD 0x0002 /* Turn on the watchdog timer */ #define WDIOC_SETOPTIONS _IOR(WATCHDOG_IOCTL_BASE, 4, int) #define WDIOC_KEEPALIVE _IOR(WATCHDOG_IOCTL_BASE, 5, int)
int Getch (void) //无回显的从屏幕输入字符来达到喂狗的目的 { int ch; struct termios oldt, newt; //终端设备结构体 tcgetattr(STDIN_FILENO, oldt); //获得终端属性 newt oldt; newt.c_lflag ~(ECHO|ICANON); //设置无回显属性 tcsetattr(STDIN_FILENO, TCSANOW, newt); //设置新的终端属性 ch getchar(); //从键盘输入一个数据 tcsetattr(STDIN_FILENO, TCSANOW, oldt); //恢复终端设备初始设置 return ch; } //suspend some seconds int zsleep(int millisecond) { unsigned long usec; usec1000*millisecond; usleep(usec); //睡眠usec秒 } int Init() { int fd; //open device file fd open(/dev/watchdog,O_RDWR); //打开看门狗设备 if(fd 0) { printf(device open fail\n); return -1; } return fd; }
int main(int argc,char **argv) { int fd,ch; int i,j; char c; struct watchdog_info wi; fdInit(); //打开终端看门狗设备 //读板卡信息但不常用 ioctl(fd,WDIOC_GETSUPPORT,wi); printf(%d,%s\n,wi.options,wi.identity); //读看门狗溢出时间默认是5s //重新设置时间为10s i5; printf(%d\n,ioctl(fd,WDIOC_SETTIMEOUT,i)); //读新的设置时间 printf(%d\n,ioctl(fd,WDIOC_GETTIMEOUT,i)); printf(%d\n,i); //看门狗开始和停止工作打开和关闭设备具有同样的功能 //关闭 iWDIOS_DISABLECARD; printf(%d\n,ioctl(fd,WDIOC_SETOPTIONS,i)); //打开 iWDIOS_ENABLECARD; printf(%d\n,ioctl(fd,WDIOC_SETOPTIONS,i)); while(1) { zsleep(100); if((cGetch())!27){ //输入如果不是ESC就喂狗否则不喂狗到时间后系统重启 ioctl(fd,WDIOC_KEEPALIVE,NULL); //write(fd,NULL,1); //同样是喂狗 } } close(fd); //关闭设备 return 0; } “小王看清楚了吗这就是看门狗的应用程序可不是你说的什么流浪狗哈巴狗”我拍拍小王的头说。
“看到了只是感觉没啥用啊除了你向我炫耀的左右外..”小王调皮地说道。
“啊啊! 切我是怕你不懂所以就没怎么讲它的用途和原理以及实际的应用..”我吓唬她到“难的在下一节有关看门狗驱动的编写上知道不..”
“嗯..嗯知道你啊一点幽默都不懂..不想跟你说了..”小王生气的说…
“好了不跟你耍嘴皮子啦我还是给你说说这个程序咋用吧..”我不耐烦的说。 你这样先gcc编译一下生成可执行的文件然后下到板子上运行这个时候你要小心啦要不断的按键盘(除了ESC),否则系统就会重启啦就像你开始的那样。哈哈哈… 2010-08-24 09:52 嵌入式 看门狗 看门狗其实就是这么回事 比如说你正在绕着一座小山裸奔。——程序按预定流程执行。 每次经过山脚下的某个地方你都给一条大狼狗一根肉骨头。——喂狗。 奔着奔着你奔叉了道跑到了不该去的山顶。——程序跑飞了。 或者你在裸奔的途中睡着了。——程序死机。 这时那条大狼狗由于一直得不到喂食饿疯了挣脱锁链来追你。——看门狗定时器溢出。 你被它一吓脚底一软从山上咕噜咕噜滚下来。起来一看靠又回到了出发地点。于是只好又从头开