原创 一线研发之声:嵌入式C编程经验 之 只有一条清狗语句

2012-1-7 00:39 7145 16 41 分类: 消费电子

/**************************************************************************************************

* Filename:    研发之声:嵌入式C编程经验 只有一条清狗语句

* Author:SedateFire                            E-mail:SedateFire@126.com   

* Version:1.000                                   Time: 2012-01-05    

* key: 看门狗   系统架构  os-less  嵌入式

**************************************************************************************************/

 

一个好的os-less系统,只有一条清狗语句,它位置就固定在main函数中的

while(1)  /* or for(;;;) */

{

       __watchdog_reset();

}

 

如果你有两条以上看门狗语句,那么会有什么后果呢? 在系统足够复杂的时候,很能引起当机,由于静电或者程序自身逻辑的原因,进入了某个思维的盲点,系统进入一个有清狗语句的死循环里面,退不出来。这是最危险的,尴尬的,蒙羞的事情。

 

那么多出来的清狗语句,一般会用在哪里呢?

 

1.  系统初始化,有些设备初始化需要读取它的反馈状态,用while,担心复位,于是清狗。我一般用While (dev_read_status() && (i--)),这个i,32位顶天了。一般mcu没这么快法。

 

2. mcu睡眠前清狗。有些人喜欢在系统进入睡眠前清狗一下,担心系统刚好在那一刻复位。这只能说明你对自己的程序不了解,主回圈程序一圈下来,最大执行时间其实心中有数。函数多少深度宽度心中要有低。如果刚好睡眠前一刻复位,那也有可能在跑别的函数过程中复位。

 

3.   某些应用逻辑貌似要需要hold住,比如屏幕的暂停显示2秒钟等。许多人生生地把这种逻辑做成“硬延时”,就是死等。这是一个令人戚眉的做法,因为这意味麻烦的开始。在你需要暂停显示n秒的过程中,我的一切用户体验你无法响应我了,按键没反应,蜂鸣器不响,led灯不闪烁,一切好像死机了一样。等到系统显示完成后,用户心中大舒一口气,心中悬石落地,你终于又回气儿活过来了。这是糟糕的体验。

 

         好吧,为了改善体验,许多人就想办法来。把用户体验搬到中断里面做,这是另外一个麻烦的开始,全局变量的增多和跨模块的判断,其根源之一始于此,弄个不好,就是随机性崩溃。中断程序变胖,终究是不方便的,于是为了改进,就只好在中断程序中置标志位,然后在hold_delay(TIME)函数的循环中清狗,并且判断标志位作响应动作。许多应用逻辑需要hold住的地方何其多,上九天下地府处处添加,函数深度不可测,逻辑递归难判断,系统大乱的祸患就此埋下。

 

        那如何解决呢,事件--状态机,一句话概括,在当前状态下,遇到某某事件,则执行什么动作后,进入下一个状态。它似表非表,如水般自然,像空气般无痕……好了,其实是我不愿多讲,若要具体讲下去,恐怕涉及公司知识产权。尽管这个事件状态机思想是个公开的秘密,原理大家都懂,但做得好的还不多见。Hold住本身就是一种状态,看你如何抽象它了。

 

         佛曰:菩萨畏因,凡夫畏果。那灾难之源,是需要敬畏戒惧的,待到结果发生,悔之莫及。

文章评论25条评论)

登录后参与讨论

caoyongquancyq_239544526 2012-3-13 12:16

学习了

allen_zhan_752827529 2012-2-13 18:45

也许不绝对? 喂狗不可以放在中断, 按我的理解, 可能你顾忌到了两点. (1) 中断是可以关闭的, 关闭中断后, 喂狗是无法维护的. (2) main loop 存在 dead loop 的可能, 但是中断仍然按时发生喂狗. 但是换个角度, 我考虑这个说法, 中断的控制不是由我们决定并维护吗? 是否 disable/enable interrupt, 以及处理时间, 由我们自行决定. 关于 main loop 的 dead loop, 我倒想问, 如果出于这样的顾虑, 那么反过来, main loop 中不断喂狗, 但是 uP 的中断服务却意外正常或不正常中止或异常工作, 但是系统某类功能无反应, 又该如何思考呢? 我的看法, 中断不宜存在喂狗, 但是, 并无绝对, 也非切忌, 因为我们才是这个 application 的主人, 为何使用它, 何处使用它, 在我们实际的调试和逻辑建设中, 那么不同实现手段, 自有其存在理由.

用户1642939 2012-2-2 17:54

GOOD

allen_zhan_752827529 2012-1-30 16:44

不是很明白, 多余的 feed watchdog 会进入一个死循环是指什么. 一般而言, 我们对 feed watchdog 重视的原因. 主要是因为 feed watchdog 需要关闭中断, 执行喂狗后在进行恢复. 我们以一个 arm 体系为例, 这种关闭中断的行为风险较高. 当 IRQ 信号被送到 core, 并被 handler 等待处理的间隔内, 考虑到无法终止的当前 pipeling 的剩余代码仍然在执行. 如果 disable interrupt 在此时生效, 则系统将进入 spurious interrupt, 姑且按字面意思, 称其为伪中断. 一个没有正确处理的伪中断, 将使用 default VIC 地址, 表现为 reset like 行为. 也就是说, 可能发生莫名的重启事件. 因此对于 feed watchdog 语句, 在 arm 中, 一个完整的做法, 是 while(1) 中, feed wt 序列之前 disable interrupt 并之后 resume interrupt, 同时需要安排一个 spuriour interrupt handler 给 default VIC address, 这样的喂狗处理就基本完备并可靠了. 但是也许你会经历一个看来"无响应"的 timer service, 可是无论如何, 这比 timer match 触发到达时的一个莫名的 reset 要好, 不是吗?

用户1545959 2012-1-16 10:31

还有,切忌喂狗不要放在中断里面!

用户1036280 2012-1-14 09:36

一条清狗语句

moguojing_304802541 2012-1-13 11:09

从清狗跳到了调度?希望能再深度点~~感谢分享经验

用户1639872 2012-1-11 02:02

天空没有翅膀的痕迹,但打酱油的已经飞过 自己顶自己吧,也许语气太嚣张,但引君拍砖罢了,我关注那些有不同意见

用户1639872 2012-1-11 01:45

呵呵 你看看你自己家的回复吧 “自己修改自己的留言当然不会有错,但是如果博主可以修改你的留言就有点不大对了,我可以改成一片歌功颂德哦”是我添加的

用户1277994 2012-1-9 14:18

自己是可以修改自己的发言的,并且时间会改变。对于这一点大家有什么意见吗?

注意哦,这是博主回答哦,直接回答哦:自己修改自己的留言当然不会有错,但是如果博主可以修改你的留言就有点不大对了,

我可以改成一片歌功颂德哦

相关推荐阅读
用户1639872 2014-03-16 12:07
营销自己,实名还是“艺名”好?
积累了一些技术心得,想在网上发点文章博点人气,本着先有名后有利的想法。多数人都是用个“艺名”,用马甲在混。问题在于:马甲这个东西,优点就是好记,而且有一种神秘感,也许自己就是个屌丝,但文章过硬,也...
用户1639872 2014-03-11 23:55
当心中有了牵挂
       上个周末,回老家看2周多的女儿。离别的时候,我不敢扭头就上了车,眼泪就不可遏地直流下来...         以前看宝宝时,离开时只要说句bye,她就呵呵地和你bye,甚至头也不...
用户1639872 2014-01-19 01:29
不知幸亦或不幸,路在何方?
晚上公司尾牙,鉴于往年素餐尾牙吃不饱的经验。部门内部几天前就发起了一场尾牙结束后的k歌聚会。当时没有报名,感觉k歌确实没什么吸引我的。尾牙结束回家的路上,搭乘同事的车,耐不住满车同事的煽动,想想还...
用户1639872 2013-12-25 00:27
一线研发之声 之 完美主义者的程序员特征 <二>
3.空格、换行、常量替换、{}保护、还有效率。 if((long_state_var==1)||(long_state_var==2)||((ch>0x2F)&...
用户1639872 2013-12-24 10:46
一线研发之声 之 完美主义者的程序员特征 <一>
    观文识人,代码无疑是了解一个程序员的最佳途径。     且不论算法思路,单就代码的界面风格,便可知一二。     1. 追求精美的对齐。 尽可能精确到每一个"断点",是他的...
用户1639872 2013-12-23 16:23
一线研发之声 之 C代码注释引发的“血案” (二)
上接:一线研发之声 之 C代码注释引发的“血案 (一)       我开始思考,还有什么强劲有力的理由,来支持我恪守的真理:c语言代码注释必须使用/**/. 有的!      倘若...
我要评论
25
16
关闭 站长推荐上一条 /2 下一条