時序就像脈搏,一點都錯不得
浪子三唱,不唱悲歌,紅塵間,悲傷事,已太多。
本文引用地址:http://m.butianyuan.cn/article/201811/393985.htm佛祖有云,人生八苦交煎,所謂八苦者,生、老、病、死、求不得、怨憎會、愛別離、五陰熾盛。春天百花開,秋天黃葉落,人之生老病死在所難免,但樂觀主義者每每在生活的荊棘中找出一條小徑來,肩住黑暗的閘門,灑下光明的福音。他們以飲食有節(jié)、起居有定、鍛煉有時抵抗衰老和病痛,調(diào)素琴,閱金經(jīng),清心寡欲,也可逃過求不得、怨憎會、愛別離之折磨,但唯有這五陰熾盛,如影子隨身,揮之不去。
五陰者,色、受、想、行、識。色者,肉身也,雖然微觀上生滅不已,但以其變化緩慢,總讓人產(chǎn)生青春永駐、歲月靜好之錯覺,只是蒼天愛輪回,又曾饒過誰?受、想、行、識卻都在精神層面,感受(受)時而無風(fēng)無浪,如靜海深流,時而大風(fēng)大雨、肆意磅礴;想法(想)此起彼伏,像個五六歲的小男孩一樣鬧個不停;念念遷流不?。ㄐ校?,前赴后繼;其背后的“識”也總在夢中像個畫師一樣,勾勒出五彩的夢境。在灑家看來,人生最苦就在這五陰熾盛了。因為,每次工作中遇到了大bug,身體都會被搞得疲憊不堪,內(nèi)心誠惶誠恐,腦袋里想法一個接著一個,想閉目休息一下吧,念頭還總是一個接一個地不斷蹦出來,攪擾得不得安寧,真真叫一個苦啊!
1
魯迅先生說過,“人生最苦痛的是夢醒了無路可以走。做夢的人是幸福的,倘沒有看出可走的路,最要緊的是不要去驚醒他?!蔽以谧右箷r分悄然醒來,一時竟不知身在何處。重慶的夜異常寂靜,月色如洗,爬過窗臺,傾瀉了一地,在朦朧的月光中,好像罩著一層輕紗,溫柔地?fù)嵛恐鷩塘艘惶旌蟪脸寥胨拇蟮?。我躺在賓館的床上,腦袋空空,心中一片茫然,反復(fù)咀嚼著魯迅先生的這句話。折騰一天,好不容易睡著,本該好好休息了,偏偏五陰熾盛起來,攪了清夢不說,偏偏“夢醒了無路可以走”,豈非是先生所言“人生最苦痛的”?
自從接了這個BCM的活,兩度寒暑,時間不長不短,卻也光顧重慶多次了。調(diào)試、測試、路試、試產(chǎn)、量產(chǎn),一步步走來,步步驚心。自上回修改路試出現(xiàn)的問題之后,已經(jīng)過去一年有余了,灑家做的這款BCM也終于量產(chǎn)裝車了。都說好事多磨,這不,裝車數(shù)量過了千臺,卻偏偏又出了問題!
問題的表現(xiàn)形式倒也干脆,就是開了幾天車之后,不知道為了什么,再打轉(zhuǎn)向燈時就會出現(xiàn)倍頻閃爍的情況,但是它來得也快去得也瀟灑,停車鎖門關(guān)窗辦點事之后,再次行車期間,這個故障就又莫名其妙地消失了。奇也怪了個哉!
正常情況下,點火開關(guān)處于ON檔,車燈組合開關(guān)撥到轉(zhuǎn)向位置,轉(zhuǎn)向燈就按照固定頻率閃爍起來,亮了又滅,滅了又亮,仿佛無聲地訴說著塵世的輪回。倍頻閃爍倒也不是毫無來由,空穴來風(fēng),BCM在轉(zhuǎn)向燈閃爍期間檢測各個轉(zhuǎn)向燈的工作電流,如果檢測出“掉燈”故障,就將轉(zhuǎn)向燈以正常閃爍頻率的兩倍閃爍。不消說,肯定是誤檢測出了掉燈故障,才會觸發(fā)“倍頻”閃爍的。可是,轉(zhuǎn)向燈開關(guān)檢測和轉(zhuǎn)向燈電流檢測的時序是固定的,現(xiàn)在的程序設(shè)計保證了只有在轉(zhuǎn)向燈閃爍的點亮期間才會檢測轉(zhuǎn)向燈電流,不可能出現(xiàn)轉(zhuǎn)向燈滅掉期間檢測轉(zhuǎn)向燈電流的情形,所以,按理不會出現(xiàn)“誤檢測”掉燈故障。我又翻了翻代碼,確認(rèn)了這個問題。
轉(zhuǎn)向燈開關(guān)信號來自LIN總線上的組合開關(guān)節(jié)點,根據(jù)LIN報文長度和波特率可以計算得出,檢測出有效轉(zhuǎn)向燈開關(guān)信號的時刻大概都是在(60 *n)+ 6ms的位置,而BCM同時以50ms為周期循環(huán)進(jìn)行轉(zhuǎn)向燈的電流檢測,先根據(jù)轉(zhuǎn)向燈的亮滅狀態(tài)設(shè)置ADC檢測通道,在轉(zhuǎn)向燈亮?xí)r使能相應(yīng)端口的ADC檢測,考慮到驅(qū)動芯片的電流回饋引腳需要一定的準(zhǔn)備時間,因此在設(shè)置了ADC檢測通道之后,間隔2ms后進(jìn)行實際轉(zhuǎn)換,檢測時間大概都是在(50 * m)+2ms的位置,顯然,只要(50 * m)時刻轉(zhuǎn)向燈是點亮狀態(tài),(50 * m)+2ms也是點亮狀態(tài)。
基于這個“無懈可擊”的判斷,我過早地做出了這次故障和時序無關(guān)的結(jié)論,當(dāng)然也造成了我“夢醒了無路可以走”的苦痛。
2
自個兒研發(fā)期間沒有測出來這個問題,路試人員也不明所以,顯然,“不是國軍無能,而是共軍太狡猾?!边@次出了事被揪過來,戰(zhàn)戰(zhàn)兢兢地鼓搗半天,我同樣沒有復(fù)現(xiàn)出這個故障來。
車廠技術(shù)人員是個老相識了,長著一對像小孩子一樣的招風(fēng)大耳朵,忽閃著兩只因為年輕而顯得格外有神的眼睛,站在兩步開外,看著我在那里忙得焦頭爛額,觀摩許久,便把雙手插在口袋里,悠悠地說:“光華居士,看來你的人品格外好,你一來,你家的BCM就老實了?!?/p>
“咳,咳,”聽著他充滿善意的戲謔,心虛的我竟然不知所措起來?!耙苍S吧?!?/p>
“吃飯去吧,請你吃重慶小面!”這位仁兄倒是一副好心情??粗菑垱]心沒肺的笑臉,心中就像壓了一塊石頭的我多少也坦然了些,便跟在他那矯健的步伐后面,亦步亦趨地去了。
傍晚的飯店亂哄哄的,夾雜著嘈雜的說話聲和哧溜哧溜的吃飯聲的空氣中,飄蕩著一股淡淡的牛肉湯味道和濃濃的辣椒氣味。找地坐定,這位仁兄便打開了話匣子,“我從庫房里提出這臺故障車以后也測試了一下,剛開始也沒有發(fā)現(xiàn)轉(zhuǎn)向燈快閃的故障,中間出現(xiàn)過幾回,再后來又消失了。看來,想測出來故障還得靠運氣。”他半開玩笑似地說。
測了小半天仍然不得要領(lǐng)的我一邊無精打采地吃著面,一邊不經(jīng)意地問道?!爸澳切┕收宪囀怯脩魷y出來的還是你們自個測出來的?”
“我們自己測出來的,用戶還沒有反饋過這個問題??赡苁且驗檫@個故障是偶發(fā)性的,即使出現(xiàn)了,用戶也不一定能注意得到,而且出現(xiàn)過之后又會莫名其妙消失,所以也沒當(dāng)成回事?!痹诒粺狎v騰的面條蒸汽模糊了的臉龐上,他那兩片肥肥的亮油油的嘴唇格外引人注目。
‘為什么沒早點測出來?’我心里不禁嘀咕道,全然忘記了這雷本該自己來背?!肮收舷前l(fā)生在車輛休眠又喚醒之后?”我突然想起來自己這小半天一直是開著門,車輛都沒有進(jìn)過低功耗狀態(tài)。
“對對對,還真是這樣,出現(xiàn)故障之后,總是消除不掉,鎖了車,過了一段時間又回來,故障就消失了。”他咽下一塊牛肉,又急又快地回答我。
幾根面條歪歪扭扭地躺在碗中,綠油油的香菜若有若無地點綴在清湯里,看著面前的清湯寡水,我也心思澄明起來,肯定是低功耗改變了轉(zhuǎn)向燈開關(guān)檢測和轉(zhuǎn)向燈電流檢測的時序,使得設(shè)置ADC通道時轉(zhuǎn)向燈還是亮的,但是2ms后就已經(jīng)是滅的了,對,肯定是這樣,我模模糊糊地回想著代碼。
彎彎的月牙好像跨過了一條看不出的界限,把夕陽擠進(jìn)了山的那一邊,被微風(fēng)撕碎的幾片白云也換上了青灰色的衣裳。本著多年的經(jīng)驗,我已然可以確定低功耗對時序的改變,心情大好的我一抹嘴,站起身來,掏出一張紅色大票,拍在桌子上,“我請客!”
3
回到賓館,打開電腦,直奔低功耗處理程序,一切都了然了。
休眠程序?qū)嶋H上是一個睡眠-臨時喚醒-睡眠-臨時喚醒。。的循環(huán),睡眠24ms,臨時喚醒2ms,如果在臨時喚醒模式期間,喚醒條件有效,BCM退出休眠,否則,再次進(jìn)入休眠,如此往復(fù)。
臨時喚醒期間,所有軟件定時器共用的計時基準(zhǔn)Timer_ticked也在累加,它每次硬件定時器中斷都會累加1,累加到255后再回到0。顯然,假設(shè)退出休眠時,轉(zhuǎn)向燈電流檢測定時器已經(jīng)計滿,而轉(zhuǎn)向燈開關(guān)檢測定時器還未計滿,比如在56ms的位置,退出休眠后轉(zhuǎn)向燈電流檢測定時器便會因為計滿清零,而喪失了和轉(zhuǎn)向燈開關(guān)檢測定時器的同步,它們之間錯位的幅度為6ms。結(jié)果就造成可能出現(xiàn)轉(zhuǎn)向燈開關(guān)檢測程序在設(shè)置ADC通道時轉(zhuǎn)向燈處于點亮狀態(tài),而2ms后轉(zhuǎn)向燈滅掉的狀態(tài),這就會導(dǎo)致“誤檢測”出掉燈故障,從而出現(xiàn)無故倍頻閃爍的情況。
問題找到了,修改也很簡單,在ADC轉(zhuǎn)換中斷服務(wù)程序中,添加對轉(zhuǎn)向燈亮滅狀態(tài)的判斷。只有在轉(zhuǎn)向燈亮?xí)r,才將ADC結(jié)果寄存器中的值賦值給存放轉(zhuǎn)向燈反饋電流的變量,如此這般即可。
第二天,陽光和煦,春風(fēng)送暖,問題解決地及時而且準(zhǔn)確,給車廠技術(shù)人員解釋一番,提交了整改報告后,他們也就高高舉起,輕輕落下,放我們一馬了,只需要把庫房里的庫存都刷新程序就可以了。那么多件,一件件地刷程序是個不小的體力活,但是,不罰款,也不影響正常裝車,這就應(yīng)該燒高香了不是?要啥自行車??!
后記
嵌入式系統(tǒng)的正常運轉(zhuǎn),在于各個模塊的密切配合,除了在空間(體現(xiàn)為RAM空間中的信號量、事件、全局變量等)上共通有無之外,還需要在時間上準(zhǔn)確而無誤。正所謂,時序就是嵌入式系統(tǒng)的脈搏,一點都錯不得。
評論