DSP

watchdog之喂狗分析

2019-07-13 12:19发布

当时遇到的一个问题是,某次修改代码后编译烧写时,出现了一个逐项选择的菜单,就随便选了下,结果后续运行程序时,每过一段时间就会自动重启ESP8266模块,最开始以为是硬件坏了,然后就拿了块新板子,发现还是会崩。拿之前的旧程序,仍然崩溃。 至此,已经基本排除了程序代码问题和硬件问题,肯定是配置问题。注意到官方的sniffer进程可以正常跑。然后对自己的程序进行线程的排查,发现只有开启了一个使用timer的线程的时候,才会重置。那么问题肯定出在配置上。检查menuconfig发现watchdog被打开了但是我们的程序中没有喂狗操作。而watchdog功能要依赖于timer,进而需要依赖于timer模块的初始化函数,即只要调用了timer的初始化函数就会定时重置。至此,定位原因,关闭选项重新编译烧写,世界恢复到正轨了。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~我是分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以下转自https://blog.csdn.net/x1987200567/article/details/53410492 Watchdog启动之后,系统会在一定时间间隔后重启,这样可以防止系统在遇到死机或者突然崩溃时无法继续运行。若系统死机或者突然崩溃,在一定时间过后,Watchdog会重启系统,使系统恢复运行。 在正常的系统运行过程中,Watchdog若一直不断重启系统,会严重影响到系统的正常工作,因此需要一个程序在后台喂狗,防止系统重启,这样watchdog只有在系统崩溃,喂狗程序无法正常工作的时候重启系统。 Watchdog超时之后,会发送一个内部系统重启信号WDOG_RESET_B_DEB,给SRC(System RestController)。 Watchdog的功能: 1、Timeout event:用户可以设定timeout的时间,通过写Watchdog Control Register的WT(watchdog timeoutfield),设定timeout。当Watchdog enable 之后,watchdog 会读取WT中的timeout时间,counter开始倒计时,当counter为0时,会发送WDOG_RESET_B_DEB,使watchdog重启。 当timeout被设定之后,在counter为0之前,可以通过reload the counter,来重置counter的计时器时间。reload the counter的方法是向watchdog service register(WDOG_WSR)中先写入值0x5555,然后写入值0xAAAA(这两个值必须连续写入,必须先写入0x5555,否则counter是不会被reload的,watchdog 也会在counter计时为0时重启系统)。(寄存器地址以及功能可在spec中查到)。 后台喂狗程序就是通过不断reload counter来实现的。 2、Interrupt event:watchdog 可以产生一个irq,当timeout快发生的时候,IRQ的产生时间可以通过读写WDOG_WICR来控制。
--------------------- 
作者:思则变 
来源:CSDN 
原文:https://blog.csdn.net/x1987200567/article/details/53410492 
版权声明:本文为博主原创文章,转载请附上博文链接!