注:此文章转载自网络

1. 什么是watchdog?
watchdog,中文名称叫做“看门狗”,全称watchdog timer,从字面上我们可以知道其实它属于一种定时器。然而它与我们平常所接触的定时器在作用上又有所不同。普通的定时器一般起记时作用,记时超时 (Timer Out)则引起一个中断,例如触发一个系统时钟中断。熟悉windows开发的朋友应该用过windows的Timer,windows Timer的作用与方才所讨论的定时器在功能上是相同的,只是windows Timer属于软件定时器,当windows Timer记时超时则引起App向System发送一条消息从而触发某个事件的发生。我们从以上的描述可知不论软件定时器或硬件定时器他们的作用都是在某 个时间点上引起一个事件的发生,对于硬件定时器来说这个事件可能是通过中断的形式得以表现,对于软件定时器,这个事件则可以是以系统消息的形式得以表现。 正如本文开头所讲的,watchdog本质上是一种定时器,那么普通定时器所拥有的特征它也应该具备,是的,当它记时超时时也会引起事件的发生,只是这个 事件除了可以是系统中断外,它也可以是一个系统重起信号(Reset Signal),可以这么说吧,能发送系统重起信号的定时器我们就叫它watchdog.

2.watchdog 的工作描述
当一个硬件系统开启了watchdog 功能,那么运行在这个硬件系统之上的软件必须在规定的时间间隔内向watchdog发送一个信号.这个行为简称为"喂狗"(feed dog),以免watchdog记时超时引发系统重起。

3.watchdog 存在的意义是什么?
你可能会问watchdog存在的意义是什么?开启了watchdog之后软件必须定时向它发信息,这不是麻烦又耗费资源的行为吗?其实这个行为很重要, 这个行为是软件向硬件报告自身运行状态的一中手法。一个软件运行良好,那么它应该可以在规定的时间间隔内向watchdog发送信息,这等同于软件每隔一 段时间就告诉硬件:“嘿,哥们,我在好好的跑着呢,你放心吧。”,若软件由于某个不当的操作而进入死循环(也就是俗称的死机),则他无法向 watchdog发送信息了,watchdog将发生记时超时,从而引起硬件重起。如果没有watchdog的存在,程序已经死掉了,但我们的用户还一头 雾水,以为系统正在进行大规模的运算而进行耐心的等待。。。这一等可就是天荒地老啊。。。-_-!!

4.s3c2410 watchdog的操作
对于s3c2410的watchdog来说,PCLK是它唯一的时钟信号源。(不知道PCLK的朋友可以上网搜搜或看我下一篇文章)
s3c2410用了3个寄存器对watchdog进行操作,3个寄存器分别为:WTCON,WTDAT,WTCNT。
WTCON:watchdog控制寄存器
WTDAT:watchdog数据寄存器
WTCNT:watchdog记数寄存器
以上各个寄存器的详细信息请参考s3c2410数据手册上关于watchdog部分

5.s3c2410 watchdog 工作描述
在开启watchdog之前,我们必需在寄存器WTDAT里面存有一个值,在watchdog开启之后这个值会被自动加载进寄存器WTCNT 中,WTCNT的作用将在下面进行讲解,现在你只需要知道WTDAT必须有一个值,这个值将被自动装进WTCNT中(注1)

Watchdog 根据PCLK,Prescaler Value,Clock Select会产生一个watchdog自己的工作周期,我们把这个工作周期记为t_watchdog(注2),watchdog 在一个 t_watchdog周期结束时会产生一个记数递减信号,每当这个信号产生时,WTCNT中的值便减1,若在WTCNT递减为0(Timer Out)的时候软件层还没有重新往WTCNT中写入数值(这个行为便是我上文提到的喂狗),则watchdog触发Reset Signal,系统重起。
根据上述的描述,我们可以更形象地描述watchdog的工作原理和3个寄存器之间的相互关系:

WTCNT 通过WTDAT得到一个值,watchdog在每个t_watchdog周期里向WTCNT发送一个递减信号,当WTCNT的值递减到0的时候则发生 time out,重而重起系统。

下 面我帖出一段设置watchdog并开启watchdog的程序

代码

void enable_watchdog()    
{    
rWTCON=0x7F81;    
rWTDAT=0x8000;    
rWTCON|=1<<5;    
}

rWTCON,rWTDAT 分别为寄存器WTCON,WTDAT的地址解引用,我如下定义他们

#define        rWTCON                (*(volatile unsigned int *)0x53000000)
#define        rWTDAT                (*(volatile unsigned int *)0x53000004)

从 上面的设置我们可知寄存器WTCON的值为0x7F81,分解出来得:

Prescaler Value               =255
Division_factor                =16(Clock Select=16)
Interrupt Generation       =0(不产生中断)
Reset                            =1(开启Reset Signal)

第 4行设置寄存器WTDAT的值为0x8000。
第5行开启watchdog

当 调用上面的函数之后,你的系统已经开启了watchdog,所以你必须在WTCNT中的值递减到0之前重新往该寄存器写入一个非0值(feed dog),否则将引起系统重起,以下是feed_dog函数

void feed_dog()
{
rWTCNT=0x8000;
}

下面是void enable_watchdog()和feed_dog()配合使用的一个 例子

void main()
{
init_system();
.
...
.....
enable_watchdog();
.
...
.....
while(1)
{
feed_dog();        
}
}

在这个例子中我假设了main函数是系统的主函数,在做完一系列系统初始化之后enable_watchdog()函数被调用,此时watchdog被启 动,下面的while循环则是不断的进行feed_dog,使系统不发生重起。当然在实际应用中不可能采取这种架构来对watchdog进行操作,一般来 说feed_dog函数的调用是被安插在定时器的中断服务例程中,当然,定时器的time out(注意是定时器的time out,不是watchdog的 time out)时间长度必须合适,否则在定时器还没来得及发生中断调用feed_dog函数之前,watchdog已经time out了,那也将引起系统重起.

注1:事实上,WTDAT和WTCNT这两个寄存器在系统上电之后会被硬件自动的填入两个初始值0x8000,开启 watchdog之后,WTCNT并没有马上就把WTDAT中的值装入,而是使用初始值0x8000。在发生第一次time out之后,WTDAT寄存器中的值才会被真正的装载进WTCNT寄存器中。

注2:t_watchdog可根据公式对其进行计算:
t_watchdog= 1/ (PCLK / (Prescaler value + 1) / Division_factor)
Prescaler Value位于寄存器WTCON的8至15位,其值为0~255
Division_factor由寄存器WTCON中的3~4位(Clock Select)决定,其值可以为00,01,10,11分别代表Division_factor的值为16,32,64,128

关 于各个寄存器的详细信息请参考s3c2410的操作手册

转载于:https://www.cnblogs.com/liujiahi/archive/2011/09/10/2196356.html

s3c2410--watchdog相关推荐

  1. 看门狗watchdog的理解

      1.什么是watchdog? watchdog,中文名称叫做"看门狗",全称watchdog timer,从字面上我们可以知道其实它属于一种定时器.然而它与我们平常所接触的定时 ...

  2. linux服务器看门狗服务,服务器watchdog看门狗的理解

    1.什么是watchdog? watchdog,中文名称叫做"看门狗",全称watchdog timer,从字面上我们可以知道其实它属于一种定时器.然而它与我们平常所接触的定时器在 ...

  3. Linux驱动学习之:WDT(watchdog)驱动

    第一部分: WDT驱动原理 WDT在内核中通常都实现为misc驱动. WDT介绍 一个Watchdog Timer(WDT)是一个在软件出错的时候可以复位计算机系统的硬件电路. 通常一个用户空间守护进 ...

  4. linux eth0 device not found,mini2440的nfs文件系统挂不上问题“IP-Config: Device `eth0' not found”...

    各位大师! 我用mini2440开发板挂载nfs的文件系统,内核打印信息提示"IP-Config: Device `eth0' not found",我的nfs服务无法完成 一下是 ...

  5. 制作根文件系统出现错误:No init found

    问题: 1.构建最小根文件系统时,出现错误: Warning: unable to open an initial console. Failed to execute /linuxrc. Attem ...

  6. 64MQQ2440烧写MINI2440光盘中的内容同样可以跑起来

    2008年购买了QQ2440,后来出去工作了,2440压箱子底压了两年,现在拿出来想弄弄qtopia,可是一查友善的资料已经出到了ARM11的板子了,内核以及qtopia的支持根文件映像也不知升级了多 ...

  7. 移植根文件系统到linux内核 s3c2440,u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统...

    三.根文件系统的制作 我们利用busybox来制作根文件系统 1.在下列网站下载busybox-1.15.0.tar.bz2 在当前目录下解压busybox tar -jxvf busybox-1.1 ...

  8. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  9. 构建基本的嵌入式Linux根文件系统

    构建基本的嵌入式Linux根文件系统 其实在去年8月份我做系统移植时就构建好了一个可以用的根文件系统,但是那时是跟着别人的<Linux全线移植文档>做的.有些东西我也不清楚,只是跟着做,做 ...

  10. 2440 linux文件写,添加yaffs2文件系统 - Linux2.6.39在S3C2440上的移植_Linux编程_Linux公社-Linux系统门户网站...

    1.主机环境:VMare下Ubuntu10.04 ,1G内存. 2.编译编译环境:arm-linux-gcc 3.开发板:Micro2440,2M nor flash,256M nand flash. ...

最新文章

  1. Python_序列对象内置方法详解_String
  2. centos7 network-manager 与 interfaces 冲突
  3. 厦大的计算机博士好考吗,2018双非学姐的厦大考博逆袭之路——本硕求学生涯历程...
  4. 第五十二课、命令行参数的应用------------------狄泰软件学院
  5. linux 定时器中断 imx,NXP iMX8 存储性能测试
  6. android 设置PopupWindow透明度
  7. 借用构造函数 组合继承 拷贝继承 总结继承
  8. DIV CSS初学者需重视的10个简单问题与技巧
  9. 如何在React Native中使用react-navigation 5处理导航
  10. mongodb python 大于_Python中使用MongoDB详解
  11. 判断ROS版本号-ubuntu20.04安装ROS_noetic-修改镜像源
  12. CPP-week fourteen
  13. 浏览器通知--window.Notification
  14. 如何更改static控件的字体大小
  15. 【优化算法】动态粒子群算法的动态环境寻优算法【含Matlab源码 1125期】
  16. 跨境电商无货源自发货铺货ERP店群管理软件
  17. stm32教程之三重ADC交错采样
  18. 淘宝上线独立搜索引擎一淘网
  19. 使用python开发多人一对一聊天系统(文字聊天,视频通讯,文件传输)
  20. 我的游戏学习日志3——三国志GBA

热门文章

  1. php高并发接口性能急剧下降,关于sphinx+PHP在高并发时响应性能低下的解决办法...
  2. 一周内2家财税解决方案提供商港交所递表 财税数字化赛道热度骤增
  3. 奇奇怪怪但很有意思的网站分享
  4. PAT 1007 素数对猜想 (20 分)
  5. 北京城市更新专项规划正式印发,绿色、低碳成重点
  6. 2023养老展,北京老博会,老年用品与适老家具展,老龄产业展
  7. Python3.7安装pyspider框架的坑
  8. ES-elasticsearch
  9. android svg 开源库,SVG-Android开源库——项目简单接入与使用
  10. GB50666-2011混凝土结构工程施工规范