搜索
bottom↓
回复: 56

大家想不到的,极其罕见的看门狗死机事件

[复制链接]

出0入0汤圆

发表于 2011-1-18 20:15:43 | 显示全部楼层 |阅读模式
大家都知道单片机程序跑飞或死机时,加上外部看门狗可以重启单片机,从而解决这类问题。

但万万想不到的是,即使加了外部看门狗也无法解决程序跑飞或死机的情况,问题如下:

我们知道,看门狗要每隔一段时间喂狗(输出脉冲),才能使看门狗电路不会重启单片机的RST端。
通常情况下单片机程序跑飞或死机时,会使喂狗端一直处于低电平或高电平,没有了喂狗脉冲,看门狗会复位RST端,使单片机重启,从而保证程序得以正常运行下去。但我碰到一个极其特殊的情况,就是单片机死机时,喂狗端居然也有脉冲输出,使看门狗不能复位,而单片机就这样死机下去,晕乎!

我试过几种专用的看门狗电路和自行设计的看门狗电路,均无法解决死机时仍有喂狗脉冲输出的问题。

请问各位高手,有没有一种看门狗电路可以识别是正常的喂狗脉冲还是死机时的脉冲,相信也有很多人需要这种电路,知道的告知一声,在此谢过了!

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入42汤圆

发表于 2011-1-18 20:22:10 | 显示全部楼层
或者检察下程序设计的问题吧,逻辑上也许出了问题

出0入135汤圆

发表于 2011-1-18 20:23:06 | 显示全部楼层
我也碰到过,电网浪涌的时候居然把看门狗都浪晕了

出0入0汤圆

发表于 2011-1-18 20:24:16 | 显示全部楼层
如果喂狗放在了中断里,那么有可能程序跑飞了,但中断还是正常执行的,那么看门狗就不恢复位,别的没发生过你说的这情况。

出0入0汤圆

 楼主| 发表于 2011-1-18 20:38:14 | 显示全部楼层
回复【1楼】albert_w
或者检察下程序设计的问题吧,逻辑上也许出了问题
-----------------------------------------------------------------------

这已经不关系程序的正确性了,程序再正确无误,单片机死机了,什么都得玩完。
因为单片机死机时,各个IO口的电平状态是不一样的,有的高,有的低,所以我认为这个死机状况下的脉冲输出与程序正确性应该无关。

出0入0汤圆

 楼主| 发表于 2011-1-18 20:40:28 | 显示全部楼层
回复【3楼】wuha 东方不败
如果喂狗放在了中断里,那么有可能程序跑飞了,但中断还是正常执行的,那么看门狗就不恢复位,别的没发生过你说的这情况。
-----------------------------------------------------------------------

我的程序里没有开中断。

出0入0汤圆

发表于 2011-1-18 20:47:08 | 显示全部楼层
你的喂狗脉冲不至于是用的PWM输出吧?

出0入0汤圆

发表于 2011-1-18 21:18:55 | 显示全部楼层
典型的软件设计问题

出0入0汤圆

发表于 2011-1-18 21:43:41 | 显示全部楼层
main()
//初始化
//开启定时器

{ while(1)
   { for(;;){ }//模拟死机死循环
   }
}

timer0_isr interrupt 1
{//喂狗代码}

这样就会出现你说的情况。死锁是死在主程序里面,中断能相应。
你的程序如果用IF做判断,少写"==",尽量写 >= 或者饿<=,否则程序容易冲过判断值,造成死循环。我就遇到过。

出0入0汤圆

 楼主| 发表于 2011-1-18 22:12:29 | 显示全部楼层
以上所讲的意思我明白,但不是程序的问题啊,程序跑飞时或死机时,数码管显示的数字是一堆乱乱码,有的指示灯亮,有的指示亮灭,有时以不同的频率长鸣,有时不响。各个IO口每次死机时,处于不确定的状态。

明白我说的意思了吗?所以说喂狗端有时是高电平,有时是低电平,有时是脉冲输出,反正是死机时,什么状态都有,这已经不关系程序的编写问题了。

我想问的是,有没有一种看门狗集成电路可以识别出喂狗脉冲是正常工作的还是死机时产生的脉冲。

出0入0汤圆

发表于 2011-1-18 22:20:22 | 显示全部楼层
回复【楼主位】pxlpxlpxl
-----------------------------------------------------------------------

碰到过通过复位芯片手动复位都不起作用,必须断电重启的单片机,C8051FXXX。

出0入22汤圆

发表于 2011-1-18 22:39:37 | 显示全部楼层
如果脉冲是用TIME做的

很可能会出现这样的问题,,。

要想实现真正的看门狗,就必须在程序中用PD1=~PD1; 这样的指令,任何借助外设来实现的脉冲都会出问题。

PIC 和 STM32 等IC 在ALU停止运行后 TIME会一直工作。当然 他们的ISR就不工作了。

出0入0汤圆

发表于 2011-1-18 22:40:05 | 显示全部楼层
你看看死机时,哪个端口没有脉冲,重新设个喂狗端吧。

出0入0汤圆

发表于 2011-1-18 22:54:46 | 显示全部楼层
如果端口真的是你描述的这样的话,那么说明你的看门狗设计还是有问题的,高可靠性系统不仅仅是周期的脉冲喂狗,而且还要设计好窗口时间,只有在窗口时间中出现的脉冲才是有效。

也就是随机的,无一定时间规律的脉冲仍然会导致看门狗复位。

出0入0汤圆

发表于 2011-1-18 23:02:45 | 显示全部楼层
LS高见!

出0入0汤圆

发表于 2011-1-19 11:48:48 | 显示全部楼层
你加什么的狗都没用,因为喂狗信号都 是由单片机发出.

只要单片机出问题了......那就是单片机死了....外狗也无法.

基于单片机可靠性来喂狗,达到狗又看好单片机的目的,那很自相矛盾.

只有用前人的办法.........不断复位法

这是从80年德国进口的生产线上的设备上找到的....确实好用.....当然不能用在高速场合

出0入0汤圆

发表于 2011-1-19 12:38:48 | 显示全部楼层
喂狗不要一步到位,可以分几步来完成一次喂狗,并且每一步者在不同的地方。这样只要其中一步出现问题,则喂不了狗。

出0入0汤圆

发表于 2011-1-19 12:43:02 | 显示全部楼层
说什么也白说。把喂狗的那段程序贴出来。你怎么知道程序跑飞了?外部现象就能说明程序跑飞了?LED不显示,蜂鸣器乱叫还有可能是程序设计错误。
程序贴出来就知道了

出0入0汤圆

发表于 2011-1-19 17:44:53 | 显示全部楼层
复位看门狗只能在主程序的主循环里。这个喂狗的代码最好只放一句,并且可以使用一些判定条件,当满足才喂狗。有些时候程序可能错误执行某一段,然后不停的喂狗。 看门狗不是万能的,设计的电路应尽量避免死机,看门狗是极其偶然发生干扰的时候才使用的。

出0入0汤圆

发表于 2011-1-19 23:00:02 | 显示全部楼层
回复【15楼】asmmcu  
-----------------------------------------------------------------------

不断复位法……这个实在太YD了

出0入0汤圆

 楼主| 发表于 2011-1-20 20:05:11 | 显示全部楼层
回复【13楼】modelfly
如果端口真的是你描述的这样的话,那么说明你的看门狗设计还是有问题的,高可靠性系统不仅仅是周期的脉冲喂狗,而且还要设计好窗口时间,只有在窗口时间中出现的脉冲才是有效。
也就是随机的,无一定时间规律的脉冲仍然会导致看门狗复位。
-----------------------------------------------------------------------

嗯,这个思路好,不错!哪种看门狗电路可以实现这个功能,还望告知或贴出一小段实例出来,谢谢!

出0入0汤圆

发表于 2011-2-1 10:32:34 | 显示全部楼层
是中断的使能与返回的问题

出0入0汤圆

发表于 2011-2-2 02:19:00 | 显示全部楼层
16楼和18楼确实是高手级的意见。狗是不能随便喂的。喂的地方多了,它就该叫而不叫了。

出0入0汤圆

发表于 2011-2-2 06:24:20 | 显示全部楼层
用窗口看门狗啊,STM8就自带一个独立看门狗和一个窗口看门狗的

出0入0汤圆

发表于 2011-2-2 21:44:18 | 显示全部楼层
喂狗代码不应该放在定时中断里

出0入0汤圆

发表于 2011-2-3 02:52:07 | 显示全部楼层
回复【8楼】lylatyou 张伯伦
main()
//初始化
//开启定时器
{ while(1)
   { for(;;){ }//模拟死机死循环
   }
}
timer0_isr interrupt 1
{//喂狗代码}
这样就会出现你说的情况。死锁是死在主程序里面,中断能相应。
你的程序如果用if做判断,少写"==",尽量写 &gt;= 或者饿&lt;=,否则程序容易冲过判断值,造成死循环。我就遇到过。
-----------------------------------------------------------------------

干星儿,你也混这里了?
正常情况下喂狗在主程序里进行,如果这样死了但是还是要喂狗,那么就是假死。主程序还在运行,但是LZ没有觉察到

出0入0汤圆

发表于 2011-2-3 12:14:44 | 显示全部楼层
不过的确有这种情况存在,给单片机RST端输入复位信号,并不能让单片机复位。这时唯一的方法就是掉电。如果要稳定,只能用掉电复位的看门狗。

出0入0汤圆

发表于 2011-7-4 21:17:14 | 显示全部楼层
10楼和26楼出现的情况,是否是晶振停阵了,这时虽然加复位信号也不再复位。。。。。。

10楼得意见吓死人,我正在用c8051f!!


【15楼】 asmmcu
不断复位发有个问题:看门狗芯片的复位时间都很短,1s吧,想1小时复位一次,怎么办?

出0入0汤圆

发表于 2011-7-4 22:02:17 | 显示全部楼层
是软件问题吧,估计单片机卡在一个死循环里了,而且这个循环有踢狗的语句。
我的做法:
1.声明一个全局变量X,记录程序的复位点
2.EEPROM里留出32个int16值(看程序大小而定),用来记录记录每个程序断定复位的次数。

我一般在程序认为需要的地方给X赋一个唯一值(常用的是0~15),然后当单片机启动时判断是否是正常上电启动,否则再判断是内部看门狗复位,还是外部看门狗复位(外部复位)。如果是内部看门狗复位则将EEPROM里的第X个int16值加1,如果是外部看门狗就将EEPROM里的第16+X个int16值加1。这样程序运行一段时间后,读取EEPROM里的这些int16值就可以知道程序的哪个地方会引起不正常的复位。

用上面的方法还是有些局限的,单片机要能指出复位形式,系统里要有EEPROM

出0入0汤圆

发表于 2011-7-5 02:35:37 | 显示全部楼层
正常,我们在做高压的时候,经常把单片机弄死的,除了掉电就是掉电

出0入0汤圆

发表于 2011-7-5 12:22:43 | 显示全部楼层
有这样的狗。你可以训练一只警犬。

出0入0汤圆

发表于 2011-7-6 21:51:30 | 显示全部楼层
周期性喂狗的思路是正确的.最好贴程序出来.你连个中断都不用.估计你程序不复杂,程序问题可能性大

出0入0汤圆

发表于 2011-7-6 22:26:16 | 显示全部楼层
回复【19楼】encrease  
回复【15楼】asmmcu  
-----------------------------------------------------------------------
不断复位法……这个实在太yd了
-----------------------------------------------------------------------

实在是太yd了。
4年前曾在逆变器产品里用过不断复位法,还以为是自己的山寨方法,原来是有来头的啊,哈哈

出0入0汤圆

发表于 2011-7-7 09:33:06 | 显示全部楼层
这个,我没有遇到过,不过长见识了

出0入0汤圆

发表于 2011-7-7 11:24:15 | 显示全部楼层
回复【27楼】jishanlaike 阿弱
-----------------------------------------------------------------------

可以用555或4060当看门狗,定时时间可以超长。

出0入0汤圆

发表于 2011-7-9 09:00:38 | 显示全部楼层
回复【9楼】pxlpxlpxl
-----------------------------------------------------------------------
以上所讲的意思我明白,但不是程序的问题啊,程序跑飞时或死机时,数码管显示的数字是一堆乱乱码,有的指示灯亮,有的指示亮灭,有时以不同的频率长鸣,有时不响。各个IO口每次死机时,处于不确定的状态。

明白我说的意思了吗?所以说喂狗端有时是高电平,有时是低电平,有时是脉冲输出,反正是死机时,什么状态都有,这已经不关系程序的编写问题了。

我想问的是,有没有一种看门狗集成电路可以识别出喂狗脉冲是正常工作的还是死机时产生的脉冲。  
   
好多人还是没有明白楼主的意思。楼主也没有说清楚喂狗脉冲和死机时的脉冲是不一样的,你用示波器看一下,要是死机时的脉冲依然是你设定的喂狗脉冲,那说明你的喂狗有问题,即主程序跑飞了,没有重启,这种原因可能就是大家说的只在定时器中喂狗了,没有主程序中添加喂狗。主程序死循环的时候,定时器有时还是完好的。   如果像你说的  喂狗端时而高,时而低,不管怎么变化,只要高或者低的时间超过了你的看门狗喂狗时间(看门狗芯片而定),必然要有重启信号输出,如果没有,那就是看门狗芯片问题。

出0入0汤圆

发表于 2011-7-9 15:35:54 | 显示全部楼层
看得我头晕晕!!

出0入0汤圆

发表于 2012-2-23 11:24:06 | 显示全部楼层
死循环中包含喂狗程序。就不复为了。

出0入0汤圆

发表于 2012-2-23 11:35:11 | 显示全部楼层
这个不怨狗

出0入0汤圆

发表于 2012-2-23 11:45:12 | 显示全部楼层
找一个数字式的看门狗,需要写入确定数值才算喂狗,规避脉冲喂狗不就行了

出0入0汤圆

发表于 2012-2-24 10:09:48 | 显示全部楼层
楼上诸位高手,偶学习了。。。。

出0入0汤圆

发表于 2012-4-18 17:53:48 | 显示全部楼层
世界上有很多怪现象,LZ的是狗没有复位输出,但我碰到过CPU死了,不喂狗了,看门狗超时复位了,但是CPU还是起不来,甚至此时直接将CPU的RST接地复位,还是起不来,只有断电重启才能起来。这是是什么原因呢?

出0入0汤圆

发表于 2012-4-18 20:56:40 | 显示全部楼层
没遇到过

出0入0汤圆

发表于 2012-4-18 21:26:49 | 显示全部楼层
lylatyou 发表于 2011-1-18 21:43
main()
//初始化
//开启定时器

经验啊~~~学习了。。。虽然还没有写过c的程序。。。但是准备接下来一段时间好好看看。。。

出0入0汤圆

发表于 2012-4-18 21:28:14 | 显示全部楼层
asmmcu 发表于 2011-1-19 11:48
你加什么的狗都没用,因为喂狗信号都 是由单片机发出.

只要单片机出问题了......那就是单片机死了....外狗 ...

请教什么叫“不断复位法”

出0入0汤圆

发表于 2012-4-18 21:31:37 | 显示全部楼层
有时候单片机就像死掉一样,外部按键复位也无效,看门狗当然也不能复位了!只能掉电了。

出0入0汤圆

发表于 2012-5-2 16:44:42 | 显示全部楼层
请教什么叫“不断复位法”?

出0入0汤圆

发表于 2012-5-2 20:33:22 | 显示全部楼层
zf12862177 发表于 2011-1-19 12:43
说什么也白说。把喂狗的那段程序贴出来。你怎么知道程序跑飞了?外部现象就能说明程序跑飞了?LED不显示, ...


同意,有可能是寄存器溢出,數據錯亂,單片機可能根本就沒有死機.

出0入0汤圆

发表于 2014-9-1 09:14:37 | 显示全部楼层
qianling 发表于 2011-7-5 02:35
正常,我们在做高压的时候,经常把单片机弄死的,除了掉电就是掉电

请问你们后面是怎么解决的?

出0入0汤圆

发表于 2014-9-1 17:49:39 | 显示全部楼层
eagleinfo 发表于 2012-2-24 10:09
楼上诸位高手,偶学习了。。。。

如果能早早的把问题描述清楚,或贴些代码出来,大家也不用猜那么久了。。。。。

出0入0汤圆

发表于 2014-9-1 18:56:14 | 显示全部楼层
所以新的一些芯片里的看门狗(WDT)都增加了一窗口功能,叫WWDT,设置好后就不会出现这个问题了,因为喂早喂迟都不行,呵呵。如果楼主目前的用的不是WWDT,我觉得更重要的是找出死机的原因并解决,而非看门狗。

出30入0汤圆

发表于 2015-3-16 16:06:54 | 显示全部楼层
Robin_King 发表于 2014-9-1 18:56
所以新的一些芯片里的看门狗(WDT)都增加了一窗口功能,叫WWDT,设置好后就不会出现这个问题了,因为喂早 ...

意见正确!纠结于细节,不如找到阳光大道。

出0入0汤圆

发表于 2015-4-20 14:10:16 | 显示全部楼层
yelong98 发表于 2011-1-18 20:23
我也碰到过,电网浪涌的时候居然把看门狗都浪晕了

最近我们的产品也出现电网浪涌把看门狗打挂了,只能掉电重启了,关键是客户要分析报告,要抓狂了;
能和我说说浪涌怎么打死机的么,谢谢啦

出0入0汤圆

发表于 2015-4-20 14:11:23 | 显示全部楼层
yelong98 发表于 2011-1-18 20:23
我也碰到过,电网浪涌的时候居然把看门狗都浪晕了

最近我们的产品也出现电网浪涌把看门狗打挂了,只能掉电重启了,关键是客户要分析报告,要抓狂了;
能和我说说浪涌怎么打死机的么,谢谢啦

出0入21汤圆

发表于 2015-4-20 19:39:36 | 显示全部楼层
决对是你程序设计的问题,与看门狗无关.你有考虑过干拢会改变你的IO输入输出寄存器吗,你考虑过干扰把你的中断和定时器关掉吗,或干扰改变了你大部份的RAM的数据不.你不要简单的认为干扰只会把你单片机搞成死循环,那是不对的,MCU死机后其实它还是在不停的工作的,但PC指针就不是按你程序在跑了.

出0入0汤圆

发表于 2015-4-22 11:44:31 | 显示全部楼层
eworker 发表于 2011-1-18 22:20
回复【楼主位】pxlpxlpxl
-----------------------------------------------------------------------

因为C8051F是软件看萌狗,有的时候等于死狗一条

出0入0汤圆

发表于 2015-4-23 12:38:58 | 显示全部楼层
117433525 发表于 2015-4-20 19:39
决对是你程序设计的问题,与看门狗无关.你有考虑过干拢会改变你的IO输入输出寄存器吗,你考虑过干扰把你的中 ...

说的很有道理,如果碰到这种看门狗问题,确实应该先从软件找找问题。或者烧程序时把没有用的代码区全部填入死循环代码。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 02:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表