HZKJ 发表于 2016-7-14 18:22:05

讨论一个问题:MCU如果死机了,定时器是否还能运行?

如题。
其实系统死机了,大部分原因是外部干扰导致系统运行异常,攻城师对一些异常考虑不周到,程序中没有做到对异常情况的处理。
那么问题来了,如果喂狗没有喂饱,系统会自动重新启动。但是如果喂狗太勤的话,有些异常就应该让系统重启,但因为一直喂狗,导致有些问题不能发现。
以前有人提过 在定时器里面喂狗,当然这是懒人模式,肯定不行。
LZ想能否在定时器里面闪亮一个LED,用来判断系统是死在某一个地方了?还是整个系统死的连心跳都没有了?
请高手指点。

lixin91985 发表于 2016-7-14 18:58:48

看门狗还有个名称,叫看门狗定时器。watdog tim

定时器只是在计数,闪LED 还是需要MCU干预的。

little_Monkey 发表于 2016-7-14 19:06:37

定时器使能了并且有时钟就会跑,响不响应中断就看你MCU死得够不够彻底

f8023m 发表于 2016-7-14 19:54:50

有的会跑,有的不会跑{:lol:}

117433525 发表于 2016-7-14 20:31:34

其实你可以这么理解更合理.
所谓的MCU死机了,其实就是没按程序所要求的那样运行了.
至于硬件有没有在运行,只要MCU的时钟没有停振,那么MCU就会一直在跑,当然定时器只要有时钟并开着了,它也是一直在跑的,当然它在跑但已经没意义了,因为CPU已经没在按要求的走了它可能在某个死循环不出来,或一直在执行一些没用的指令永远回到不正常状态了.
所谓的死机了,干扰了,它也可能把你正常的定时器关闭了,导至你的系统坏.
也有可能某些IO被改写,本来是输入,被干扰成输出.
也有可能你的不需要的外设本来是关闭的,确被干扰成打开了.
总之任何可能都是有可能发生的.
你要知道PC指针如果干扰变成0了还好办就当成系统复位一次了,如果PC指针被跳到一个空的位置还在那死循环了,也没看门狗救它,那就真的死了.

HZKJ 发表于 2016-7-14 20:34:32

117433525 发表于 2016-7-14 20:31
其实你可以这么理解更合理.
所谓的MCU死机了,其实就是没按程序所要求的那样运行了.
至于硬件有没有在运行, ...

说的精彩!!
但是你的最后一句“如果PC指针被跳到一个空的位置还在那死循环了,也没看门狗救它,那就真的死了”
我认为这时候没有喂狗,应该会系统复位吧。

117433525 发表于 2016-7-14 21:10:21

是的,不是说没有看门狗没救它的话,就会永远在死循环了吧.但CPU是一直在工作的,只是它一直在运行死循环的那几个指令而已.
当然,如果这时候你的定时器没被改写的话也开了中断,那么你定时器中断里的内容是会工作正常的,因为定时器是独立在跑的,不受CPU影响,它溢出还是会去中断子程序,然后退出.
说到这里就要讲一下看门狗了,有一些人喜欢直接把看门狗放在大循环里喂,这种如果PC指针飞掉了,回不到大循环里,看门狗就清不到了,这时候会复位.
但有一些人喜欢放在中断里喂,或中断里和大循环里都喂.这时候问题就来了,程序飞掉后,本来会喂不到狗而复位的,但因为定时器中断会正常产生中断,导至能正常喂狗.这样就自己害死自己了.
比较安全的做法是,在系统的关键是方放置标志位,比定定时器中断里放一个标志,大循环放一个标志,还有其它外设始ADC,或系统重要的寄存器和初始化的时候是不是一至也做一个标志位.
然后喂狗的时候,先检查所有的标志位置都设置过了才喂狗,否则不喂.这样一来,一个看门狗可以监测到系统的所有重要的参数.否则都要复位.

机械码农 发表于 2016-7-14 21:52:30

当然能,见过这样的

liudingding 发表于 2016-8-9 16:56:16

我用AVR,程序跑飞定时器继续工作,51没遇上过

Put_down 发表于 2016-8-9 22:39:15

所谓死机,就是程序掉进了一个死循环出不来。 没有被关闭的中断都会运行。非中断性的程序就呵呵了。

liyiui 发表于 2016-8-11 19:12:29

只要中断没有关,定时还是会有用的

huangqi412 发表于 2016-8-11 19:25:31

请问残疾了还能走路么

kite2006 发表于 2016-8-11 19:59:20

每种cpu还是有点区别的,定时器一般可以独立工作的,但是如果主程序死了,也许不会响应中断了,我用avr还没发现定时器死过

lswood 发表于 2016-8-11 20:11:49

说来怕见笑,用了这么多年51还从来没用过看门狗,也从来没见过程序跑飞的情况。

lswood 发表于 2016-8-11 20:13:28

程序跑飞了只要没有执行了关闭定时器中断的代码定时器就应该一直运行。

fengyunyu 发表于 2016-8-11 20:47:34

看死得程度

cd4000 发表于 2016-8-11 21:20:17

学习一下!

34071417 发表于 2016-10-25 11:52:29

定时器里亮LED是不行的,最好的方式,log输出,关键功能输出信息,当然如果有时间加信息输出最好

34071417 发表于 2016-10-25 11:55:18

117433525 发表于 2016-7-14 21:10
是的,不是说没有看门狗没救它的话,就会永远在死循环了吧.但CPU是一直在工作的,只是它一直在运行死循环的那 ...

最后一条经验受教了

slf0909061 发表于 2016-11-27 20:49:50

定时器应该还会在跑吧~

ywlzh 发表于 2016-11-27 21:04:26

看楼上的说法 中断还是老老实实做状态的切换 主要的动作还是留给“主程序”去干。

顺便 问一句 多任务程序运行时有没有跑飞的情况?要是跑飞了,调度器拉的回来不?

juncheng88 发表于 2016-11-27 21:04:36

也有疑问死机了,,这个看门狗定时器 是不是还在运行啊。

eduhf_123 发表于 2016-11-28 11:37:43

我们最近发现了PIC32MX675F512L的一个问题:
之前总是出现MCU死机,以为是干扰,所以就把看门狗给加上了,结果还是会死机!
为了定位问题,修改了看门狗的溢出周期、把喂狗指令全部删除、仅在最高优先级的定时器中断服务程序(包含GPIO操作)中加入一条喂狗指令,结果依然会死,表现是通讯无响应、GPIO上没有波形输出、MCU也不复位;
求助MicroChip的FAE也没能得到有用答复,实在是没有办法,自己把异常捕获代码给加上了——嘿!还真是出现异常了,通过试验发现,不管异常捕获程序的while(1)循环里喂不喂狗、看门狗都不会叫;
貌似PIC32MX675F512L的看门狗在出现异常后就不工作了。

wt3333 发表于 2016-11-28 14:23:35

你说的是在定时器中断里点led吧,如果mcu死机或转飞 - 已经不能触发中断了

apple_eat 发表于 2016-11-28 15:36:23

ywlzh 发表于 2016-11-27 21:04
看楼上的说法 中断还是老老实实做状态的切换 主要的动作还是留给“主程序”去干。

顺便 问一句 多任务程序 ...

理论上会进hard fault中断

mvpgpz 发表于 2016-12-6 14:02:57

我感觉除了跑飞和死机还有别的状态,以前用c8051f040坐高低温试验时就碰到过,我猜应该是片子完全不工作了,到了能工作的温度就又正常了......

HZKJ 发表于 2016-12-6 14:45:28

mvpgpz 发表于 2016-12-6 14:02
我感觉除了跑飞和死机还有别的状态,以前用c8051f040坐高低温试验时就碰到过,我猜应该是片子完全不工作了 ...

冻结状态??冷冻深度休眠,呵呵

mvpgpz 发表于 2016-12-6 14:56:38

HZKJ 发表于 2016-12-6 14:45
冻结状态??冷冻深度休眠,呵呵

高温和低温都会出现那种情况.......

Hhhhhhhh 发表于 2016-12-6 15:40:28

用定时器喂狗还是不可靠的。如果程序跳飞只是进入死循环,定时器喂狗就完全没用了。高低温又是另一种情况,单片机完全都不工作和看门狗没什么关系了
页: [1]
查看完整版本: 讨论一个问题:MCU如果死机了,定时器是否还能运行?