s3c2410 watchdog (看门狗)
1.什么是watchdog?
:o4S;p3_%Twatchdog,中文名称叫做“看门狗”,全称watchdog timer,从字面上我们可以知道其实它属于一种定时器。然而它与我们平常所接触的定时器在作用上又有所不同。普通的定时器一般起记时作用,记时超时 (Timer Out)则引起一个中断,例如触发一个系统时钟中断。熟悉windows开发的朋友应该用过windows的Timer,windows Timer的作用与方才所讨论的定时器在功能上是相同的,只是windows Timer属于软件定时器,当windows Timer记时超时则引起App向System发送一条消息从而触发某个事件的发生。我们从以上的描述可知不论软件定时器或硬件定时器他们的作用都是在某个时间点上引起一个事件的发生,对于硬件定时器来说这个事件可能是通过中断的形式得以表现,对于软件定时器,这个事件则可以是以系统消息的形式得以表现。正如本文开头所讲的,watchdog本质上是一种定时器,那么普通定时器所拥有的特征它也应该具备,是的,当它记时超时时也会引起事件的发生,只是这个事件除了可以是系统中断外,它也可以是一个系统重起信号(Reset Signal),可以这么说吧,能发送系统重起信号的定时器我们就叫它watchdog.
%g:C)x)?3s1e;|2.watchdog的工作描述
#x,q)`-t5p7l5|+m"FTechWeb-技术社区当一个硬件系统开启了watchdog 功能,那么运行在这个硬件系统之上的软件必须在规定的时间间隔内向watchdog发送一个信号.这个行为简称为"喂狗"(feed dog),以免watchdog记时超时引发系统重起。
;Z*N%^6E*M6S,Htech.techweb.com.cn3.watchdog存在的意义是什么?程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛1F,M%b2C!x8P
你可能会问watchdog存在的意义是什么?开启了watchdog之后软件必须定时向它发信息,这不是麻烦又耗费资源的行为吗?其实这个行为很重要,这个行为是软件向硬件报告自身运行状态的一中手法。一个软件运行良好,那么它应该可以在规定的时间间隔内向watchdog发送信息,这等同于软件每隔一段时间就告诉硬件:“嘿,哥们,我在好好的跑着呢,你放心吧。”,若软件由于某个不当的操作而进入死循环(也就是俗称的死机),则他无法向 watchdog发送信息了,watchdog将发生记时超时,从而引起硬件重起。如果没有watchdog的存在,程序已经死掉了,但我们的用户还一头雾水,以为系统正在进行大规模的运算而进行耐心的等待。。。这一等可就是天荒地老啊。。。-_-!!程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛*t(i+V6h+M#E&d.J8_
4.s3c2410 watchdog的操作TechWeb-技术社区(g1W$e3W,W.I
对于s3c2410的watchdog来说,PCLK是它唯一的时钟信号源。(不知道PCLK的朋友可以上网搜搜或看我下一篇文章)程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 U!j8V0T)R)M!}5y*x6m
s3c2410用了3个寄存器对watchdog进行操作,3个寄存器分别为:WTCON,WTDAT,WTCNT。1[4u6u2f$z
WTCON:watchdog控制寄存器1t ])^,{-f0Q0H5_1J
WTDAT:watchdog数据寄存器&z'D/x6}(i/y'u7Y&X7N
WTCNT:watchdog记数寄存器
9J"p0H/J3M&G7R:q)ktech.techweb.com.cn以上各个寄存器的详细信息请参考s3c2410数据手册上关于watchdog部分TechWeb-技术社区2{&Q%l S+d)c'^
5.s3c2410 watchdog 工作描述:
)T&j+[2G$\1I程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛在开启watchdog之前,我们必需在寄存器WTDAT里面存有一个值,在watchdog开启之后这个值会被自动加载进寄存器WTCNT中,WTCNT的作用将在下面进行讲解,现在你只需要知道WTDAT必须有一个值,这个值将被自动装进WTCNT中(注1)
!l2|0Y(D)x(l6n7W%_Watchdog根据PCLK,Prescaler Value,Clock Select会产生一个watchdog自己的工作周期,我们把这个工作周期记为t_watchdog(注2),watchdog在一个 t_watchdog周期结束时会产生一个记数递减信号,每当这个信号产生时,WTCNT中的值便减1,若在WTCNT递减为0(Timer Out)的时候软件层还没有重新往WTCNT中写入数值(这个行为便是我上文提到的喂狗),则watchdog触发Reset Signal,系统重起。TechWeb-技术社区(K2U#V!V,V,E5l
根据上述的描述,我们可以更形象地描述watchdog的工作原理和3个寄存器之间的相互关系:
6e2C'H:z4@3p'o'Q5t程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛WTCNT通过WTDAT得到一个值,watchdog在每个t_watchdog周期里向WTCNT发送一个递减信号,当WTCNT的值递减到0的时候则发生time out,重而重起系统。
%K1Z*A2]&F:|.X5Z下面我帖出一段设置watchdog并开启watchdog的程序tech.techweb.com.cn,K"v9`%|9k*}4X
1:void enable_watchdog()TechWeb-技术社区-n2i1o9F*?(Y2h
2:{5Q,B:A!Q u5Y$E
3: rWTCON=0x7F81;
(G'e,\-S/d0eTechWeb-技术社区4: rWTDAT=0x8000;1O2O!u+b5b)v4O8l
5: rWTCON|=1<<5;
)n#s2y&}8J z*V.H)['q0N6:}$m;r9k3\.}-I:D/S8z
rWTCON,rWTDAT分别为寄存器WTCON,WTDAT的地址解引用,我如下定义他们!T*i0@"y#d
#define rWTCON (*(volatile unsigned int *)0x53000000)
:U&M!O9I$n ^ N程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛#define rWTDAT (*(volatile unsigned int *)0x53000004)TechWeb-技术社区)A/h1R.c9^.m
/D!M9U7Y"a8p#mTechWeb-技术社区从上面的设置我们可知寄存器WTCON的值为0x7F81,分解出来得:tech.techweb.com.cn1]2B5`&k*}
Prescaler Value =255/u*],b*K0F
Division_factor =16(Clock Select=16)
0I.I*K8l'~/M8\7_1}Interrupt Generation =0(不产生中断)
){)\1?*[$s3M(mReset =1(开启Reset Signal)程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛1m4D(|$p"K't(H"G"M$g,P {
第4行设置寄存器WTDAT的值为0x8000。
!Z2[4H&E#^.Z;O)N第5行开启watchdog#K%g,\2Y"D+p7e
当调用上面的函数之后,你的系统已经开启了watchdog,所以你必须在WTCNT中的值递减到0之前重新往该寄存器写入一个非0值(feed dog),否则将引起系统重起,以下是feed_dog函数)K'f+P0e6j
void feed_dog()0H7x0h0p d7b3Y
{
&G:v+V9}2G4} rWTCNT=0x8000;2\)[4A.C$b;r2K1I9n E$u5o
}
+]7l8l$]!c5k8i9^$y7M下面是void enable_watchdog()和feed_dog()配合使用的一个例子
)y5G8i7f&H$qvoid main()
5j#U1x8z(p.WTechWeb-技术社区{
#P+g*P%]-L1M%Xtech.techweb.com.cn init_system();
&T9|1w)n1Z.v$C!N(t9{ .
/i*D-V,a*ktech.techweb.com.cn ...
-R;@9v$z)j5m:S .....TechWeb-技术社区8G$I#|(P(?0F&c*Q
enable_watchdog();TechWeb-技术社区9Q2k+Q2G8I w9k
./B7G2a4|/x9\#B2l
...TechWeb-技术社区3`#e)o5Q/z
.....
!`6i1I b"Y6B)L'o&A while(1)
$Y)Z$u+Y"T(K/[0b,u3`6H;Z,ctech.techweb.com.cn {
:z'L5t4F*J1Mtech.techweb.com.cn feed_dog();
1I-M/Y)\)D%E'n;I }TechWeb-技术社区'{#{9Z(c0?"f+Q*S t
}:i0B+E)x2Y'p!Q
在这个例子中我假设了main函数是系统的主函数,在做完一系列系统初始化之后enable_watchdog()函数被调用,此时watchdog被启动,下面的while循环则是不断的进行feed_dog,使系统不发生重起。当然在实际应用中不可能采取这种架构来对watchdog进行操作,一般来说feed_dog函数的调用是被安插在定时器的中断服务例程中,当然,定时器的time out(注意是定时器的time out,不是watchdog的 time out)时间长度必须合适,否则在定时器还没来得及发生中断调用feed_dog函数之前,watchdog已经time out了,那也将引起系统重起.:o/G6[#]3D#{6?"|
注1:事实上,WTDAT和WTCNT这两个寄存器在系统上电之后会被硬件自动的填入两个初始值0x8000,开启watchdog之后, WTCNT并没有马上就把WTDAT中的值装入,而是使用初始值0x8000。在发生第一次time out之后,WTDAT寄存器中的值才会被真正的装载进WTCNT寄存器中。
(n&}*[,f9q5C$~注2:t_watchdog可根据公式对其进行计算:TechWeb-技术社区$D$n.s R#B*H1~3C8o
t_watchdog= 1/ (PCLK / (Prescaler value + 1) / Division_factor)
7X&E5{;w2f)T*sPrescaler Value位于寄存器WTCON的8至15位,其值为0~255TechWeb-技术社区"~+x!v"K6G%t%`
Division_factor由寄存器WTCON中的3~4位(Clock Select)决定,其值可以为00,01,10,11分别代表Division_factor的值为16,32,64,128
"\.G3n:x4Y&l7x.V*D1L9l*T关于各个寄存器的详细信息请参考s3c2410的操作手册
|