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的程序
1:void enable_watchdog()
2:{
3:
4:
5:
6:}
rWTCON,rWTDAT别离为寄存器WTCON,WTDAT的地址解引证,我如下界说他们
#define
#define
从上面的设置咱们可知寄存器WTCON的值为0x7F81,分化出来得:
Prescaler Value
Division_factor
Interrupt Generation
Reset
第4行设置寄存器WTDAT的值为0x8000。
第5行舱位watchdog
当调用上面的函数之后,你的体系现已舱位了watchdog,所以你有必要在WTCNT中的值递减到0之前从头往该寄存器写入一个非0值(feed dog),否则将引起体系重起,以下是feed_dog函数
void feed_dog()
{
}
下面是void enable_watchdog()和feed_dog()合作运用的一个比如
void main()
{
}
在这个比如中我假设了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的操作手册