嵌入式系统中看门狗概述。。。

      一直以来对于嵌入式中的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系列中,利用了操作系统时钟的比较寄存器3(OSMR3)做为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 Developer's 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;
     usec=1000*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;
     fd=Init();  //打开终端看门狗设备
     //读板卡信息,但不常用
      ioctl(fd,WDIOC_GETSUPPORT,&wi);
     printf("%d,%s\n",wi.options,wi.identity);
     //读看门狗溢出时间,默认是5s
     //重新设置时间为10s
     i=5;
     printf("%d\n",ioctl(fd,WDIOC_SETTIMEOUT,&i));
     //读新的设置时间
      printf("%d\n",ioctl(fd,WDIOC_GETTIMEOUT,&i));
     printf("%d\n",i);
     //看门狗开始和停止工作,打开和关闭设备具有同样的功能
     //关闭
      i=WDIOS_DISABLECARD;
     printf("%d\n",ioctl(fd,WDIOC_SETOPTIONS,&i));
     //打开
      i=WDIOS_ENABLECARD;
     printf("%d\n",ioctl(fd,WDIOC_SETOPTIONS,&i));
     while(1)
     {
           zsleep(100);
           if((c=Getch())!=27){
                //输入如果不是ESC,就喂狗,否则不喂狗,到时间后系统重启
                ioctl(fd,WDIOC_KEEPALIVE,NULL);
                //write(fd,NULL,1);     //同样是喂狗
           }
     }
    close(fd);   //关闭设备
     return 0;
}
“小王,看清楚了吗?这就是看门狗的应用程序,可不是你说的什么流浪狗,哈巴狗”我拍拍小王的头说。

“看到了,只是感觉没啥用啊,除了你向我炫耀的左右外..”小王调皮地说道。

“啊!啊! 切,我是怕你不懂,所以就没怎么讲它的用途和原理,以及实际的应用..”我吓唬她到,“难的在下一节有关看门狗驱动的编写上,知道不..”

“嗯..嗯,知道,你啊,一点幽默都不懂..不想跟你说了..”小王生气的说…

“好了,不跟你耍嘴皮子啦,我还是给你说说这个程序咋用吧..”我不耐烦的说。

  你,这样,先gcc编译一下,生成可执行的文件,然后下到板子上运行,这个时候你要小心啦,要不断的按键盘(除了ESC),否则系统就会重启啦,就像你开始的那样。哈哈哈…

 

 

2010-08-24 09:52

嵌入式 看门狗

看门狗其实就是这么回事:

比如说你正在绕着一座小山裸奔。——程序按预定流程执行。

每次经过山脚下的某个地方,你都给一条大狼狗一根肉骨头。——喂狗。

奔着奔着,你奔叉了道,跑到了不该去的山顶。——程序跑飞了。

或者,你在裸奔的途中睡着了。——程序死机。

这时,那条大狼狗,由于一直得不到喂食,饿疯了,挣脱锁链来追你。——看门狗定时器溢出。

你被它一吓,脚底一软,从山上咕噜咕噜滚下来。起来一看,靠,又回到了出发地点。于是只好又从头开

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中的运算符

算术运算符 MySQL 支持常见的五种算术运算&#xff1a;, -, *, /(同 DIV 函数), %(同 MOD 函数)&#xff0c;即加减乘除和取余。&#xff08;被除数为 0则结果为 NULL&#xff09; 比较运算符 当使用 SELECT 语句进行查询时&#xff0c;MySQL 允许用户对表达式的左边操作数和右…

Qt中查看ui_xxx.h文件方法

前提 1、Qt当有界面 2、构造完成 满足以上两个条件qt会生成ui_xxx.h文件。 如何查看 方法1 在cpp文件中找到UI下的一个对象 如&#xff1a; ui->textEdit Ui::QWDialog按住Ctrl键&#xff0c;使用鼠标左键点击UI下的一个对象&#xff0c;如&#xff1a;textEdit、QWDia…

springCloud Finchley 实战入门(基于springBoot 2.0.3)【三 Eureka-高可用服务注册中心】...

Eureka高可用注册中心 Eureka Server的设计一开始就考虑到了高可用的问题&#xff0c;在eureka服务治理设计中&#xff0c;所有的节点即是是服务提供方&#xff0c;也是服务消费方。 在部署高可用注册中心前我们先需要准备一下&#xff0c;本地环境。因为我们实例是在单台电脑上…

Spring 读取配置文件(二)

Spring 读取配置文件并调用 bean package cn.com.test.receive;import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class…

DaVinci的Buffer_Handle和BufTab Cmem函数调用

DaVinci的dvsdk里面&#xff0c;所有的内存用的都是CMEM&#xff0c;而比较上层的一个封装就是BufTab和Buffer_Handle了 每个Tab可以控制好多块内存块。 具体到内存块有两种&#xff0c;一种是创建的时候指定他的大小啊&#xff0c;物理地址啥的。另外一种就是仅仅创建出这个 …

Qt使用两组RadioButton,两组之间相互独立

Qt中使用两组共四个RadioButton时&#xff0c;由于RadioButton的特性&#xff0c;所以两组一共四个按钮每次只能选择一个&#xff0c;要使得两组RadioButton相互独立&#xff0c;需要用到QButtonGroup这个功能&#xff0c;把RadioButton加到QButtonGroup里面&#xff0c;实现两…

sleep 和 wait 的区别

为什么80%的码农都做不了架构师&#xff1f;>>> 面试中常问的就是 sleep 和 wait 有什么不同吗&#xff1f;为了面试时候发挥的更好&#xff0c;我在这里总结分享下。 首先对于 sleep() 方法&#xff0c;我们首先要知道该方法是属于 Thread 类中的。而 wait() 方法…

2016年11月13日周工作知识点总结

jQuery :eq() 选择器选取带有指定 index 值的元素。index 值从 0 开始&#xff0c;所有第一个元素的 index 值是 0&#xff08;不是 1&#xff09;。经常与其他元素/选择器一起使用&#xff0c;来选择指定的组中特定序号的元素&#xff08;如下面的例子&#xff09;。$("p…

DM6467之视频采集(Linux)下MMAP

做&#xff44;&#xff53;&#xff50;&#xff16;&#xff14;&#xff16;&#xff17;是在linux下做视频采集&#xff0c;仅ARM端 一共有三种视频采集方式&#xff1a; 1&#xff09;使用read、write方式&#xff1a;直接使用 read 和 write 函数进行读写。这种方式最简…

QPS、TPS计算

QPS (Query per second) &#xff08;每秒查询量&#xff09; TPS(Transaction per second) &#xff08;每秒事务量&#xff0c;如果是InnoDB会显示&#xff0c;没有InnoDB就不会显示&#xff09; 计算方法 QPS Questions SHOW GLOBAL STATUS LIKE Questions; Uptime SHOW G…

QT 中textEdit 和 textBrowser 无法使用斜体及加粗等 解决办法

编辑框的几个种类 QT 中一共四个文本编辑框 分别是 Line Edit 、Text Edit、 Plait Text Edit和textBrowser四种文本编辑框架&#xff01; 一、输入内容不同 1、LineEdit&#xff1a;LineEdit的输入内容为单行文本输入。 2、TextEdit&#xff1a;TextEdit的输入内容为多行文…

【select模块】select IO多路复用和select实现FTP

select是全平台通用的IO多路复用模块。最大连接数&#xff1a;1024。poll和epoll没有最大连接数限制&#xff0c;但只能用在linux平台。selectors是再封装模块&#xff0c;推荐使用。下篇会讨论。select.select(rlist, wlist, xlist[, timeout])This is a straightforward inte…

变量属性

变量属性 C语言的变量属性 C语言中的变量可以有自己的属性在定义变量的时候加上“属性”关键字属性关键字指明变量的特有意义auto关键字 auto即C语言中局部变量的默认属性auto表明将被修饰的变量存储在栈上编译器默认所有的局部变量都是auto的register关键字 register关键字指明…

WPF:How to display a Bitmap on Image control

一个Bitmap文件&#xff0c;叫做screenShotFile, 你可以这样显示到Image控件上。 BitmapImage bi new BitmapImage(); bi.BeginInit(); bi.UriSource new Uri(this.screenShotFile, UriKind.Absolute); bi.EndInit(); this.scre…

QT中$$PWD的意思

$$PWD的意思为当前目录 如pro文件中&#xff1a;INCLUDEPATH $$PWD/lib/x64-win64 $$PWD表示的意思就是pro文件所在的目录。

Dubbo 整合 Pinpoint 做分布式服务请求跟踪

2019独角兽企业重金招聘Python工程师标准>>> 在使用Dubbo进行服务化或者整合应用后&#xff0c;假设某个服务后台日志显示有异常&#xff0c;这个服务又被多个应用调用的情况下&#xff0c;我们通常很难判断是哪个应用调用的&#xff0c;问题的起因是什么&#xff0…

Linux 进程详解

Linux内核的七大区间 1.进程管理&#xff08;进程创建&#xff0c;进程的三种状态&#xff0c;进程间的调度&#xff0c;调度算法...&#xff09; 2.内存管理&#xff08;段式管理&#xff08;Linux所有段都从0开始&#xff09;&#xff0c;页式管理--地址偏移量&#xff09; 3…

C#2.0 委托

委托 委托是一个非常不错的设计&#xff0c;允许我们把方法做为参数传递&#xff0c;实现了开放閉放原则。在方法中我们只要有一个委托占位&#xff0c;调用者就可以传入符合签名的方法来做不同的操作&#xff0c;这也面向对象开发中多态的魅力。 但是在C#1.0的时候&#xff…

qt乱码Could not decode“xxx.cpp“ with “UTF-8“-encoding.Editing not possible问题处理

问题描述&#xff1a;如题&#xff1a; 解决方法&#xff1a; 1、点击Select Encoding按钮 2、选择按照系统编码 3、选中System后点击按编码重新载入 4、问题解决

bootargs中的环境变量说明和一些常用的uboot命令

bootargs中的环境变量说明和一些常用的uboot命令 一些常见的uboot命令&#xff1a; Help [command]在屏幕上打印命令的说明 Boom [addr]启动在内存储器的内核 Tftpboot通过tftp启动内核 Saveenv保存环境变量 setenv name [value] 设置环境变量 bootargs中的环境变量 co…