<listing id="dgcc5"></listing>
<address id="dgcc5"><progress id="dgcc5"><font id="dgcc5"></font></progress></address>
<video id="dgcc5"><big id="dgcc5"><nobr id="dgcc5"></nobr></big></video>
<address id="dgcc5"></address>
<th id="dgcc5"><big id="dgcc5"><listing id="dgcc5"></listing></big></th>
<thead id="dgcc5"><meter id="dgcc5"></meter></thead>

<th id="dgcc5"><address id="dgcc5"></address></th>

<track id="dgcc5"><progress id="dgcc5"><listing id="dgcc5"></listing></progress></track>

<nobr id="dgcc5"><menuitem id="dgcc5"><var id="dgcc5"></var></menuitem></nobr>
<address id="dgcc5"><progress id="dgcc5"></progress></address>
      
      

        <th id="dgcc5"><meter id="dgcc5"><dfn id="dgcc5"></dfn></meter></th>

        <thead id="dgcc5"></thead>

        <track id="dgcc5"><address id="dgcc5"></address></track><address id="dgcc5"><meter id="dgcc5"></meter></address>
        <address id="dgcc5"><progress id="dgcc5"></progress></address>

            <sub id="dgcc5"></sub>

            <th id="dgcc5"></th>

            <sub id="dgcc5"><meter id="dgcc5"><cite id="dgcc5"></cite></meter></sub>

                <address id="dgcc5"><progress id="dgcc5"></progress></address>

                  <sub id="dgcc5"><progress id="dgcc5"></progress></sub>

                    <th id="dgcc5"><progress id="dgcc5"><listing id="dgcc5"></listing></progress></th>
                      <th id="dgcc5"><address id="dgcc5"><dfn id="dgcc5"></dfn></address></th>

                        <output id="dgcc5"><ins id="dgcc5"></ins></output>
                        <dl id="dgcc5"></dl>

                        1. <output id="dgcc5"><font id="dgcc5"><thead id="dgcc5"></thead></font></output>
                          1. <dl id="dgcc5"><ins id="dgcc5"></ins></dl>
                            <output id="dgcc5"></output>

                            新聞中心

                            EEPW首頁 > 牛人業話 > 千錯萬錯,都是中斷和堆棧惹的禍!

                            千錯萬錯,都是中斷和堆棧惹的禍!

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

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

                            本文引用地址:http://www.uavs.tw/article/201809/391649.htm

                            “是不是因為汽車行駛過程中,電磁環境的干擾造成總線數據中某些位發生了變化,所以才造成無緣無故解鎖車門的情況?”同事抬起腫脹的眼皮,帶著詢問的神情,小心翼翼地問我。

                            “不會的,總線的協議里本身就有CRC校驗,如果數據位出錯,報文中的CRC校驗是通不過的,這時CAN控制器會提示錯誤的。”這次故障發生在產品功能驗證已經通過,量產前的實車路試過程中,如果問題解決地慢,可能需要重新路試,第二次路試的所有費用都得我們來掏,所以我的心情怎么也好不起來,于是我口氣生硬地回答他。

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

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

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

                            故障再現

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

                            “前些天一直下雨,你們過來這兩天才放晴。”他手握著方向盤,腦袋稍稍轉向我這邊,笑意隨著他那年輕而又清脆的聲音一起傳了過來。

                            “你們發現故障的時候是在下雨天?”心思仍然撲在故障原因上的我,突然警覺起來。“是不是天晴的時候不發生這種故障?”

                            “大概是吧,記不太清了。”他淡淡地回應道。

                            ‘是不是因為下雨,天氣比較潮濕,機械鎖那塊密封性做得不好,造成機械解閉鎖開關那里會出現解閉鎖信號呢?’我的腦袋飛速運轉著,默默在心里盤算著。‘應該不會,即便路試車的機械鎖密封不好,也是只會誤解鎖,怎么會誤閉鎖呢?再說,后背門解鎖信號來自于PEPS從CAN總線上發過來的指令,和天氣也沒啥關系。’我隨即否決了這種判斷。

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

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

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

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

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

                            ‘為什么之前測試那么多次,都沒有出現這種偶發的故障呢?’我煩惱地思考著。‘之前的測試還是很充分的,我測完讓同事測,同事測完又讓測試人員測,最后又找車廠的技術人員來測,測的次數夠多了吧,我每次都在現場觀察,也沒出現過這種摸不著頭腦的現象啊!’

                            ‘要說測試條件有什么區別的話,那就是之前車停在那里,而現在是開了起來。可是,這款BCM的功能和車開還是車停基本沒關系,難道車開起來和停在那里真有什么區別嗎?’想到這里,我不禁有些著急起來。

                            “把車靠邊停一下,接上OBD,我看看總線數據吧。因為之前測試BCM時,車廠不讓我們自己開車,我們基本上都是停著車測試的。我突然想到,是不是開起來總線上報文數據比停車狀態要多?”我給路試小伙兒解釋道,同時又因為和無關人員解釋而感到懊惱。

                            故障定位

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

                            ‘恩,比之前的報文好像是多了一些!’我模模糊糊地想到,‘也難怪,這輛車的配置全,CAN節點多,之前那輛車沒有ESP,是手動擋,也沒有TCU,而且不帶天窗。’我突然感覺,被詭異故障塵封的大門正在緩緩開啟。

                            “開起來吧,小伙兒,”我的心情突然明朗起來,帶著輕松而明快的語氣對他說。“我看看總線報文。”

                            路邊的景色迅速向后退去,汽車已經駛上了高速,我的大腦也開始高速運轉起來。

                            ‘之前的測試車配置低,CAN/LIN節點少,在固定的時間內觸發的次數也少,現在這個路試車,CAN/LIN節點多,觸發次數多,這就是測試條件的真正區別!’由于勝利在望,我的心開始安定下來,有條不紊地分析著問題。‘單位時間內次數越多,對CPU而言負荷就越重,中斷服務例程的執行時間是一定的,中斷次數越多,就越可能出現中斷嵌套的問題,而中斷嵌套時會消耗,嵌套層級越深,消耗越大,由于大小是固定的,而且堆棧空間和變量空間都是在RAM的線性空間里,一旦堆棧越界,就會改變它所臨近的變量空間中的內容!這些內容發生了不應該發生的變化,當然會導致詭異的故障,也許這次無故解鎖和閉鎖只是表現比較明顯的故障,還有一些隱患已經埋下,只是沒有暴露出來而已!’

                            ‘問題就在這里,’我繼續欣喜地思考著,越來越感覺到喜悅在內心激蕩不已。‘路試車中斷次數多,造成了堆棧越界,堆棧越界,造成了無故解鎖閉鎖的故障!Perfect,這邏輯鏈條,完美!’

                            故障解決

                            回到停車場,同事正端著平板電腦等在那里,帶著耳機,笑意盈盈,顯然正在沉浸在電影的世界里。看到我回來了,他迎上來,張口就問:“測到故障了嗎?你感覺可能是什么原因?”

                            “嗯,故障復現了,而且已經找到原因了。”

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

                            “以后再說吧,我先把問題解決了再說。”我有些懊惱怎么把這個同事也帶來了,還得浪費我的時間和他解釋這些事情,全然忘記了住宿、吃飯、找車廠人員都是這位老兄干的。

                            我打開源碼,仔細閱讀了各個中斷的服務程序,卻覺得無從下手,因為每個中斷服務程序里都沒有冗余代碼,沒辦法進行精簡,所以,降低中斷服務程序的執行時間這條路是走不通了。

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

                            我這款BCM里用了不少中斷,像定時中斷、CAN中斷、LIN中斷都是經常發生的,而且CAN中斷的頻率最為頻繁,但是我之前卻把它的中斷優先級設置得很低,結果就導致CAN中斷被各個優先級更高的中斷隨意搶占,由于它頻繁發生且被隨意搶占,導致CPU大量時間都用在中斷服務程序的切換導致的堆棧入棧和出棧上,不僅實際效率降低,而且會導致堆棧越界問題。如果把CAN中斷優先級調高,這個頻繁發生的中斷就不會被搶占,不僅提高了CPU的執行效率,而且避免了堆棧越界。

                            按照這個思路,我調整了CAN中斷的優先級,再次上車測試了兩天,故障消失了。。。

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



                            關鍵詞: CAN 中斷 堆棧

                            推薦閱讀

                            評論

                            技術專區

                            關閉
                            青海11选5开奖结果