新聞中心

EEPW首頁 > 牛人業(yè)話 > 千錯(cuò)萬錯(cuò),都是中斷和堆棧惹的禍!

千錯(cuò)萬錯(cuò),都是中斷和堆棧惹的禍!

作者:光華居士 時(shí)間:2018-09-07 來源:電子產(chǎn)品世界 收藏
      要命的故障

四月的重慶已然百花盛開,春回大地,大自然又恢復(fù)了勃勃的生機(jī),燕子揮舞著銀光閃閃的翅膀,在湛藍(lán)而悠遠(yuǎn)的天空中無拘無束地飛翔著,時(shí)而快速扇動(dòng)著翅膀沖上天空,時(shí)而展開雙翼低低滑翔。在吸飽了四月新雨的潮氣的濕潤空氣中,小草顯得格外清新,綠油油地,就像一汪春水,在春風(fēng)的吹拂下,蕩起粼粼的水波。草地不遠(yuǎn)處的停車場(chǎng)上,兩位面容憔悴、因睡眠不足而眼角發(fā)黑的工程師緊張而激烈地討論著,在空曠而幽靜的試驗(yàn)場(chǎng)里,他們的聲音格外引人注目。

本文引用地址:http://2s4d.com/article/201809/391649.htm

“是不是因?yàn)槠囆旭傔^程中,電磁環(huán)境的干擾造成總線數(shù)據(jù)中某些位發(fā)生了變化,所以才造成無緣無故解鎖車門的情況?”同事抬起腫脹的眼皮,帶著詢問的神情,小心翼翼地問我。

“不會(huì)的,總線的協(xié)議里本身就有CRC校驗(yàn),如果數(shù)據(jù)位出錯(cuò),報(bào)文中的CRC校驗(yàn)是通不過的,這時(shí)CAN控制器會(huì)提示錯(cuò)誤的?!边@次故障發(fā)生在產(chǎn)品功能驗(yàn)證已經(jīng)通過,量產(chǎn)前的實(shí)車路試過程中,如果問題解決地慢,可能需要重新路試,第二次路試的所有費(fèi)用都得我們來掏,所以我的心情怎么也好不起來,于是我口氣生硬地回答他。

我們做的產(chǎn)品是車身控制器,俗稱BCM,這次路試出現(xiàn)的故障現(xiàn)象極其明了,就是在開車過程中,沒有任何操作的情況下,突然解鎖或者突然閉鎖,或者突然后背門解鎖了,來了兩天,一直沒有找到引發(fā)故障的原因,弄得我茶飯不思,苦悶到了極點(diǎn)。

“找車廠路試人員,我再跟他上車跑一下,觀察一下現(xiàn)象吧!”做為這次產(chǎn)品代碼的開發(fā)主力人員,我的任務(wù)是解決問題,同事的任務(wù)是和車廠人員打交道,給我做好服務(wù),所以我不客氣地支使起這位同事來。

雨后新晴的空氣顯得格外清新,微風(fēng)拂面,帶來一絲絲涼意,停產(chǎn)場(chǎng)的坑洼處還有一些沒有吹干的水窩,倒映著碎成一片片金箔的陽光。盡管倍感煎熬,目前仍處在水深火熱之中,但是我堅(jiān)信,正如冬去春來大地回春一樣,我也會(huì)柳暗花明峰回路轉(zhuǎn)的。

故障再現(xiàn)

路試人員是個(gè)年輕小伙兒,看著很精神,也頗為健談,上車不久,便主動(dòng)搭話和我談了起來。

“前些天一直下雨,你們過來這兩天才放晴?!彼治罩较虮P,腦袋稍稍轉(zhuǎn)向我這邊,笑意隨著他那年輕而又清脆的聲音一起傳了過來。

“你們發(fā)現(xiàn)故障的時(shí)候是在下雨天?”心思仍然撲在故障原因上的我,突然警覺起來?!笆遣皇翘烨绲臅r(shí)候不發(fā)生這種故障?”

“大概是吧,記不太清了?!彼鼗貞?yīng)道。

‘是不是因?yàn)橄掠?,天氣比較潮濕,機(jī)械鎖那塊密封性做得不好,造成機(jī)械解閉鎖開關(guān)那里會(huì)出現(xiàn)解閉鎖信號(hào)呢?’我的腦袋飛速運(yùn)轉(zhuǎn)著,默默在心里盤算著?!畱?yīng)該不會(huì),即便路試車的機(jī)械鎖密封不好,也是只會(huì)誤解鎖,怎么會(huì)誤閉鎖呢?再說,后背門解鎖信號(hào)來自于PEPS從CAN總線上發(fā)過來的指令,和天氣也沒啥關(guān)系?!译S即否決了這種判斷。

前方路口紅燈,路試小伙兒嫻熟地減速、停車,按下了電子手剎,我看了看這輛車,隨口問起這輛車的配置來,EPS、自動(dòng)擋、電子手剎、PEPS、陽光雨量傳感器、自動(dòng)天窗、車窗防夾,‘比我們當(dāng)時(shí)測(cè)試BCM時(shí)的試驗(yàn)車配置高。’我不禁暗暗想到。

‘咯噔’,一聲清脆的解鎖聲,劃破空氣直沖我的耳膜,“你按中控那里的解鎖鍵了?還是按遙控鑰匙上的解鎖鍵了?”一股熱血沖上了我的胸膛,爬上了我的臉龐,我?guī)еo張的神情,急切地問道。

“沒有啊,我什么都沒動(dòng),”路試小伙兒臉上掛著意味深長(zhǎng)的微笑,“之前就是這樣子的,莫名其妙就解鎖了,有時(shí)是莫名其妙閉鎖,有時(shí)開著開著車,就聽到后背門打開了,當(dāng)時(shí)嚇了我一跳!”他盯著我的眼睛,加重語氣說道。

問題復(fù)現(xiàn)了!我的心砰砰跳著,現(xiàn)在可是個(gè)大晴天,艷陽高照,這下怪不到下雨天氣頭上了吧。驕傲的太陽高高在上,透過前擋風(fēng)玻璃,慷慨地將金線似的陽光灑滿在我的身上。

車輛又緩緩開動(dòng)了,路試小伙兒顯然知道我在沉思,所以沒有打擾我。宜人的春風(fēng)透過車窗,撫摸著我的頭發(fā),我茫然地望著窗外,恍惚間,竟似不知身在何處。

‘為什么之前測(cè)試那么多次,都沒有出現(xiàn)這種偶發(fā)的故障呢?’我煩惱地思考著?!暗臏y(cè)試還是很充分的,我測(cè)完讓同事測(cè),同事測(cè)完又讓測(cè)試人員測(cè),最后又找車廠的技術(shù)人員來測(cè),測(cè)的次數(shù)夠多了吧,我每次都在現(xiàn)場(chǎng)觀察,也沒出現(xiàn)過這種摸不著頭腦的現(xiàn)象啊!’

‘要說測(cè)試條件有什么區(qū)別的話,那就是之前車停在那里,而現(xiàn)在是開了起來??墒牵@款BCM的功能和車開還是車?;緵]關(guān)系,難道車開起來和停在那里真有什么區(qū)別嗎?’想到這里,我不禁有些著急起來。

“把車靠邊停一下,接上OBD,我看看總線數(shù)據(jù)吧。因?yàn)橹皽y(cè)試BCM時(shí),車廠不讓我們自己開車,我們基本上都是停著車測(cè)試的。我突然想到,是不是開起來總線上報(bào)文數(shù)據(jù)比停車狀態(tài)要多?”我給路試小伙兒解釋道,同時(shí)又因?yàn)楹蜔o關(guān)人員解釋而感到懊惱。

故障定位

車輛打著右轉(zhuǎn)向,緩緩地停在了路邊,我在方向盤下面摸索著找到OBD口,接上OBD線,另一邊接上我的筆記本,打開監(jiān)控軟件,把兩路CAN總線和一路LIN總線都監(jiān)控起來。

‘恩,比之前的報(bào)文好像是多了一些!’我模模糊糊地想到,‘也難怪,這輛車的配置全,CAN節(jié)點(diǎn)多,之前那輛車沒有ESP,是手動(dòng)擋,也沒有TCU,而且不帶天窗?!彝蝗桓杏X,被詭異故障塵封的大門正在緩緩開啟。

“開起來吧,小伙兒,”我的心情突然明朗起來,帶著輕松而明快的語氣對(duì)他說。“我看看總線報(bào)文?!?/p>

路邊的景色迅速向后退去,汽車已經(jīng)駛上了高速,我的大腦也開始高速運(yùn)轉(zhuǎn)起來。

‘之前的測(cè)試車配置低,CAN/LIN節(jié)點(diǎn)少,在固定的時(shí)間內(nèi)觸發(fā)的次數(shù)也少,現(xiàn)在這個(gè)路試車,CAN/LIN節(jié)點(diǎn)多,觸發(fā)次數(shù)多,這就是測(cè)試條件的真正區(qū)別!’由于勝利在望,我的心開始安定下來,有條不紊地分析著問題?!畣挝粫r(shí)間內(nèi)次數(shù)越多,對(duì)CPU而言負(fù)荷就越重,中斷服務(wù)例程的執(zhí)行時(shí)間是一定的,中斷次數(shù)越多,就越可能出現(xiàn)中斷嵌套的問題,而中斷嵌套時(shí)會(huì)消耗,嵌套層級(jí)越深,消耗越大,由于大小是固定的,而且堆??臻g和變量空間都是在RAM的線性空間里,一旦堆棧越界,就會(huì)改變它所臨近的變量空間中的內(nèi)容!這些內(nèi)容發(fā)生了不應(yīng)該發(fā)生的變化,當(dāng)然會(huì)導(dǎo)致詭異的故障,也許這次無故解鎖和閉鎖只是表現(xiàn)比較明顯的故障,還有一些隱患已經(jīng)埋下,只是沒有暴露出來而已!’

‘問題就在這里,’我繼續(xù)欣喜地思考著,越來越感覺到喜悅在內(nèi)心激蕩不已?!吩囓囍袛啻螖?shù)多,造成了堆棧越界,堆棧越界,造成了無故解鎖閉鎖的故障!Perfect,這邏輯鏈條,完美!’

故障解決

回到停車場(chǎng),同事正端著平板電腦等在那里,帶著耳機(jī),笑意盈盈,顯然正在沉浸在電影的世界里??吹轿一貋砹?,他迎上來,張口就問:“測(cè)到故障了嗎?你感覺可能是什么原因?”

“嗯,故障復(fù)現(xiàn)了,而且已經(jīng)找到原因了?!?/p>

“哦?什么原因?”他兩眼放光,不自然地笑著。

“以后再說吧,我先把問題解決了再說?!蔽矣行┌脨涝趺窗堰@個(gè)同事也帶來了,還得浪費(fèi)我的時(shí)間和他解釋這些事情,全然忘記了住宿、吃飯、找車廠人員都是這位老兄干的。

我打開源碼,仔細(xì)閱讀了各個(gè)中斷的服務(wù)程序,卻覺得無從下手,因?yàn)槊總€(gè)中斷服務(wù)程序里都沒有冗余代碼,沒辦法進(jìn)行精簡(jiǎn),所以,降低中斷服務(wù)程序的執(zhí)行時(shí)間這條路是走不通了。

此路不通,我迅速轉(zhuǎn)向,仔細(xì)分析了各個(gè)中斷的優(yōu)先級(jí),這些中斷的優(yōu)先級(jí)都是在之前寫代碼的過程中按照添加代碼的順序隨手設(shè)定的,由于之前測(cè)試沒出過岔子,所以盡管是“隨手設(shè)定”,也沒爆過雷。現(xiàn)在回頭一看,問題就出在這里。

我這款BCM里用了不少中斷,像定時(shí)中斷、CAN中斷、LIN中斷都是經(jīng)常發(fā)生的,而且CAN中斷的頻率最為頻繁,但是我之前卻把它的中斷優(yōu)先級(jí)設(shè)置得很低,結(jié)果就導(dǎo)致CAN中斷被各個(gè)優(yōu)先級(jí)更高的中斷隨意搶占,由于它頻繁發(fā)生且被隨意搶占,導(dǎo)致CPU大量時(shí)間都用在中斷服務(wù)程序的切換導(dǎo)致的堆棧入棧和出棧上,不僅實(shí)際效率降低,而且會(huì)導(dǎo)致堆棧越界問題。如果把CAN中斷優(yōu)先級(jí)調(diào)高,這個(gè)頻繁發(fā)生的中斷就不會(huì)被搶占,不僅提高了CPU的執(zhí)行效率,而且避免了堆棧越界。

按照這個(gè)思路,我調(diào)整了CAN中斷的優(yōu)先級(jí),再次上車測(cè)試了兩天,故障消失了。。。

由于問題解決地還算及時(shí),描述故障原因和解決方案的文檔寫得也清晰明確,因此這次路試?yán)^續(xù)進(jìn)行,不用再里程清零重新路試了。在回程的途中,筆者百感交集,在這些復(fù)雜難名的情感中,竟有一種寂寞感在心底滋生,我突然想起《美人魚》中鄧超唱的那句歌詞:“無敵是多么,多么寂寞~”



關(guān)鍵詞: CAN 中斷 堆棧

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉