关于watchdog应该有过单片机学习经历的人,都比较熟悉。但watchdog的正确用法,恐怕大家如果没有经历过实际产品的开发不会有深入的理解。
瑞萨RL78系列的单片机自身带有watchdog,当启用watchdogtimer定时器后,在watchdog timer溢出时间间隔的75%会产生watchdog中断。至于在watchdog中做什么,好多示例程序,都会在中断处理函数中喂狗,使watchdog timer重新开始计时。
实际的喂狗程序应该在watchdog的中断处理函数中吗?如果在,有什么样的效果?如果不应该在,喂狗程序应该放在哪儿,中断处理函数中又应该做什么?下面一一来解答。
假如喂狗程序只在watchdog的中断处理函数中,当然重新启动watchdog timer的目的达到了,由于watchdogtimer溢出产生的复位也避免了。但是,watchdog本身存在的价值已经失去了。Watchdog存在的意义是监测程序中的非法循环以及程序是否跑飞。假设程序已经陷入了非法循环中不能退出,或者程序已经跑飞。Watchdog timer的定时中断还会正常工作,所以喂狗程序还能够正常执行。只是中断函数执行完之后,程序的返回点还是非法循环,或者是跑飞的非法指令。这个大家可以在其他MCU中写程序,打断点调试一下。
既然,喂狗程序不能放在watchdogtimer的定时中断中,应该放在哪儿呢。首先,来一个知识的正向迁移,watchdog timer的定时中断执行的机制是所有中断都遵循的机制,这个中断的中断处理函数中喂狗不能达到目的,当然其他定时中断处理函数中也是一样的道理。正确的喂狗程序需要放入main函数的主循环中,喂狗的时间间隔需要考虑主循环所有可能分支耗时最大的那个。也即,watchdog timer的溢出时间大于所有分支的最大耗时,喂狗时间间隔小于所有分支的最大耗时。
返回到最后一个问题,watchdog timer定时中断的中断处理程序应该做些什么,和普通定时器的用法一样,提供一个较为精确的定时时间间隔。比如在ucosII向RL78/G14的移植中,可以将watchdog timer定时中断作为操作系统的时钟节拍。
watchdog的正确用法