電子底層軟件開(kāi)發(fā)就業(yè)課:AUTOSAR配置與CAN通信棧實(shí)戰(zhàn)學(xué)習(xí)路徑)
汽車(chē)電子底層軟件開(kāi)發(fā)這個(gè)方向這幾年熱度一直往上走尤其是智能電動(dòng)車(chē)把整個(gè)產(chǎn)業(yè)鏈拉起來(lái)之后會(huì)寫(xiě)應(yīng)用層的人不少但真正能把底層軟件吃透、能獨(dú)立搞定AUTOSAR配置和CAN通信棧的工程師缺口依然很大。我身邊不少做單片機(jī)開(kāi)發(fā)、消費(fèi)電子嵌入式的朋友都在往這個(gè)方向轉(zhuǎn)但普遍卡在一個(gè)地方網(wǎng)上資料太碎AUTOSAR規(guī)范文檔動(dòng)輒幾千頁(yè)看完了也不知道怎么落到實(shí)際項(xiàng)目里。這篇內(nèi)容就是圍繞“汽車(chē)電子底層軟件開(kāi)發(fā)就業(yè)課”這個(gè)主題把我自己從傳統(tǒng)嵌入式轉(zhuǎn)到汽車(chē)電子底層開(kāi)發(fā)過(guò)程中踩過(guò)的坑、總結(jié)的學(xué)習(xí)路徑、以及面試和實(shí)際工作中真正用得上的技能點(diǎn)完整地梳理一遍。不管你是剛?cè)胄械膽?yīng)屆生還是做了幾年嵌入式想轉(zhuǎn)賽道的朋友都能從中找到可落地的參考。1. 汽車(chē)電子底層軟件到底在做什么1.1 底層軟件工程師的日常職責(zé)邊界很多人一聽(tīng)到“底層軟件”就覺(jué)得是寫(xiě)寄存器、調(diào)驅(qū)動(dòng)這個(gè)理解在汽車(chē)電子領(lǐng)域只對(duì)了一半。汽車(chē)電子底層軟件工程師的工作范圍其實(shí)比傳統(tǒng)MCU開(kāi)發(fā)要寬得多大致可以分成幾個(gè)層面。最下面一層是MCU抽象層包括啟動(dòng)代碼、時(shí)鐘配置、內(nèi)存映射、中斷向量表這些。這一層跟傳統(tǒng)嵌入式開(kāi)發(fā)差別不大但汽車(chē)級(jí)芯片比如英飛凌TC3xx系列、NXP S32K系列、瑞薩RH850系列的外設(shè)配置復(fù)雜度要高不少尤其是多核架構(gòu)下的核間通信和資源分配是新手最容易翻車(chē)的地方。往上一層是ECU抽象層和復(fù)雜驅(qū)動(dòng)比如CAN收發(fā)器驅(qū)動(dòng)、SPI驅(qū)動(dòng)的外部芯片如SBC系統(tǒng)基礎(chǔ)芯片、看門(mén)狗管理等。這一層要求你不僅懂MCU還要看得懂原理圖知道硬件上信號(hào)是怎么走的。再往上是AUTOSAR基礎(chǔ)軟件層BSW這是汽車(chē)電子底層軟件的核心戰(zhàn)場(chǎng)。包括通信棧CAN/LIN/FlexRay/Ethernet、診斷棧UDS、存儲(chǔ)棧NVM、操作系統(tǒng)OS、模式管理EcuM/BswM/ComM等等。這一層的工作大量涉及配置和集成而不是從零寫(xiě)代碼。最上面是運(yùn)行時(shí)環(huán)境RTE它把底層軟件和應(yīng)用層軟件隔離開(kāi)讓?xiě)?yīng)用層開(kāi)發(fā)者不用關(guān)心底層怎么實(shí)現(xiàn)的。提示如果你面試的是“底層軟件開(kāi)發(fā)”崗位面試官大概率會(huì)問(wèn)你AUTOSAR BSW的某個(gè)模塊怎么配置、CAN通信怎么調(diào)試、UDS診斷服務(wù)怎么實(shí)現(xiàn)而不是讓你手寫(xiě)一個(gè)I2C驅(qū)動(dòng)。1.2 為什么這個(gè)崗位薪資比傳統(tǒng)嵌入式高說(shuō)白了就是門(mén)檻高、供給少。傳統(tǒng)嵌入式開(kāi)發(fā)你會(huì)STM32、會(huì)寫(xiě)驅(qū)動(dòng)、會(huì)跑RTOS就能找到工作。但汽車(chē)電子底層軟件有幾個(gè)硬門(mén)檻第一工具鏈成本高。AUTOSAR配置工具比如Vector的DaVinci Configurator、ETAS的ISOLAR、Elektrobit的EB tresos都是商業(yè)軟件一套License動(dòng)輒幾十萬(wàn)個(gè)人學(xué)習(xí)很難接觸到正版。這就導(dǎo)致很多人在自學(xué)階段根本摸不到真實(shí)的開(kāi)發(fā)環(huán)境。第二規(guī)范體系龐大。AUTOSAR CPClassic Platform的規(guī)范文檔有幾百個(gè)PDF光是CAN通信棧就涉及Can、CanIf、CanTp、PduR、Com、CanSM等多個(gè)模塊的交互。沒(méi)有項(xiàng)目帶著自己啃規(guī)范很容易迷失。第三調(diào)試手段特殊。汽車(chē)電子的調(diào)試不像互聯(lián)網(wǎng)那樣打個(gè)日志就行你需要用CANoe、CANalyzer、Vehicle Spy這類(lèi)總線(xiàn)分析工具還要會(huì)看示波器抓CAN波形。這些工具的使用經(jīng)驗(yàn)本身就是門(mén)檻。第四功能安全要求。很多ECU項(xiàng)目要求符合ISO 26262功能安全標(biāo)準(zhǔn)底層軟件的開(kāi)發(fā)流程、代碼規(guī)范、測(cè)試覆蓋率都有嚴(yán)格要求。這個(gè)體系不是看兩篇文章就能建立的。正因?yàn)檫@些門(mén)檻汽車(chē)電子底層軟件工程師的薪資普遍比同工作年限的傳統(tǒng)嵌入式工程師高出30%到50%在一線(xiàn)城市有3到5年經(jīng)驗(yàn)的月薪25K到40K是很常見(jiàn)的區(qū)間。1.3 典型ECU項(xiàng)目的底層軟件架構(gòu)長(zhǎng)什么樣拿一個(gè)車(chē)身控制器BCM項(xiàng)目舉例底層軟件通常包含這些部分啟動(dòng)與初始化MCU上電后的啟動(dòng)流程包括時(shí)鐘初始化、看門(mén)狗配置、內(nèi)存初始化、OS啟動(dòng)。通信棧CAN驅(qū)動(dòng)、CAN接口層、CAN傳輸層、PDU路由器、COM模塊負(fù)責(zé)報(bào)文的收發(fā)和信號(hào)打包解包。診斷棧UDS服務(wù)0x10會(huì)話(huà)控制、0x27安全訪(fǎng)問(wèn)、0x22讀數(shù)據(jù)、0x2E寫(xiě)數(shù)據(jù)、0x31例程控制等DCM和DEM模塊。存儲(chǔ)棧NVM模塊負(fù)責(zé)把關(guān)鍵數(shù)據(jù)如故障碼、標(biāo)定參數(shù)、學(xué)習(xí)值掉電保存到EEPROM或Flash模擬EEPROM。模式管理EcuM管理ECU的啟動(dòng)、休眠、喚醒狀態(tài)BswM負(fù)責(zé)模式仲裁和動(dòng)作執(zhí)行ComM管理通信狀態(tài)。OS基于AUTOSAR OS的多任務(wù)調(diào)度通常用固定優(yōu)先級(jí)搶占式調(diào)度。這些模塊之間通過(guò)標(biāo)準(zhǔn)接口交互配置工具會(huì)根據(jù)你的配置自動(dòng)生成代碼框架你需要在生成的代碼基礎(chǔ)上填充回調(diào)函數(shù)和業(yè)務(wù)邏輯。2. AUTOSAR從入門(mén)到能上手配置的學(xué)習(xí)路徑2.1 先搞懂AUTOSAR的分層架構(gòu)再動(dòng)手AUTOSAR架構(gòu)的核心思想是“分層”和“標(biāo)準(zhǔn)化接口”。整個(gè)架構(gòu)從上到下分為應(yīng)用層Application Layer、運(yùn)行時(shí)環(huán)境RTE、基礎(chǔ)軟件層BSW。BSW又細(xì)分為服務(wù)層Services Layer、ECU抽象層ECU Abstraction Layer、微控制器抽象層MCU Abstraction Layer和復(fù)雜驅(qū)動(dòng)Complex Drivers。這個(gè)分層不是學(xué)術(shù)概念它直接決定了你工作中改代碼的位置。比如應(yīng)用層要發(fā)一條CAN報(bào)文它調(diào)用的是RTE提供的接口RTE再調(diào)用COM模塊COM調(diào)用PduRPduR調(diào)用CanIfCanIf調(diào)用Can驅(qū)動(dòng)最后到硬件。每一層只跟相鄰層交互層與層之間通過(guò)標(biāo)準(zhǔn)接口通信。我建議的學(xué)習(xí)順序是先理解分層架構(gòu)和模塊交互關(guān)系再逐個(gè)深入具體模塊。不要一上來(lái)就啃CanTp的規(guī)范那樣很容易勸退。2.2 用DaVinci或EB tresos跑通第一個(gè)配置工程理論看再多不如動(dòng)手配一遍。如果你能接觸到Vector DaVinci Configurator或者EB tresos建議從最小系統(tǒng)開(kāi)始新建一個(gè)工程選擇目標(biāo)MCU型號(hào)比如TC397或S32K148。配置MCU時(shí)鐘和啟動(dòng)代碼。添加一個(gè)CAN控制器和CAN硬件對(duì)象Hardware Object。配置CanIf模塊把CAN驅(qū)動(dòng)和上層關(guān)聯(lián)起來(lái)。配置一個(gè)發(fā)送PDU和一個(gè)接收PDU。配置COM模塊定義信號(hào)和信號(hào)組。生成代碼編譯下載到板子上。用CANoe或CANalyzer觀察報(bào)文收發(fā)。這個(gè)流程走通一遍你對(duì)AUTOSAR通信棧的理解會(huì)從“紙上談兵”變成“手里有活”。配置過(guò)程中你會(huì)遇到各種報(bào)錯(cuò)比如“CanIfRxPduRef未配置”“ComSignal引用無(wú)效”之類(lèi)的每解決一個(gè)報(bào)錯(cuò)你就搞懂了一個(gè)模塊的配置邏輯。注意不同工具鏈的配置界面和術(shù)語(yǔ)略有差異但底層邏輯是相通的。DaVinci的配置項(xiàng)命名更貼近規(guī)范文檔EB tresos的界面更工程化。學(xué)會(huì)一個(gè)另一個(gè)上手很快。2.3 沒(méi)有商業(yè)工具怎么學(xué)這是很多人面臨的現(xiàn)實(shí)問(wèn)題。我的建議是用開(kāi)源方案練手Arctic Core是一個(gè)開(kāi)源的AUTOSAR實(shí)現(xiàn)雖然不完整但可以用來(lái)理解基本概念。另外像FreeRTOS加CAN驅(qū)動(dòng)的方式也能模擬一部分AUTOSAR的通信邏輯。用Simulink的AUTOSAR Blockset如果你有MATLAB可以用AUTOSAR Blockset做應(yīng)用層和RTE的建模生成符合AUTOSAR標(biāo)準(zhǔn)的代碼至少能理解SWC軟件組件和RTE的關(guān)系。重點(diǎn)啃規(guī)范中的交互圖AUTOSAR規(guī)范里的序列圖和時(shí)間圖是精華它們描述了模塊之間怎么交互、調(diào)用順序是什么。把這些圖看懂比看文字描述效率高得多。自己寫(xiě)簡(jiǎn)化版比如自己實(shí)現(xiàn)一個(gè)簡(jiǎn)化的CanIf和PduR理解PDU路由的邏輯。雖然不能用于實(shí)際項(xiàng)目但對(duì)理解原理幫助很大。2.4 學(xué)習(xí)過(guò)程中最容易卡住的三個(gè)點(diǎn)第一個(gè)卡點(diǎn)是模塊間接口太多記不住。CanIf有幾十個(gè)APICom有上百個(gè)配置參數(shù)初學(xué)者很容易懵。我的經(jīng)驗(yàn)是不要死記而是抓住主線(xiàn)數(shù)據(jù)從哪來(lái)、到哪去、經(jīng)過(guò)哪些模塊、每個(gè)模塊負(fù)責(zé)什么。把數(shù)據(jù)流圖畫(huà)出來(lái)比背API有用。第二個(gè)卡點(diǎn)是配置參數(shù)之間的依賴(lài)關(guān)系。AUTOSAR配置工具里很多參數(shù)是聯(lián)動(dòng)的。比如你改了CanIf的接收PDU數(shù)量可能需要在Can驅(qū)動(dòng)里同步調(diào)整Hardware Object的數(shù)量。這種依賴(lài)關(guān)系在規(guī)范里不會(huì)集中說(shuō)明需要在實(shí)際配置中積累經(jīng)驗(yàn)。第三個(gè)卡點(diǎn)是調(diào)試手段不熟悉。CAN總線(xiàn)調(diào)試需要你會(huì)用CANoe的Trace窗口、Graphics窗口、Logging功能。UDS診斷調(diào)試需要你會(huì)用CANoe的Diagnostic Console或者Vehicle Spy。這些工具的操作熟練度直接影響你的調(diào)試效率。3. CAN總線(xiàn)與通信棧的實(shí)戰(zhàn)要點(diǎn)3.1 CAN總線(xiàn)協(xié)議的核心機(jī)制回顧C(jī)AN總線(xiàn)是汽車(chē)電子最基礎(chǔ)的通信方式雖然現(xiàn)在以太網(wǎng)在域控制器里越來(lái)越重要但CAN依然是絕大多數(shù)ECU的標(biāo)配。CAN協(xié)議的核心機(jī)制包括多主架構(gòu)總線(xiàn)上沒(méi)有主從之分任何節(jié)點(diǎn)都可以在總線(xiàn)空閑時(shí)發(fā)送報(bào)文。非破壞性仲裁多個(gè)節(jié)點(diǎn)同時(shí)發(fā)送時(shí)通過(guò)標(biāo)識(shí)符ID的逐位仲裁決定優(yōu)先級(jí)ID越小優(yōu)先級(jí)越高。位填充每5個(gè)相同位后插入一個(gè)相反位保證信號(hào)跳變足夠多便于接收方同步。CRC校驗(yàn)15位CRC校驗(yàn)檢測(cè)傳輸錯(cuò)誤。應(yīng)答機(jī)制接收方在ACK槽拉低總線(xiàn)表示正確接收。CAN FDFlexible Data Rate是CAN的升級(jí)版數(shù)據(jù)場(chǎng)從8字節(jié)擴(kuò)展到64字節(jié)速率也從最高1Mbps提升到數(shù)據(jù)段最高8Mbps。現(xiàn)在新項(xiàng)目基本都用CAN FD了但很多老車(chē)型還是經(jīng)典CAN。3.2 AUTOSAR CAN通信棧的數(shù)據(jù)流一條CAN報(bào)文從應(yīng)用層發(fā)出到總線(xiàn)上要經(jīng)過(guò)這些模塊層級(jí)模塊職責(zé)應(yīng)用層SWC調(diào)用RTE接口發(fā)送信號(hào)RTERTE將信號(hào)寫(xiě)入COM服務(wù)層COM信號(hào)打包成PDU觸發(fā)發(fā)送服務(wù)層PduRPDU路由決定走哪個(gè)通信棧ECU抽象層CanIfPDU到CAN幀的映射緩沖區(qū)管理MCU抽象層Can操作CAN控制器寄存器收發(fā)幀硬件CAN Controller位流收發(fā)仲裁CRC接收方向反過(guò)來(lái)CAN控制器收到幀觸發(fā)中斷Can驅(qū)動(dòng)讀取幀CanIf做幀到PDU的映射PduR路由到COMCOM解包成信號(hào)RTE通知應(yīng)用層。理解這個(gè)數(shù)據(jù)流是調(diào)試CAN通信問(wèn)題的基礎(chǔ)。比如你發(fā)現(xiàn)應(yīng)用層收不到信號(hào)可以逐層排查CAN控制器有沒(méi)有收到幀CanIf有沒(méi)有正確映射PduR路由對(duì)不對(duì)COM信號(hào)配置有沒(méi)有問(wèn)題3.3 CAN通信調(diào)試中常見(jiàn)的坑坑一波特率不匹配。這是最常見(jiàn)的低級(jí)錯(cuò)誤但排查起來(lái)很費(fèi)時(shí)間。如果總線(xiàn)上有節(jié)點(diǎn)波特率不對(duì)會(huì)導(dǎo)致整個(gè)總線(xiàn)錯(cuò)誤幀增多通信不穩(wěn)定。用示波器測(cè)一下位時(shí)間就能確認(rèn)??佣蓸狱c(diǎn)配置不一致。CAN的采樣點(diǎn)位置通常75%到87.5%之間如果各節(jié)點(diǎn)不一致在總線(xiàn)較長(zhǎng)或速率較高時(shí)容易出錯(cuò)。AUTOSAR的Can模塊里可以配置采樣點(diǎn)要跟總線(xiàn)上的其他節(jié)點(diǎn)保持一致??尤鼿ardware Object數(shù)量不夠。Can驅(qū)動(dòng)里的Hardware Object是硬件資源數(shù)量有限。如果發(fā)送和接收的PDU數(shù)量超過(guò)Hardware Object數(shù)量就需要做復(fù)用配置復(fù)雜度會(huì)上升。坑四CanIf的緩沖區(qū)溢出。接收方向如果CanIf的Rx Buffer太小或者上層處理太慢會(huì)導(dǎo)致丟幀。CanIf有專(zhuān)門(mén)的丟幀計(jì)數(shù)器調(diào)試時(shí)要注意看??游錍AN FD的BRS位配置。CAN FD幀里有一個(gè)BRS位Bit Rate Switch決定數(shù)據(jù)段是否切換到高速率。如果發(fā)送方開(kāi)了BRS但接收方?jīng)]開(kāi)或者反過(guò)來(lái)通信會(huì)失敗。提示調(diào)試CAN通信時(shí)先用CANoe的Trace窗口看原始報(bào)文確認(rèn)物理層和鏈路層沒(méi)問(wèn)題再往上排查。不要一上來(lái)就懷疑軟件配置。3.4 UDS診斷服務(wù)的實(shí)現(xiàn)要點(diǎn)UDSUnified Diagnostic Services是汽車(chē)電子診斷的標(biāo)準(zhǔn)協(xié)議基于ISO 14229。底層軟件工程師需要實(shí)現(xiàn)的服務(wù)包括0x10 會(huì)話(huà)控制切換默認(rèn)會(huì)話(huà)、編程會(huì)話(huà)、擴(kuò)展會(huì)話(huà)。0x27 安全訪(fǎng)問(wèn)種子密鑰機(jī)制防止未授權(quán)訪(fǎng)問(wèn)。0x22 讀數(shù)據(jù)按DID讀取數(shù)據(jù)。0x2E 寫(xiě)數(shù)據(jù)按DID寫(xiě)入數(shù)據(jù)。0x31 例程控制啟動(dòng)、停止、查詢(xún)例程結(jié)果。0x19 讀故障碼讀取DTC信息。0x14 清除故障碼。0x3E Tester Present保持會(huì)話(huà)。在AUTOSAR架構(gòu)里UDS服務(wù)由DCM模塊實(shí)現(xiàn)DCM調(diào)用PduR和CanTp完成診斷報(bào)文的收發(fā)。你需要配置DCM的服務(wù)表、DID表、安全等級(jí)等。實(shí)現(xiàn)UDS診斷時(shí)最容易出問(wèn)題的地方是會(huì)話(huà)超時(shí)和保持。默認(rèn)會(huì)話(huà)下如果一段時(shí)間沒(méi)有Tester PresentECU會(huì)回到默認(rèn)會(huì)話(huà)。編程會(huì)話(huà)下如果超時(shí)會(huì)退出編程會(huì)話(huà)。這些超時(shí)參數(shù)S3 Server需要根據(jù)項(xiàng)目要求配置。另一個(gè)容易出問(wèn)題的是安全訪(fǎng)問(wèn)的種子密鑰算法。這個(gè)算法通常是OEM定義的需要跟診斷儀端保持一致。調(diào)試時(shí)如果安全訪(fǎng)問(wèn)過(guò)不去先確認(rèn)算法實(shí)現(xiàn)是否正確再確認(rèn)種子和密鑰的字節(jié)序。4. NVM存儲(chǔ)棧與模式管理的配置邏輯4.1 NVM模塊的鏈路與配置要點(diǎn)NVMNon-Volatile Memory模塊負(fù)責(zé)把數(shù)據(jù)掉電保存。在AUTOSAR架構(gòu)里NVM的鏈路是NvM - MemIf - FeeFlash EEPROM Emulation或EaEEPROM Abstraction- Fls或Eep - 硬件。NvM管理的是“NVRAM Block”每個(gè)Block有唯一的Block ID可以配置為Native Block直接存儲(chǔ)數(shù)據(jù)不做冗余。Redundant Block存兩份一份壞了可以用另一份恢復(fù)。Dataset Block一個(gè)Block存多組數(shù)據(jù)通過(guò)Index選擇。配置NvM時(shí)需要注意Block的讀寫(xiě)周期NvM的讀寫(xiě)是異步的通過(guò)Job End Notification回調(diào)通知完成。不要在主循環(huán)里同步等待會(huì)阻塞。CRC校驗(yàn)可以配置CRC類(lèi)型CRC8/CRC16/CRC32用于檢測(cè)數(shù)據(jù)完整性。寫(xiě)保護(hù)可以配置寫(xiě)保護(hù)防止誤寫(xiě)。ROM Block用于存儲(chǔ)默認(rèn)值首次上電或數(shù)據(jù)損壞時(shí)從ROM恢復(fù)。Fee模塊是Flash模擬EEPROM的關(guān)鍵它通過(guò)磨損均衡算法延長(zhǎng)Flash壽命。配置Fee時(shí)需要關(guān)注Block大小和數(shù)量根據(jù)實(shí)際數(shù)據(jù)量規(guī)劃。擦除周期Flash的擦除次數(shù)有限通常10萬(wàn)次Fee通過(guò)分散寫(xiě)入來(lái)均衡磨損。垃圾回收Fee在空間不足時(shí)會(huì)觸發(fā)垃圾回收把有效數(shù)據(jù)搬到新扇區(qū)擦除舊扇區(qū)。4.2 EcuM、BswM、ComM的協(xié)作關(guān)系這三個(gè)模塊是AUTOSAR模式管理的核心初學(xué)者很容易搞混。EcuMECU State Manager負(fù)責(zé)ECU的啟動(dòng)和休眠。上電后EcuM負(fù)責(zé)初始化BSW和OS然后啟動(dòng)RTE。休眠時(shí)EcuM負(fù)責(zé)關(guān)閉各模塊最后讓MCU進(jìn)入低功耗模式。BswMBasic Software Mode Manager負(fù)責(zé)模式仲裁和動(dòng)作執(zhí)行。它接收來(lái)自各模塊的模式請(qǐng)求比如ComM請(qǐng)求通信模式、DCM請(qǐng)求診斷模式根據(jù)配置的規(guī)則做仲裁然后執(zhí)行相應(yīng)的動(dòng)作比如啟動(dòng)CAN通信、切換會(huì)話(huà)。ComMCommunication Manager負(fù)責(zé)通信狀態(tài)管理。它管理通信通道Channel每個(gè)通道可以處于No Communication、Silent Communication、Full Communication三種狀態(tài)。ComM的狀態(tài)變化會(huì)通知BswMBswM再控制CanSM和CanIf。三者的協(xié)作流程大致是EcuM啟動(dòng) - BswM初始化 - ComM請(qǐng)求通信 - BswM仲裁 - CanSM啟動(dòng)CAN控制器 - 通信就緒。配置這三個(gè)模塊時(shí)最容易出錯(cuò)的是模式請(qǐng)求的優(yōu)先級(jí)和仲裁規(guī)則。比如診斷會(huì)話(huà)請(qǐng)求全通信但應(yīng)用層請(qǐng)求靜默通信BswM需要根據(jù)優(yōu)先級(jí)決定聽(tīng)誰(shuí)的。這些規(guī)則在BswM的配置里定義需要仔細(xì)設(shè)計(jì)。4.3 休眠喚醒的底層實(shí)現(xiàn)細(xì)節(jié)休眠喚醒是汽車(chē)電子底層軟件的重要功能直接關(guān)系到整車(chē)靜態(tài)電流。實(shí)現(xiàn)休眠喚醒需要關(guān)注喚醒源配置CAN喚醒、LIN喚醒、KL15硬線(xiàn)喚醒等。EcuM里配置喚醒源CanSM里配置CAN喚醒。休眠流程應(yīng)用層請(qǐng)求休眠 - ComM進(jìn)入No Communication - BswM執(zhí)行休眠動(dòng)作 - CanSM關(guān)閉CAN控制器 - EcuM關(guān)閉各模塊 - MCU進(jìn)入低功耗模式。喚醒流程喚醒源觸發(fā) - MCU喚醒 - EcuM檢測(cè)喚醒源 - 初始化BSW - 恢復(fù)通信。喚醒驗(yàn)證有些項(xiàng)目要求喚醒后先驗(yàn)證喚醒源是否有效無(wú)效則繼續(xù)休眠防止誤喚醒。調(diào)試休眠喚醒時(shí)最常用的工具是電流鉗和示波器觀察MCU的電流曲線(xiàn)和喚醒引腳的電平變化。軟件層面可以用調(diào)試器看各模塊的狀態(tài)機(jī)。注意休眠喚醒的調(diào)試往往需要硬件配合比如CAN喚醒需要CAN收發(fā)器支持低功耗模式。如果硬件設(shè)計(jì)有問(wèn)題軟件怎么調(diào)都沒(méi)用。5. 嵌入式軟件單元測(cè)試與功能安全5.1 單元測(cè)試在汽車(chē)電子里的特殊要求汽車(chē)電子的單元測(cè)試跟互聯(lián)網(wǎng)的單元測(cè)試差別很大?;ヂ?lián)網(wǎng)的單元測(cè)試通常跑在開(kāi)發(fā)機(jī)上用Mock隔離依賴(lài)。汽車(chē)電子的單元測(cè)試要求更嚴(yán)格尤其是涉及功能安全的項(xiàng)目。ISO 26262對(duì)單元測(cè)試的要求包括語(yǔ)句覆蓋率每條語(yǔ)句至少執(zhí)行一次。分支覆蓋率每個(gè)分支至少執(zhí)行一次。MC/DC覆蓋率修改條件判定覆蓋率要求每個(gè)條件獨(dú)立影響判定結(jié)果。達(dá)到MC/DC覆蓋率是很多底層軟件工程師頭疼的事。比如一個(gè)if語(yǔ)句里有三個(gè)條件用連接要設(shè)計(jì)足夠的測(cè)試用例讓每個(gè)條件都能獨(dú)立影響結(jié)果。常用的單元測(cè)試工具是VectorCAST、LDRA、Tessy。這些工具可以自動(dòng)生成測(cè)試框架但測(cè)試用例還是需要人工設(shè)計(jì)。底層軟件的單元測(cè)試通常針對(duì)具體的函數(shù)比如CRC計(jì)算函數(shù)、信號(hào)打包函數(shù)、狀態(tài)機(jī)函數(shù)。5.2 怎么寫(xiě)好一個(gè)底層軟件的單元測(cè)試寫(xiě)底層軟件的單元測(cè)試我的經(jīng)驗(yàn)是第一先明確測(cè)試目標(biāo)。是測(cè)函數(shù)的返回值還是測(cè)函數(shù)對(duì)全局變量的影響還是測(cè)函數(shù)的調(diào)用序列。目標(biāo)不同測(cè)試方法不同。第二隔離硬件依賴(lài)。底層軟件的函數(shù)往往直接操作寄存器單元測(cè)試時(shí)需要用Mock替換掉硬件訪(fǎng)問(wèn)。比如把寄存器讀寫(xiě)封裝成宏或函數(shù)測(cè)試時(shí)替換成內(nèi)存變量。第三覆蓋邊界條件。底層軟件最容易出問(wèn)題的地方是邊界條件比如數(shù)組越界、整數(shù)溢出、空指針。測(cè)試用例要專(zhuān)門(mén)覆蓋這些。第四用參數(shù)化測(cè)試。很多底層函數(shù)是純邏輯的輸入輸出確定適合用參數(shù)化測(cè)試批量覆蓋。比如CRC函數(shù)可以用已知的輸入輸出對(duì)做驗(yàn)證。第五關(guān)注中斷和并發(fā)。底層軟件經(jīng)常在中斷里執(zhí)行單元測(cè)試時(shí)要考慮中斷嵌套和并發(fā)訪(fǎng)問(wèn)的問(wèn)題??梢杂渺o態(tài)分析工具輔助檢查。5.3 功能安全對(duì)底層軟件開(kāi)發(fā)流程的影響如果項(xiàng)目要求符合ISO 26262底層軟件的開(kāi)發(fā)流程會(huì)有這些變化需求追溯每個(gè)函數(shù)、每個(gè)配置項(xiàng)都要追溯到需求。需求文檔、設(shè)計(jì)文檔、代碼、測(cè)試用例之間要建立雙向追溯矩陣。代碼規(guī)范通常要求符合MISRA C規(guī)范禁止使用動(dòng)態(tài)內(nèi)存分配、遞歸、goto等。靜態(tài)分析用Polyspace、Coverity等工具做靜態(tài)分析檢查運(yùn)行時(shí)錯(cuò)誤和代碼規(guī)范違反。測(cè)試覆蓋率單元測(cè)試覆蓋率要達(dá)到ASIL等級(jí)對(duì)應(yīng)的要求。ASIL D要求MC/DC覆蓋率100%。變更管理任何代碼變更都要走變更流程評(píng)估影響范圍更新追溯矩陣。這些流程在傳統(tǒng)嵌入式開(kāi)發(fā)里是沒(méi)有的剛開(kāi)始會(huì)覺(jué)得繁瑣但習(xí)慣了之后會(huì)發(fā)現(xiàn)它確實(shí)能減少bug。尤其是追溯矩陣在排查問(wèn)題時(shí)非常有用。6. 面試準(zhǔn)備與技能查漏補(bǔ)缺6.1 汽車(chē)電子底層軟件面試常考什么根據(jù)我和身邊朋友的面試經(jīng)驗(yàn)汽車(chē)電子底層軟件崗位的面試通常分幾輪第一輪基礎(chǔ)技術(shù)面??疾霤語(yǔ)言基礎(chǔ)、MCU原理、CAN總線(xiàn)基礎(chǔ)。常見(jiàn)問(wèn)題包括volatile關(guān)鍵字的作用和使用場(chǎng)景。中斷服務(wù)函數(shù)的編寫(xiě)注意事項(xiàng)。CAN總線(xiàn)的仲裁機(jī)制和錯(cuò)誤處理。指針和數(shù)組的區(qū)別函數(shù)指針的用法。大小端的概念和判斷方法。第二輪AUTOSAR專(zhuān)項(xiàng)面??疾霢UTOSAR架構(gòu)和模塊配置經(jīng)驗(yàn)。常見(jiàn)問(wèn)題包括AUTOSAR的分層架構(gòu)各層職責(zé)。CAN通信棧的數(shù)據(jù)流從應(yīng)用層到總線(xiàn)的完整路徑。CanIf和Can驅(qū)動(dòng)的區(qū)別和聯(lián)系。COM模塊的信號(hào)打包和解包機(jī)制。NVM的Block類(lèi)型和Fee的工作原理。EcuM、BswM、ComM的協(xié)作關(guān)系。UDS診斷服務(wù)的實(shí)現(xiàn)DCM和DEM的關(guān)系。第三輪項(xiàng)目經(jīng)驗(yàn)面。讓你講一個(gè)做過(guò)的項(xiàng)目重點(diǎn)問(wèn)你在項(xiàng)目中遇到什么問(wèn)題、怎么解決的。這一輪最能體現(xiàn)真實(shí)水平建議提前準(zhǔn)備兩三個(gè)有代表性的案例。第四輪HR面。聊薪資、職業(yè)規(guī)劃、團(tuán)隊(duì)協(xié)作等。6.2 簡(jiǎn)歷上怎么寫(xiě)底層軟件項(xiàng)目經(jīng)驗(yàn)簡(jiǎn)歷上的項(xiàng)目經(jīng)驗(yàn)要突出“你做了什么”和“解決了什么問(wèn)題”而不是“這個(gè)項(xiàng)目用了什么技術(shù)”。不好的寫(xiě)法“使用AUTOSAR架構(gòu)開(kāi)發(fā)BCM底層軟件配置了CAN通信棧和NVM模塊。”好的寫(xiě)法“負(fù)責(zé)BCM項(xiàng)目CAN通信棧的配置與調(diào)試解決了CAN FD數(shù)據(jù)段波特率不匹配導(dǎo)致的通信丟幀問(wèn)題通過(guò)調(diào)整采樣點(diǎn)配置和BRS位策略將通信穩(wěn)定性從95%提升到99.9%?!焙笳哂芯唧w問(wèn)題、具體動(dòng)作、具體結(jié)果面試官一看就知道你真正動(dòng)過(guò)手。另外簡(jiǎn)歷上要體現(xiàn)你對(duì)工具鏈的熟悉程度。比如“熟練使用Vector DaVinci Configurator進(jìn)行AUTOSAR BSW配置”“熟練使用CANoe進(jìn)行總線(xiàn)分析和診斷調(diào)試”“熟悉ISO 26262功能安全開(kāi)發(fā)流程”。這些關(guān)鍵詞是HR篩選簡(jiǎn)歷時(shí)重點(diǎn)看的。6.3 從傳統(tǒng)嵌入式轉(zhuǎn)汽車(chē)電子的補(bǔ)課清單如果你已經(jīng)會(huì)STM32、會(huì)寫(xiě)驅(qū)動(dòng)、會(huì)跑RTOS轉(zhuǎn)汽車(chē)電子底層軟件需要補(bǔ)這些技能項(xiàng)補(bǔ)課方式預(yù)計(jì)時(shí)間AUTOSAR架構(gòu)看規(guī)范文檔的Layered Software Architecture部分1周CAN總線(xiàn)協(xié)議看ISO 11898規(guī)范用CANoe實(shí)操2周AUTOSAR CAN通信棧用DaVinci或EB tresos配置一個(gè)最小工程3周UDS診斷看ISO 14229規(guī)范用CANoe診斷控制臺(tái)實(shí)操2周NVM存儲(chǔ)棧配置Fee和NvM理解磨損均衡1周模式管理理解EcuM/BswM/ComM的協(xié)作1周功能安全看ISO 26262的Part 6了解開(kāi)發(fā)流程2周單元測(cè)試學(xué)VectorCAST或Tessy寫(xiě)幾個(gè)函數(shù)的測(cè)試2周這個(gè)清單是按有嵌入式基礎(chǔ)的前提列的如果完全沒(méi)有嵌入式經(jīng)驗(yàn)還需要先補(bǔ)C語(yǔ)言、MCU原理、RTOS這些基礎(chǔ)。6.4 面試中展示項(xiàng)目經(jīng)驗(yàn)的技巧面試時(shí)講項(xiàng)目經(jīng)驗(yàn)建議用STAR法則Situation背景、Task任務(wù)、Action行動(dòng)、Result結(jié)果。但不要機(jī)械地套要自然地講出來(lái)。比如講一個(gè)CAN通信調(diào)試的案例“當(dāng)時(shí)項(xiàng)目里有個(gè)問(wèn)題整車(chē)廠(chǎng)反饋我們的ECU在特定工況下會(huì)偶發(fā)通信丟失。我先用CANoe抓了總線(xiàn)數(shù)據(jù)發(fā)現(xiàn)是CAN FD幀的BRS位在數(shù)據(jù)段切換時(shí)出現(xiàn)了錯(cuò)誤幀。排查下來(lái)是采樣點(diǎn)配置跟總線(xiàn)上另一個(gè)節(jié)點(diǎn)不一致在總線(xiàn)負(fù)載高的時(shí)候累積誤差導(dǎo)致位錯(cuò)誤。后來(lái)我把采樣點(diǎn)從75%調(diào)整到80%跟對(duì)方節(jié)點(diǎn)對(duì)齊問(wèn)題就解決了。這個(gè)問(wèn)題的難點(diǎn)在于偶發(fā)性不是每次都能復(fù)現(xiàn)需要長(zhǎng)時(shí)間抓數(shù)據(jù)才能定位。”這樣的講述有背景、有分析過(guò)程、有具體動(dòng)作、有結(jié)果面試官能看出你的排查思路和動(dòng)手能力。7. 學(xué)習(xí)資源與工具鏈的獲取建議7.1 規(guī)范文檔怎么讀才不勸退AUTOSAR規(guī)范文檔有幾百個(gè)PDF全讀是不可能的。我的建議是先讀EXP文檔AUTOSAR的Explanation文檔比Specification文檔好讀它用更通俗的語(yǔ)言解釋模塊的功能和用法。重點(diǎn)讀序列圖規(guī)范里的序列圖描述了模塊間的交互順序是理解數(shù)據(jù)流的關(guān)鍵。按需查閱不要試圖一次讀完一個(gè)模塊的所有文檔先看SWSSoftware Specification的API列表和配置參數(shù)用到的時(shí)候再深入。結(jié)合工具看在DaVinci或EB tresos里配置的時(shí)候?qū)φ找?guī)范看每個(gè)參數(shù)的含義比干讀文檔效率高。7.2 常用工具鏈的替代方案正版工具鏈貴但有一些替代方案可以降低學(xué)習(xí)成本CANoe的替代可以用開(kāi)源的CAN分析工具如candump/cansendLinux下SocketCAN工具、BUSMASTERWindows下的開(kāi)源工具。雖然功能不如CANoe全但基本的收發(fā)和解析夠用。DaVinci的替代EB tresos有試用版Arctic Core是開(kāi)源的。另外有些芯片廠(chǎng)商提供免費(fèi)的配置工具比如NXP的S32 Design Studio里集成了AUTOSAR配置功能。VectorCAST的替代可以用開(kāi)源的單元測(cè)試框架如Unity、CMock雖然不滿(mǎn)足功能安全的認(rèn)證要求但用來(lái)練習(xí)單元測(cè)試思想是夠的。7.3 加入技術(shù)社區(qū)和持續(xù)學(xué)習(xí)汽車(chē)電子底層軟件這個(gè)方向技術(shù)更新不算快但細(xì)節(jié)很多。建議多逛這些地方AUTOSAR官網(wǎng)規(guī)范文檔和新聞的官方來(lái)源。Vector、ETAS、Elektrobit的開(kāi)發(fā)者社區(qū)有工具使用教程和FAQ。CSDN、知乎上的汽車(chē)電子專(zhuān)欄有不少?gòu)臉I(yè)者分享實(shí)戰(zhàn)經(jīng)驗(yàn)。GitHub上的開(kāi)源AUTOSAR項(xiàng)目可以看別人的實(shí)現(xiàn)學(xué)習(xí)配置思路。另外如果條件允許建議參加一些線(xiàn)下培訓(xùn)或技術(shù)沙龍。汽車(chē)電子這個(gè)圈子不大很多經(jīng)驗(yàn)是在交流中獲得的不是看書(shū)能學(xué)到的。8. 實(shí)際工作中的經(jīng)驗(yàn)與教訓(xùn)8.1 配置工具生成的代碼不要隨便改AUTOSAR配置工具會(huì)生成大量代碼這些代碼是工具根據(jù)你的配置自動(dòng)生成的。千萬(wàn)不要手動(dòng)修改生成代碼因?yàn)橄麓沃匦律蓵r(shí)你的修改會(huì)被覆蓋。正確的做法是在工具提供的回調(diào)函數(shù)Callback里寫(xiě)業(yè)務(wù)邏輯或者用工具提供的“User Code”區(qū)域。如果工具不支持就把邏輯寫(xiě)到單獨(dú)的源文件里通過(guò)接口調(diào)用。我見(jiàn)過(guò)有同事直接改了生成的CanIf代碼結(jié)果后來(lái)重新配置時(shí)忘了導(dǎo)致一個(gè)bug排查了兩天。8.2 版本管理和配置管理很重要汽車(chē)電子項(xiàng)目通常周期長(zhǎng)、參與人多版本管理和配置管理沒(méi)做好會(huì)非常痛苦。建議代碼用Git或SVN管理每次配置變更都要提交寫(xiě)清楚變更內(nèi)容。配置工具生成的.arxml文件也要納入版本管理這是配置的源文件。工具鏈版本要統(tǒng)一不同版本的DaVinci生成的代碼可能不兼容。芯片廠(chǎng)商的MCAL版本要跟AUTOSAR版本匹配不匹配會(huì)導(dǎo)致編譯錯(cuò)誤或運(yùn)行時(shí)問(wèn)題。8.3 調(diào)試時(shí)先懷疑硬件再懷疑軟件這是我踩過(guò)好幾次坑之后總結(jié)的。CAN通信不通先檢查線(xiàn)束、終端電阻、電源MCU跑不起來(lái)先檢查供電、晶振、復(fù)位電路。硬件沒(méi)問(wèn)題了再排查軟件配置。有一次我調(diào)一個(gè)CAN通信問(wèn)題查了兩天軟件配置都沒(méi)找到原因最后發(fā)現(xiàn)是CAN收發(fā)器的使能引腳接錯(cuò)了。硬件問(wèn)題往往比軟件問(wèn)題更隱蔽因?yàn)檐浖辽龠€有日志和調(diào)試器硬件只能靠測(cè)量。8.4 跟應(yīng)用層和測(cè)試團(tuán)隊(duì)的協(xié)作底層軟件工程師不是孤立的你需要跟應(yīng)用層開(kāi)發(fā)者和測(cè)試工程師緊密協(xié)作。跟應(yīng)用層協(xié)作時(shí)要明確RTE接口的定義包括信號(hào)的數(shù)據(jù)類(lèi)型、取值范圍、更新周期。接口定義不清楚后期改起來(lái)很麻煩。跟測(cè)試團(tuán)隊(duì)協(xié)作時(shí)要提供清晰的診斷規(guī)范和測(cè)試接口。測(cè)試團(tuán)隊(duì)需要知道怎么觸發(fā)故障、怎么讀取內(nèi)部狀態(tài)。如果底層軟件不提供這些測(cè)試就沒(méi)法做。8.5 持續(xù)學(xué)習(xí)的建議汽車(chē)電子底層軟件這個(gè)方向技術(shù)棧比較穩(wěn)定但細(xì)節(jié)很多。我的學(xué)習(xí)習(xí)慣是每做一個(gè)新模塊就寫(xiě)一篇筆記記錄配置要點(diǎn)、踩過(guò)的坑、調(diào)試方法。積累下來(lái)就是自己的知識(shí)庫(kù)。定期回顧規(guī)范文檔每次看都會(huì)有新收獲因?yàn)閷?shí)際項(xiàng)目經(jīng)驗(yàn)會(huì)讓你對(duì)規(guī)范里的描述有更深的理解。關(guān)注行業(yè)動(dòng)態(tài)比如AUTOSAR APAdaptive Platform的發(fā)展雖然CP還是主流但AP在域控制器和自動(dòng)駕駛領(lǐng)域越來(lái)越重要。保持動(dòng)手光看不動(dòng)手很容易忘。有條件的話(huà)自己買(mǎi)塊開(kāi)發(fā)板跑一跑CAN通信、UDS診斷的demo。這個(gè)方向入門(mén)確實(shí)有門(mén)檻但一旦跨過(guò)去職業(yè)發(fā)展路徑很清晰薪資天花板也高。我身邊轉(zhuǎn)了汽車(chē)電子的朋友沒(méi)有一個(gè)后悔的。關(guān)鍵是要找到正確的學(xué)習(xí)路徑不要被龐大的規(guī)范文檔嚇退從最小系統(tǒng)開(kāi)始一步步跑通慢慢就上手了。