历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2019年12月24日 | s3c2410--watchdog

2019-12-24 来源:elecfans

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的操作手册

推荐阅读

史海拾趣

Conflux公司的发展小趣事

Conflux公司自创立之初,便专注于区块链技术的研发与应用。在电子支付领域,公司团队成功研发出了一种高效、安全的分布式账本技术,这一技术突破迅速吸引了业界的关注。随后,Conflux与多家金融机构合作,推出了基于区块链技术的电子支付解决方案,不仅提高了交易速度,还大大降低了交易成本。这一系列的创新举措使Conflux在电子支付领域崭露头角,奠定了其在行业内的领先地位。

BTCPower公司的发展小趣事

随着技术的不断成熟和产品的广泛应用,BTCPower开始寻求更广阔的市场空间。公司积极与国际知名电子品牌进行合作,将其产品推向全球市场。通过与这些品牌的合作,BTCPower不仅提升了自身的品牌知名度,还获得了更多的商业机会和市场份额。

HEC Inc公司的发展小趣事

随着全球环保意识的提高,绿色发展成为电子行业的重要趋势。BTCPower积极响应这一趋势,将绿色发展理念融入公司的产品和服务中。公司致力于研发更环保、更节能的产品,同时还推动供应链中的合作伙伴共同实现绿色生产。这些努力使得BTCPower在行业中树立了良好的环保形象。

法思特(FAST)公司的发展小趣事
随着使用环境和需求的变化,可能需要对控制电路进行调整和优化,以适应新的使用条件。
EETools公司的发展小趣事

EETools公司成立于1992年,当时正值微处理器开发工具行业蓬勃发展的时期。公司创始人凭借对嵌入式系统产品的深刻理解和市场需求的敏锐洞察,决定投身于这一领域。EETools在硅谷的电子和计算机行业中心设立总部,迅速成为该地区的一颗新星。

在初创阶段,EETools专注于嵌入式系统产品的咨询和分销业务。通过与多家知名半导体厂商建立合作关系,EETools成功将各种高性能的嵌入式系统产品引入市场,满足了客户多样化的需求。同时,公司还积极研发自主品牌的嵌入式开发工具,为客户提供更为全面和专业的服务。

GS Technology公司的发展小趣事
为了只显示峰值,需要引入峰值检测电路。这可以通过二极管、电容等元件组成的峰值保持电路来实现,该电路能够捕获并保持信号的最大值。

问答坊 | AI 解惑

M430F1471

请问 M430F1471 是什么IC呀,谁有这个datasheet 给发一份吧, 邮箱:wangfx_hexing@163.com…

查看全部问答>

POST MMS时分组传送问题

我用的GPRS模块每次发送的数据包最长只有1024字节,所以在POST MMS时,需要分几次发送。MMS文件再加上WSP,WTP头是超过1024字节的,所以我先发送第一个1024字节,但是我还没来得及发送第2个1024字节,WAP网关已经返回了m-send.cnf了,终端收到的MMS ...…

查看全部问答>

用驱动精灵备份的驱动为什么一定要用驱动精灵恢复,还有其他办法吗?

我在网上查了很多方法都行不同 http://shenke2000.3322.org/setup.rar 这个 麻烦大家看一下  小弟叫救命了…

查看全部问答>

WINCE下IE能自动下载注册控件吗

WINCE下IE能自动下载注册控件吗?我用VC写了一个控件之后在Windows下IE能自动下载使用,用EVC写的控件,用WINCE的IE访问提示“是否下载安装ActiveX控件”点了Yes可是都没有下载下来注册安装,我手动用regsvrce.exe注册该控件,在IE下才能正常使用, ...…

查看全部问答>

在430中,如何在掉电时对一些重要的数据进行保护

在430中,如何在掉电时对一些重要的数据进行保护,避免在掉电时,这些数据的丢失?有哪些方法?请大侠赐教!…

查看全部问答>

8.4【每周讨论】如何提高编程的技巧与编程能力

       请各位大牛将自己的一些编程细想和编程技巧与大家分享一下,最好细细说说,这样有助于初学者入门,有利于入门者提高,我就觉得自己一直在一个编程的瓶颈时期,现在就在艰苦的摸索中      ...…

查看全部问答>

关于MSP430默认dco频率

我们知道430上电后默认DCO设置为RSELx = 7, DCOx = 3, MODx = 0,其频率范围是0.8~1.5MHz(3V电压) 这就有问题了,到底是多少呢?有两种说法最常见:800KHz和1MHZ 比如说我现在想得到100KHz的频率,那么我设置ID_3,8分频后即可得到,但如果是1M ...…

查看全部问答>

上传一份安捷伦线性电源的资料

上传一份线性电源的资料,以供DIY线性电源的筒子们参考…

查看全部问答>

板对板连接器发展概念与方向

概念:   板对板连接器是目前所有连接器产品类型中传输能力最强的连接器产品,主要应用于电力系统、通信网络、金融制造、电梯、工业自动化、医疗设备、办公设备、家电、军工制造等行业。   目前板对板连接器主要的间距有0.4mm、0.5mm、 0.635 ...…

查看全部问答>

用ccs5.1给MSP430下程序

用FET 还是JTAG还是其他什么的不一样 1. 启动CodeComposerStudioStart→AllPrograms→TexasInstruments →CodeComposerStudio→ CodeComposerStudio。 2. 通过选择File→New→CCSProject来创建一个新项目。 3. 输入一个项目名称并选择器件变量 ...…

查看全部问答>