smset 发表于 2013-4-10 22:23:40

看看,单片机不死机的喂狗方法

unsigned short dogcount=0;


10ms定时器中断响应函数(){


if (dogcount++ > 10000) { //主程序10秒都没喂狗

   while(1)执行复位CPU指令(如果有的话) ;
      
}
else{

   喂硬件狗; //如果有硬件狗的话
   
}

}

void main(){

。。一些初始化指令

while(1){//主循环
    dogcount=0;//整个程序唯一一个逻辑喂狗的地方

    其他代码;//只要单次循环最大时间不超过10秒即可,无需任何其他地方有喂狗代码。   


}

}


smset 发表于 2013-4-10 23:05:39

中断里不能喂狗只是常规的方法,这里的喂狗方法是经过长期总结以及大量产品多年持续运行验证的,效果远优于一般的喂狗法,所以不要太早下结论,呵呵

wangchin1988 发表于 2013-4-10 23:16:26

楼主可否详解一下这种方式的优势?

modelfly 发表于 2013-4-10 23:18:16

多任务协作喂狗是比较可靠的方法。中断喂狗会出现任务挂起,但是狗不叫的情况。

smset 发表于 2013-4-10 23:21:08

superAFE 发表于 2013-4-10 22:45
再看了看,原来楼主还有利用MCU内部的定时器做看门狗的意思,
但如果你的定时器的时钟源是取自系统的时钟的 ...

一般来说应用程序跑飞了,定时器中断还会如期进行,然后如果计数器变量无论被干扰成什么值,都会在10秒时大于等于1000,从而复位,致于定时器中断都完全没了,那得极大的干扰,这时外部硬件狗会动作,因为喂狗动作也没了。也就是说:如果有定时器中断,那么无论主程序的代码怎么飞,变量怎么乱,中断程序会保证会十秒内复位Cpu,而如果定时器中断没了,则硬狗一定会立即复位Cpu,逻辑上全覆盖。还能有例外吗?

smset 发表于 2013-4-10 23:34:50

另外的好处就是主程序中只需一句喂狗行,就管十秒(也可调成其它值,基本上其它代码处均无需再考虑是否需要喂狗了,好处你懂的

囧囧有神经 发表于 2013-4-11 01:26:07

学习了{:smile:}{:smile:}{:smile:}

ijlc1314 发表于 2013-4-11 01:35:05

谢谢楼主的方法

billwsy 发表于 2013-4-11 01:49:59

volatile?

zhangyadong90 发表于 2013-4-11 07:57:05

modelfly 发表于 2013-4-10 23:18:16 static/image/common/back.gif
多任务协作喂狗是比较可靠的方法。中断喂狗会出现任务挂起,但是狗不叫的情况。

设置中断优先级就行。

foxpro2005 发表于 2013-4-11 08:24:08

方法不错,学习了..

welcome_cool 发表于 2013-4-11 09:15:56

很好的方法。

aworker 发表于 2013-4-11 10:09:05

定时器中可以做喂狗计数,但喂狗代码还是放在主循环中比较好!

zenith1032 发表于 2013-4-11 11:18:10

虚心求教楼主,硬件狗是指单片机的看门狗吗??这个喂狗,对单片机看门狗的溢出时间有要求吗??

mathison 发表于 2013-11-9 09:59:52

本帖最后由 mathison 于 2013-11-9 10:02 编辑

zenith1032 发表于 2013-4-11 11:18 static/image/common/back.gif
虚心求教楼主,硬件狗是指单片机的看门狗吗??这个喂狗,对单片机看门狗的溢出时间有要求吗?? ...

在楼主给出的代码中 看门狗的溢出时间 〉10ms 即可

实际中需要考虑 中断被延后执行 的可能

gshuang1 发表于 2013-11-9 10:08:18

这种方法可能在很多情况下没问题,但是一旦程序跑飞到dogcount永远都不超过10000就失效了,只要写出的代码有问题这种情况是会发生的。

mathison 发表于 2013-11-9 10:11:06

又跟楼主学了一招 哈哈哈 楼主没有失 我却有所得

只要你思考 便有所得

不知不觉
后知后觉
先知先觉

昔日残阳 发表于 2013-11-9 23:45:56

学习了,不过楼主的办法是建立在程序卡死的情况而不是硬件死机的情况

woshiqinyikun 发表于 2013-11-10 10:07:18

学习了,不过书上写的都是有专门的看门狗定时器的···
不过还是实践出真知啊

wazhiyi 发表于 2014-2-18 20:34:39

又学习了

jim0574 发表于 2014-2-19 09:12:09

学习了!

zzz123456 发表于 2014-5-15 16:23:03

记号,收藏了

hz_luping 发表于 2014-5-15 18:39:54

记号{:lol:}

jz701209李 发表于 2014-5-20 16:55:58

学习学习,谢谢

cmheia 发表于 2014-5-20 17:04:19

{:lol:}学到一招,有时间试试

wind2100 发表于 2014-7-8 15:59:33

楼主是有经验的老手了(喂狗的地方不能太多,要提前喂狗 10S饿,1S就得喂一次) ,我刚接到一个人家搞的,现在人走了, 在MAIN里面 喂N次狗的, 产品中狗乱叫,现在要返工了. 一个函数执行时间从1MS-10MS都有可能,然而喂狗周期是4MS ,这怎么喂法!

ilikemcu 发表于 2014-7-8 16:51:10

没钱,从来养不起狗的漂过....................................不是所有电工都养得起狗狗的{:titter:}

youmu 发表于 2014-7-8 17:06:42

mark,是个新思路

zcan 发表于 2014-7-16 17:22:52

裸机跑惯了 觉得要是有个这样的调度器多爽 这就有了 {:lol:}

骚黄 发表于 2014-7-16 21:36:09

经常碰到程序跑飞,但是碰巧还在不停的喂狗,用LZ这招好像就没啥效果了吧。。。{:lol:}

babysnail 发表于 2014-7-16 22:38:57

软狗没用的,中断一但被冲了,进不了中断 就成死狗了。 现在的芯片一般带硬狗,狗的时钟还必须独立。

211LIRUISHUO 发表于 2014-7-17 12:55:42

先学习了,以后找机会试试{:lol:}

jiespring 发表于 2014-7-17 13:02:44

马克再说,谢谢楼主

r166 发表于 2014-7-17 13:21:06

楼主给解释一下什么叫“单片机不死机的喂狗方法”

tigerman520 发表于 2014-7-17 14:39:58

学习了,一般都是在主程序内喂一次狗的。

zhugean 发表于 2014-7-17 16:08:52

smset 发表于 2013-4-10 23:05
中断里不能喂狗只是常规的方法,这里的喂狗方法是经过长期总结以及大量产品多年持续运行验证的,效果远优于 ...

确实还不错,就是10秒有点长

klxx68 发表于 2014-7-17 17:39:06

smset 发表于 2013-4-10 23:21
一般来说应用程序跑飞了,定时器中断还会如期进行,然后如果计数器变量无论被干扰成什么值,都会在10秒时 ...

仔细看了下,还是没看懂。有硬件狗的话,程序跑飞都会复位,没硬件狗的话,程序跑飞如果进不了中断,这种写法就没用啊。
另外在程序正常运行的时候,按照你这种写法本来就是10ms喂次狗(dogconut不会大于1000,else喂狗),没看出好在哪里啊。
请讲解下,谢谢。

hwbrat 发表于 2014-7-17 17:53:36

楼主的方法只是相当于用定时中断配合硬件狗拓展了硬件狗的溢出周期而已。如果硬件狗的溢出周期也是10s,只在主循环用一次喂硬件狗的指令的效果是一样的。

lyflyaway 发表于 2014-7-17 21:40:14

不是所有mcu都有复位指令

ludikn 发表于 2014-7-17 23:49:48

单片机的看门狗本身就有定时,干嘛多搞了个定时器。

fengyunyu 发表于 2014-7-18 07:10:26

一般是定时器喂狗计数,主循环喂狗。

GunGun 发表于 2014-7-18 07:34:17

smset 发表于 2013-4-10 23:21
一般来说应用程序跑飞了,定时器中断还会如期进行,然后如果计数器变量无论被干扰成什么值,都会在10秒时 ...

请教一下,这里的硬狗,是指单片机里面的硬狗,还是楼主在单片机外面又加了一颗硬狗IC?

死神 发表于 2015-4-28 22:06:06

lyflyaway 发表于 2014-7-17 21:40
不是所有mcu都有复位指令

没有复位指令,楼主的方法也是可以用的。

死神 发表于 2015-4-28 22:08:58

fengyunyu 发表于 2014-7-18 07:10
一般是定时器喂狗计数,主循环喂狗。

   如果有段程序需要执行的时间很长,你不久要在很多地方喂狗了,楼主就没这问题

死神 发表于 2015-4-28 22:11:30

骚黄 发表于 2014-7-16 21:36
经常碰到程序跑飞,但是碰巧还在不停的喂狗,用LZ这招好像就没啥效果了吧。。。 ...

   楼主这招还是可以用的

死神 发表于 2015-4-28 22:18:31

楼主太强大了

a595336060 发表于 2015-7-8 11:12:47

又学到新姿势了

kcfoo1 发表于 2015-7-10 15:08:15

有硬件狗了还要牺牲一个定时器做软件狗,竟然用定时器喂硬件狗,脱裤子放屁多此一举,等你定时器死了,还不是靠硬件狗给你复位,有本事你不用硬件狗来保证你程序有效复位那才是牛,

kcfoo1 发表于 2015-7-10 15:10:49

lz其实就是在偷换概念,把主程序里的喂狗变成了喂定时器,然后靠定时器喂狗。

xiaobendan 发表于 2015-7-10 18:13:46

狗狗真的有用吗?
多数干扰来自输出的动作,动作输出后死机了,要求实时性很高的地方,可能要在几秒深圳几十毫秒时间内发出下一个输出动作。10秒,机器都撞散架了。

王二小 发表于 2023-7-16 01:59:54

楼主方法可以的,有没有大佬知道楼主的qq群为啥解散了?

akey3000 发表于 2023-7-16 05:43:52

一直这样用
页: [1]
查看完整版本: 看看,单片机不死机的喂狗方法