看看,单片机不死机的喂狗方法
unsigned short dogcount=0;10ms定时器中断响应函数(){
if (dogcount++ > 10000) { //主程序10秒都没喂狗
while(1)执行复位CPU指令(如果有的话) ;
}
else{
喂硬件狗; //如果有硬件狗的话
}
}
void main(){
。。一些初始化指令
while(1){//主循环
dogcount=0;//整个程序唯一一个逻辑喂狗的地方
其他代码;//只要单次循环最大时间不超过10秒即可,无需任何其他地方有喂狗代码。
}
}
中断里不能喂狗只是常规的方法,这里的喂狗方法是经过长期总结以及大量产品多年持续运行验证的,效果远优于一般的喂狗法,所以不要太早下结论,呵呵 楼主可否详解一下这种方式的优势? 多任务协作喂狗是比较可靠的方法。中断喂狗会出现任务挂起,但是狗不叫的情况。 superAFE 发表于 2013-4-10 22:45
再看了看,原来楼主还有利用MCU内部的定时器做看门狗的意思,
但如果你的定时器的时钟源是取自系统的时钟的 ...
一般来说应用程序跑飞了,定时器中断还会如期进行,然后如果计数器变量无论被干扰成什么值,都会在10秒时大于等于1000,从而复位,致于定时器中断都完全没了,那得极大的干扰,这时外部硬件狗会动作,因为喂狗动作也没了。也就是说:如果有定时器中断,那么无论主程序的代码怎么飞,变量怎么乱,中断程序会保证会十秒内复位Cpu,而如果定时器中断没了,则硬狗一定会立即复位Cpu,逻辑上全覆盖。还能有例外吗? 另外的好处就是主程序中只需一句喂狗行,就管十秒(也可调成其它值,基本上其它代码处均无需再考虑是否需要喂狗了,好处你懂的 学习了{:smile:}{:smile:}{:smile:} 谢谢楼主的方法 volatile? modelfly 发表于 2013-4-10 23:18:16 static/image/common/back.gif
多任务协作喂狗是比较可靠的方法。中断喂狗会出现任务挂起,但是狗不叫的情况。
设置中断优先级就行。 方法不错,学习了.. 很好的方法。 定时器中可以做喂狗计数,但喂狗代码还是放在主循环中比较好! 虚心求教楼主,硬件狗是指单片机的看门狗吗??这个喂狗,对单片机看门狗的溢出时间有要求吗?? 本帖最后由 mathison 于 2013-11-9 10:02 编辑
zenith1032 发表于 2013-4-11 11:18 static/image/common/back.gif
虚心求教楼主,硬件狗是指单片机的看门狗吗??这个喂狗,对单片机看门狗的溢出时间有要求吗?? ...
在楼主给出的代码中 看门狗的溢出时间 〉10ms 即可
实际中需要考虑 中断被延后执行 的可能 这种方法可能在很多情况下没问题,但是一旦程序跑飞到dogcount永远都不超过10000就失效了,只要写出的代码有问题这种情况是会发生的。 又跟楼主学了一招 哈哈哈 楼主没有失 我却有所得
只要你思考 便有所得
不知不觉
后知后觉
先知先觉 学习了,不过楼主的办法是建立在程序卡死的情况而不是硬件死机的情况 学习了,不过书上写的都是有专门的看门狗定时器的···
不过还是实践出真知啊 又学习了 学习了! 记号,收藏了 记号{:lol:} 学习学习,谢谢 {:lol:}学到一招,有时间试试 楼主是有经验的老手了(喂狗的地方不能太多,要提前喂狗 10S饿,1S就得喂一次) ,我刚接到一个人家搞的,现在人走了, 在MAIN里面 喂N次狗的, 产品中狗乱叫,现在要返工了. 一个函数执行时间从1MS-10MS都有可能,然而喂狗周期是4MS ,这怎么喂法! 没钱,从来养不起狗的漂过....................................不是所有电工都养得起狗狗的{:titter:} mark,是个新思路 裸机跑惯了 觉得要是有个这样的调度器多爽 这就有了 {:lol:} 经常碰到程序跑飞,但是碰巧还在不停的喂狗,用LZ这招好像就没啥效果了吧。。。{:lol:} 软狗没用的,中断一但被冲了,进不了中断 就成死狗了。 现在的芯片一般带硬狗,狗的时钟还必须独立。 先学习了,以后找机会试试{:lol:} 马克再说,谢谢楼主 楼主给解释一下什么叫“单片机不死机的喂狗方法” 学习了,一般都是在主程序内喂一次狗的。 smset 发表于 2013-4-10 23:05
中断里不能喂狗只是常规的方法,这里的喂狗方法是经过长期总结以及大量产品多年持续运行验证的,效果远优于 ...
确实还不错,就是10秒有点长 smset 发表于 2013-4-10 23:21
一般来说应用程序跑飞了,定时器中断还会如期进行,然后如果计数器变量无论被干扰成什么值,都会在10秒时 ...
仔细看了下,还是没看懂。有硬件狗的话,程序跑飞都会复位,没硬件狗的话,程序跑飞如果进不了中断,这种写法就没用啊。
另外在程序正常运行的时候,按照你这种写法本来就是10ms喂次狗(dogconut不会大于1000,else喂狗),没看出好在哪里啊。
请讲解下,谢谢。 楼主的方法只是相当于用定时中断配合硬件狗拓展了硬件狗的溢出周期而已。如果硬件狗的溢出周期也是10s,只在主循环用一次喂硬件狗的指令的效果是一样的。 不是所有mcu都有复位指令 单片机的看门狗本身就有定时,干嘛多搞了个定时器。 一般是定时器喂狗计数,主循环喂狗。 smset 发表于 2013-4-10 23:21
一般来说应用程序跑飞了,定时器中断还会如期进行,然后如果计数器变量无论被干扰成什么值,都会在10秒时 ...
请教一下,这里的硬狗,是指单片机里面的硬狗,还是楼主在单片机外面又加了一颗硬狗IC? lyflyaway 发表于 2014-7-17 21:40
不是所有mcu都有复位指令
没有复位指令,楼主的方法也是可以用的。 fengyunyu 发表于 2014-7-18 07:10
一般是定时器喂狗计数,主循环喂狗。
如果有段程序需要执行的时间很长,你不久要在很多地方喂狗了,楼主就没这问题 骚黄 发表于 2014-7-16 21:36
经常碰到程序跑飞,但是碰巧还在不停的喂狗,用LZ这招好像就没啥效果了吧。。。 ...
楼主这招还是可以用的 楼主太强大了 又学到新姿势了 有硬件狗了还要牺牲一个定时器做软件狗,竟然用定时器喂硬件狗,脱裤子放屁多此一举,等你定时器死了,还不是靠硬件狗给你复位,有本事你不用硬件狗来保证你程序有效复位那才是牛, lz其实就是在偷换概念,把主程序里的喂狗变成了喂定时器,然后靠定时器喂狗。 狗狗真的有用吗?
多数干扰来自输出的动作,动作输出后死机了,要求实时性很高的地方,可能要在几秒深圳几十毫秒时间内发出下一个输出动作。10秒,机器都撞散架了。 楼主方法可以的,有没有大佬知道楼主的qq群为啥解散了? 一直这样用
页:
[1]