打印

请教下看门狗喂狗问题

[复制链接]
12677|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
szn1423|  楼主 | 2012-4-5 23:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2012-4-6 08:24 | 只看该作者
喂饱是基本准则

使用特权

评论回复
板凳
程序匠人| | 2012-4-6 09:29 | 只看该作者
先说题外话:“主程序里面包含一个按键检查电路”——程序里包含电路?第一句话就是错句。但愿你写程序不是如此不严谨。

再说正事:
编程首先要有好的编程思想。比如:
1、主程序中,不应该直接嵌入具体的功能性语句。应该以函数(或子程序)的形式。
2、函数(或子程序)中不应该有不必要的延时等待。应该有分时操作的概念。比如按键消抖的时候,或者等待按键释放的时候,应该退出按键检测程序,避免影响其他任务的执行。
3、喂狗语句,一般只需要一条,就是放在主程序中喂狗。

如果严格按上述思想去做,楼主的问题就不存在。

使用特权

评论回复
地板
szn1423|  楼主 | 2012-4-6 10:37 | 只看该作者
本帖最后由 szn1423 于 2012-4-6 11:23 编辑

3# 程序匠人

首先谢谢指点,我还是不太明白,我是个新手,我理解看门狗是这么用的:先给看门狗定时器设定一个时间,这个时间要稍大于主程序的执行时间,然后在主程序里面执行看门狗定时器清零,使其重新计数。可是如果主程序的执行时间不固定的话,看门狗定时器的设定时间也就很难保证大于主程序执行时间,我想不明白怎么处理这种情况。
我好像明白一点儿了,是不是说主程序在按键等待期间还是要继续循环的,这次主程序运行时有按键按下,可以在下次主程序运行时处理,这样的话只需要留出按键扫描的时间就够了,是这样吗?

使用特权

评论回复
5
海川先生| | 2012-4-6 11:14 | 只看该作者
3# 程序匠人
学习了

使用特权

评论回复
6
mindshare| | 2012-4-6 11:20 | 只看该作者
本帖最后由 mindshare 于 2012-4-6 11:22 编辑

使用看门狗的其中一个主要用处就是为了防止程序长时间不响应而导致的死机,如果你连主程序或者其调用的子程序/函数执行的最大时间都无法确定的话,是无法用看门狗的;因为当程序xxx时间内都不跑主程序时,你不知道是程序异常了(死机,out of control),还是处于正常执行状态。

碰到这种状况,你首先要将你的程序做一个梳理,画一个流程图,分析出流程图中可能会超过你设定的清狗时间的分支,那么在进入这些流程之前关闭看门狗,退出流程时再打开,不过这样做是有风险的,如果程序刚好挂在这个流程中,那么程序就死翘翘了,只能硬复位

使用特权

评论回复
7
海川先生| | 2012-4-6 11:23 | 只看该作者
4# szn1423
匠人说分时操作 意思是不是你进参数设定中的时间需要有个时间限制,比如1s无按键动作就自动退出参数设定 。。。

使用特权

评论回复
8
mindshare| | 2012-4-6 11:30 | 只看该作者
按键检测/等待一定是要在主程序中做,参数设定那个子程序/子模块是由主程序给其传递按键值~~

不能在进入参数设定子程序/子模块后,就由参数设定子程序/子模块来检测/等待按键吧... 这是不合理的程序架构...  :)

使用特权

评论回复
9
zd420325| | 2012-4-6 11:36 | 只看该作者
学习使用扫描的方式进行延时消抖,可以用定时器做.尽量不用delay.还有不要把按下的时间空等待,要知道,如果按下1S钟,MCU等待1S是很长时间的.

使用特权

评论回复
10
mindshare| | 2012-4-6 11:52 | 只看该作者
示例代码:
While(1)
{
     clearWatchDog();
     ……
     ……
     key = checkKeyStatus();
    if(key!=invalid)     
   {
      ModuleManage(key);
    }

   ……
   ……      
}

checkKeyStatus() 是获取按键值,关于按键的处理做在定时中断中才合理,按键去抖等并不是在哪里死等,而是靠定时中断次数计算已经等了多长时间....

使用特权

评论回复
11
程序匠人| | 2012-4-6 12:37 | 只看该作者
3# 程序匠人

首先谢谢指点,我还是不太明白,我是个新手,我理解看门狗是这么用的:先给看门狗定时器设定一个时间,这个时间要稍大于主程序的执行时间,然后在主程序里面执行看门狗定时器清零,使其重新计数。可是 ...
szn1423 发表于 2012-4-6 10:37


你的最后一段话就是答案。

分时操作。就是说所有要让MCU空等的时间,都要尽量避免。

建议看看匠人手记,哈哈。

使用特权

评论回复
12
程序匠人| | 2012-4-6 12:42 | 只看该作者
4# szn1423  
匠人说分时操作 意思是不是你进参数设定中的时间需要有个时间限制,比如1s无按键动作就自动退出参数设定 。。。
海川先生 发表于 2012-4-6 11:23


你这句话,还没有正确讲出分时操作的概念。

不能等“1s无按键动作”才退出。而是应该不管有没有按键,都立即退出。

1S钟,对于MCU来说,意味着1000000条指令的执行时间(假设是1us一条的话)啊。

使用特权

评论回复
13
xlsbz| | 2012-4-6 12:50 | 只看该作者
hotpower中断喂狗论 你可以参考一下

使用特权

评论回复
14
joyme| | 2012-4-6 13:39 | 只看该作者
这个时间要稍大于主程序的执行时间

不是稍大于主程序执行时间,要远大于才对,稍大于的话你加几个语句或加些功能执行长了就得不停的改这个数据

使用特权

评论回复
15
lzqxs89| | 2012-4-6 14:01 | 只看该作者
你参数设定程序要跑很长的时间,不退出?

使用特权

评论回复
16
lzqxs89| | 2012-4-6 14:04 | 只看该作者
while(1)
{
喂狗;
if(定时标识)
{
里面就是按键程序;
}
}
程序应该要不停地跑,而不是停在那里等!

使用特权

评论回复
17
原野之狼| | 2012-4-6 14:19 | 只看该作者
找点程序结构方面的**看看   或者干脆看《匠人手记》:lol

使用特权

评论回复
18
原野之狼| | 2012-4-6 14:19 | 只看该作者
找点程序结构方面的**看看   或者干脆看《匠人手记》:lol

使用特权

评论回复
19
小z| | 2012-4-6 16:14 | 只看该作者
为啥不在定时器中断里喂狗

使用特权

评论回复
20
程序匠人| | 2012-4-6 17:17 | 只看该作者
为啥不在定时器中断里喂狗
小z 发表于 2012-4-6 16:14


尽量不要在定时器中断中喂狗。
万一主程序乱跳了,而中断却照样发生,看门狗就无法起到监控作用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

251

主题

462

帖子

4

粉丝