浪子三唱,不唱悲歌,紅塵間,悲傷事,已太多。

本文引用地址:http://www.eepw.com.cn/article/201811/393985.htm

佛祖有云,人生八苦交煎,所謂八苦者,生、老、病、死、求不得、怨憎會、愛別離、五陰熾盛。春天百花開,秋天黃葉落,人之生老病死在所難免,但樂觀主義者每每在生活的荊棘中找出一條小徑來,肩住黑暗的閘門,灑下光明的福音。他們以飲食有節、起居有定、鍛鍊有時抵抗衰老和病痛,調素琴,閱金經,清心寡慾,也可逃過求不得、怨憎會、愛別離之折磨,但唯有這五陰熾盛,如影子隨身,揮之不去。

五陰者,色、受、想、行、識。色者,肉身也,雖然微觀上生滅不已,但以其變化緩慢,總讓人產生青春永駐、歲月靜好之錯覺,只是蒼天愛輪迴,又曾饒過誰?受、想、行、識卻都在精神層面,感受(受)時而無風無浪,如靜海深流,時而大風大雨、肆意磅礴;想法(想)此起彼伏,像個五六歲的小男孩一樣鬧個不停;念念遷流不住(行),前赴後繼;其背後的“識”也總在夢中像個畫師一樣,勾勒出五彩的夢境。在灑家看來,人生最苦就在這五陰熾盛了。因爲,每次工作中遇到了大bug,身體都會被搞得疲憊不堪,內心誠惶誠恐,腦袋裏想法一個接着一個,想閉目休息一下吧,念頭還總是一個接一個地不斷蹦出來,攪擾得不得安寧,真真叫一個苦啊!

1

魯迅先生說過,“人生最苦痛的是夢醒了無路可以走。做夢的人是幸福的,倘沒有看出可走的路,最要緊的是不要去驚醒他。”我在子夜時分悄然醒來,一時竟不知身在何處。重慶的夜異常寂靜,月色如洗,爬過窗臺,傾瀉了一地,在朦朧的月光中,好像罩着一層輕紗,溫柔地撫慰着喧囂了一天後沉沉入睡的大地。我躺在賓館的牀上,腦袋空空,心中一片茫然,反覆咀嚼着魯迅先生的這句話。折騰一天,好不容易睡着,本該好好休息了,偏偏五陰熾盛起來,攪了清夢不說,偏偏“夢醒了無路可以走”,豈非是先生所言“人生最苦痛的”?

自從接了這個BCM的活,兩度寒暑,時間不長不短,卻也光顧重慶多次了。調試、測試、路試、試產、量產,一步步走來,步步驚心。自上回修改路試出現的問題之後,已經過去一年有餘了,灑家做的這款BCM也終於量產裝車了。都說好事多磨,這不,裝車數量過了千臺,卻偏偏又出了問題!

問題的表現形式倒也乾脆,就是開了幾天車之後,不知道爲了什麼,再打轉向燈時就會出現倍頻閃爍的情況,但是它來得也快去得也瀟灑,停車鎖門關窗辦點事之後,再次行車期間,這個故障就又莫名其妙地消失了。奇也怪了個哉!

正常情況下,點火開關處於ON檔,車燈組合開關撥到轉向位置,轉向燈就按照固定頻率閃爍起來,亮了又滅,滅了又亮,彷彿無聲地訴說着塵世的輪迴。倍頻閃爍倒也不是毫無來由,空穴來風,BCM在轉向燈閃爍期間檢測各個轉向燈的工作電流,如果檢測出“掉燈”故障,就將轉向燈以正常閃爍頻率的兩倍閃爍。不消說,肯定是誤檢測出了掉燈故障,纔會觸發“倍頻”閃爍的。可是,轉向燈開關檢測和轉向燈電流檢測的時序是固定的,現在的程序設計保證了只有在轉向燈閃爍的點亮期間纔會檢測轉向燈電流,不可能出現轉向燈滅掉期間檢測轉向燈電流的情形,所以,按理不會出現“誤檢測”掉燈故障。我又翻了翻代碼,確認了這個問題。

轉向燈開關信號來自LIN總線上的組合開關節點,根據LIN報文長度和波特率可以計算得出,檢測出有效轉向燈開關信號的時刻大概都是在(60 *n)+ 6ms的位置,而BCM同時以50ms爲週期循環進行轉向燈的電流檢測,先根據轉向燈的亮滅狀態設置ADC檢測通道,在轉向燈亮時使能相應端口的ADC檢測,考慮到驅動芯片的電流回饋引腳需要一定的準備時間,因此在設置了ADC檢測通道之後,間隔2ms後進行實際轉換,檢測時間大概都是在(50 * m)+2ms的位置,顯然,只要(50 * m)時刻轉向燈是點亮狀態,(50 * m)+2ms也是點亮狀態。

基於這個“無懈可擊”的判斷,我過早地做出了這次故障和時序無關的結論,當然也造成了我“夢醒了無路可以走”的苦痛。

2

自個兒研發期間沒有測出來這個問題,路試人員也不明所以,顯然,“不是國軍無能,而是共軍太狡猾。”這次出了事被揪過來,戰戰兢兢地鼓搗半天,我同樣沒有復現出這個故障來。

車廠技術人員是個老相識了,長着一對像小孩子一樣的招風大耳朵,忽閃着兩隻因爲年輕而顯得格外有神的眼睛,站在兩步開外,看着我在那裏忙得焦頭爛額,觀摩許久,便把雙手插在口袋裏,悠悠地說:“光華居士,看來你的人品格外好,你一來,你家的BCM就老實了。”

“咳,咳,”聽着他充滿善意的戲謔,心虛的我竟然不知所措起來。“也許吧。”

“喫飯去吧,請你喫重慶小面!”這位仁兄倒是一副好心情。看着他那張沒心沒肺的笑臉,心中就像壓了一塊石頭的我多少也坦然了些,便跟在他那矯健的步伐後面,亦步亦趨地去了。

傍晚的飯店亂哄哄的,夾雜着嘈雜的說話聲和哧溜哧溜的喫飯聲的空氣中,飄蕩着一股淡淡的牛肉湯味道和濃濃的辣椒氣味。找地坐定,這位仁兄便打開了話匣子,“我從庫房裏提出這臺故障車以後也測試了一下,剛開始也沒有發現轉向燈快閃的故障,中間出現過幾回,再後來又消失了。看來,想測出來故障還得靠運氣。”他半開玩笑似地說。

測了小半天仍然不得要領的我一邊無精打采地喫着面,一邊不經意地問道。“之前那些故障車是用戶測出來的還是你們自個測出來的?”

“我們自己測出來的,用戶還沒有反饋過這個問題。可能是因爲這個故障是偶發性的,即使出現了,用戶也不一定能注意得到,而且出現過之後又會莫名其妙消失,所以也沒當成回事。”在被熱騰騰的麪條蒸汽模糊了的臉龐上,他那兩片肥肥的亮油油的嘴脣格外引人注目。

‘爲什麼沒早點測出來?’我心裏不禁嘀咕道,全然忘記了這雷本該自己來背。“故障消失是發生在車輛休眠又喚醒之後?”我突然想起來自己這小半天一直是開着門,車輛都沒有進過低功耗狀態。

“對對對,還真是這樣,出現故障之後,總是消除不掉,鎖了車,過了一段時間又回來,故障就消失了。”他嚥下一塊牛肉,又急又快地回答我。

幾根麪條歪歪扭扭地躺在碗中,綠油油的香菜若有若無地點綴在清湯裏,看着面前的清湯寡水,我也心思澄明起來,肯定是低功耗改變了轉向燈開關檢測和轉向燈電流檢測的時序,使得設置ADC通道時轉向燈還是亮的,但是2ms後就已經是滅的了,對,肯定是這樣,我模模糊糊地回想着代碼。

彎彎的月牙好像跨過了一條看不出的界限,把夕陽擠進了山的那一邊,被微風撕碎的幾片白雲也換上了青灰色的衣裳。本着多年的經驗,我已然可以確定低功耗對時序的改變,心情大好的我一抹嘴,站起身來,掏出一張紅色大票,拍在桌子上,“我請客!”

3

回到賓館,打開電腦,直奔低功耗處理程序,一切都瞭然了。

休眠程序實際上是一個睡眠-臨時喚醒-睡眠-臨時喚醒。。的循環,睡眠24ms,臨時喚醒2ms,如果在臨時喚醒模式期間,喚醒條件有效,BCM退出休眠,否則,再次進入休眠,如此往復。

臨時喚醒期間,所有軟件定時器共用的計時基準Timer_ticked也在累加,它每次硬件定時器中斷都會累加1,累加到255後再回到0。顯然,假設退出休眠時,轉向燈電流檢測定時器已經計滿,而轉向燈開關檢測定時器還未計滿,比如在56ms的位置,退出休眠後轉向燈電流檢測定時器便會因爲計滿清零,而喪失了和轉向燈開關檢測定時器的同步,它們之間錯位的幅度爲6ms。結果就造成可能出現轉向燈開關檢測程序在設置ADC通道時轉向燈處於點亮狀態,而2ms後轉向燈滅掉的狀態,這就會導致“誤檢測”出掉燈故障,從而出現無故倍頻閃爍的情況。

問題找到了,修改也很簡單,在ADC轉換中斷服務程序中,添加對轉向燈亮滅狀態的判斷。只有在轉向燈亮時,纔將ADC結果寄存器中的值賦值給存放轉向燈反饋電流的變量,如此這般即可。

第二天,陽光和煦,春風送暖,問題解決地及時而且準確,給車廠技術人員解釋一番,提交了整改報告後,他們也就高高舉起,輕輕落下,放我們一馬了,只需要把庫房裏的庫存都刷新程序就可以了。那麼多件,一件件地刷程序是個不小的體力活,但是,不罰款,也不影響正常裝車,這就應該燒高香了不是?要啥自行車啊!

後記

嵌入式系統的正常運轉,在於各個模塊的密切配合,除了在空間(體現爲RAM空間中的信號量、事件、全局變量等)上共通有無之外,還需要在時間上準確而無誤。正所謂,時序就是嵌入式系統的脈搏,一點都錯不得。

查看原文 >>
相關文章