/***************************************************************** * Filename: 研發(fā)之聲:嵌入式C編程經(jīng)驗 之 只有一條清狗語句 * Author:SedateFire E-mail:SedateFire@126.com * Version:1.000 Time: 2012-01-05 * key: 看門狗 系統(tǒng)架構(gòu) os-less 嵌入式 ********************************************************************/ 一個好的os-less系統(tǒng),只有一條清狗語句,它位置就固定在main函數(shù)中的 while(1) /* or for(;;;) */ { __watchdog_reset(); } 如果你有兩條以上看門狗語句,那么會有什么后果呢? 在系統(tǒng)足夠復(fù)雜的時候,很能引起當(dāng)機,由于靜電或者程序自身邏輯的原因,進(jìn)入了某個思維的盲點,系統(tǒng)進(jìn)入一個有清狗語句的死循環(huán)里面,退不出來。這是最危險的,尷尬的,蒙羞的事情。 那么多出來的清狗語句,一般會用在哪里呢? 1. 系統(tǒng)初始化,有些設(shè)備初始化需要讀取它的反饋狀態(tài),用while,擔(dān)心復(fù)位,于是清狗。我一般用While (dev_read_status() && (i--)),這個i,32位頂天了。一般mcu沒這么快法。 2. mcu睡眠前清狗。有些人喜歡在系統(tǒng)進(jìn)入睡眠前清狗一下,擔(dān)心系統(tǒng)剛好在那一刻復(fù)位。這只能說明你對自己的程序不了解,主回圈程序一圈下來,最大執(zhí)行時間其實心中有數(shù)。函數(shù)多少深度寬度心中要有低。如果剛好睡眠前一刻復(fù)位,那也有可能在跑別的函數(shù)過程中復(fù)位。 3. 某些應(yīng)用邏輯貌似要需要hold住,比如屏幕的暫停顯示2秒鐘等。許多人生生地把這種邏輯做成“硬延時”,就是死等。這是一個令人戚眉的做法,因為這意味麻煩的開始。在你需要暫停顯示n秒的過程中,我的一切用戶體驗?zāi)銦o法響應(yīng)我了,按鍵沒反應(yīng),蜂鳴器不響,led燈不閃爍,一切好像死機了一樣。等到系統(tǒng)顯示完成后,用戶心中大舒一口氣,心中懸石落地,你終于又回氣兒活過來了。這是糟糕的體驗。 好吧,為了改善體驗,許多人就想辦法來。把用戶體驗搬到中斷里面做,這是另外一個麻煩的開始,全局變量的增多和跨模塊的判斷,其根源之一始于此,弄個不好,就是隨機性崩潰。中斷程序變胖,終究是不方便的,于是為了改進(jìn),就只好在中斷程序中置標(biāo)志位,然后在hold_delay(TIME)函數(shù)的循環(huán)中清狗,并且判斷標(biāo)志位作響應(yīng)動作。許多應(yīng)用邏輯需要hold住的地方何其多,上九天下地府處處添加,函數(shù)深度不可測,邏輯遞歸難判斷,系統(tǒng)大亂的禍患就此埋下。 那如何解決呢,事件--狀態(tài)機,一句話概括,在當(dāng)前狀態(tài)下,遇到某某事件,則執(zhí)行什么動作后,進(jìn)入下一個狀態(tài)。它似表非表,如水般自然,像空氣般無痕……好了,其實是我不愿多講,若要具體講下去,恐怕涉及公司知識產(chǎn)權(quán)。盡管這個事件狀態(tài)機思想是個公開的秘密,原理大家都懂,但做得好的還不多見。Hold住本身就是一種狀態(tài),看你如何抽象它了。 佛曰:菩薩畏因,凡夫畏果。那災(zāi)難之源,是需要敬畏戒懼的,待到結(jié)果發(fā)生,悔之莫及。 |