一文看懂汽車電子ECU bootloader工做原理及開發要點

隨着半導體技術的不斷進步(按照摩爾定律),MCU內部集成的邏輯功能外設愈來愈多,存儲器也愈來愈大。消費者對於汽車節能(經濟和法規對排放的要求)型、溫馨性、互聯性、安全性(功能安全和信息安全)的要求愈來愈高,特別是近年來新能源電動車、車聯網和自動駕駛技術的興起,更大大加速了汽車電子技術的發展。汽車電子ECU(Electronic Control Unit--電控單元)集成的功能日益複雜,爲了應對軟件遠程(在線)功能升級(增長新的功能)和bug修復的需求、對bootLoader(啓動加載程序)的需求愈來愈多。本文詳細介紹了汽車電子ECU bootloader的通常性工做原理和開發要點,其適用於全部的汽車電子ECU bootloader開發。html

  

1、bootloader的功能編程

  BootLoader,顧名思義,就是駐留在ECU非易失性存儲器中的一段程序加載代碼,每次ECU復位後,都會運行bootloader。它會檢查是否有來自通訊總線的遠程程序加載請求,若是有,則進入bootloader模式,創建與程序下載端(一般爲PC上位機)的總線通訊並接收通訊總線下載的應用程序、解析其地址和數據代碼,運行NVM(None Valitale Momory--非易失性存儲器)驅動程序,將其編程到NVM中,並校驗其完整性,從而完成應用程序更新。若是沒有來自通訊總線的遠程程序加載請求,則直接跳轉到應用程序復位入口函數(復位中斷ISR,也稱做Entry_Point()--使用Processor Expert的CodeWarrior 工程或者Startup()函數--普通CodeWarrior 工程),運行應用程序。安全

  基於此,汽車ECU的bootloader三大主要概念以下:編輯器

  與遠程程序下載端創建可靠的總線通訊以獲取要更新應用程序;函數

  解析應用程序編程文件(S19/HEX/BIN)得到其在NVM中的地址和程序代碼及數據;工具

  運行NVM驅動將應用程序的代碼和數據編程到NVM中並校驗;開發工具

2、如何創建可靠的總線通訊?編碼

  汽車ECU常見的數據總線有CAN和LIN,所以一般汽車ECU的bootloader都是經過CAN或者LIN下載數據的。固然也能夠基於其餘總線,好比基於SPI總線或者I2C總線(典型如一些帶有安全監測的功能安全ECU,經過主MCU對功能安全監測MCU的程序進行升級)以及以太網(基於Enternet通訊的中控或者全液晶儀表的ECU以及下一代高速網關和ADAS ECU)。加密

  TIps:prototype

  a、不一樣的ECU通訊總線不同,具體須要用到某種通訊總線取決於實際應用;

  b、通訊總線有ECU的MCU外設實現,因此在bootloader中必須開發相應的通訊總線外設驅動程序,實現基本的數據發送和接收功能;

  c、爲了保證通訊的可靠性,必須開發一個基於通訊總線完善的通訊協議,應用程序下載端和bootloader之間須要創建請求命令(request command)、確認(acknowledge)、等待(block wait)、錯誤重傳(error re-send)等機制----bootloader根據不一樣的請求命令完成不一樣的任務並確認操做是否完成(ACK)以及數據是否正被確完整的傳輸,若出現數據錯誤(經過校驗和或者ECC實現),須要進行自動重傳;

  d、應用程序下載端經過須要在PC上基於VC或者C#、QT、Labview等開發GUI軟件,實現c中要求的總線通訊協議,通常在其底層都是經過調用相應的總線設備,如USB轉CAN/LIN的轉發器設備的動態庫(DLL)的API接口來實現數據的收發,相應的總線USB轉發設備都會提供相應的驅動庫(DLL)。所以bootloader開發者通常還需具有必定的PC上位機軟件開發能力;

  e、爲了實現數據的可靠傳輸,通常在總線通訊協議中添加信源編碼,即在發送是對有效數據進行校驗和或者ECC計算並將結果在通訊數據幀中和有效數據一塊兒發送,bootloader接收端,接收到數據幀後對有效數據域進行發送端一樣的校驗和或者ECC計算,得出結果與接收到的校驗和或者ECC計算結果值進行比較從而判斷數據的完整性。應用程序編程文件(S19/HEX/BIN)都具備相應的校驗和機制,因此能夠採起直接傳送程序編程文件行的方式;不然,用戶須要在上位機軟件中首先解析編程文件,再將其中的地址和數據及代碼封裝打包成某種定製的通訊協議,在bootloader中還得對其進行解包,這樣一來,略顯麻煩,但有些主機廠(Car OEM)爲了知識產權保護,有本身的bootloader協議,這種狀況下,bootloader開發者就必須按照主機廠的要求來開發;

  f、一些正規的大主機廠要求其ECU供應商開發放入ECU bootloader必須基於UDS等總線診斷協議,在UDS中規定了相應的CAN ID給bootloader使用,那麼久必須在該類ECU中的bootloader工程中加入相應的UDS協議棧;

  

3、解析編程文件(S19/HEX/BIN)

  不一樣的MCU軟件開發IDE編譯連接生成的編程文件格式可能不一樣,但S1九、HEX和BIN文件之間是能夠相互轉化的,因此只須要在bootloader中開一種編程文件的解析程序就能夠了,其餘的可使用相應的轉換工具(convert tool)在上位機上進行轉換;

  對編程文件的解析,目的在於得到應用程序的程序代碼和數據及其在NVM中的存儲地址;

  爲了解析編程文件必須先了解其中的編碼格式和原理,經常使用的S1九、HEX和BIN文件的格式說明請參考以下維基百科連接:

  S19文件:https://en.wikipedia.org/wiki/SREC_(file_format)

  HEX文件:https://en.wikipedia.org/wiki/Intel_HEX

  BIN文件:https://en.wikipedia.org/wiki/Binary_file

  TIps:

  S19和HEX文件都是能夠直接使用文本編輯器(好比記事本,notepad++)打開的,只須要將包含地址和數據代碼的S一、S2和S3開始的S19文件行合併便可,能夠手動拷貝,也能夠編寫window批處理腳原本處理;固然也有專門的能夠支持兩個S19文件的合併,網上能夠找到不少開源軟件,好比常見的Srecord等;

  MCU的軟件開發IDE通常都集成不一樣編程文件之間的轉換工具:好比S32DS的objcopy(Create Flash Image )

  以及Keil的Motorola S-Record to BINARY File Converter http://www.keil.com/download/docs/10.asp

4、NVM驅動程序開發

  ECU的NVM通常包括其MCU片內集成的用於存放數據的EEPROM或者Data-Flash和用於存儲程序代碼/數據的Code-Flash/Program-Flash以及MPU擴展的片外NOR Flash或者NAND-Flash;NVM驅動程序包括對NVM的擦除(erase)、編程(program)和校驗(verify)等基本操做,也包括對NVM的加密(secure)/解密(unsecure)和加保護(protecTIon)/解保護(unprotecTIon)操做。

  Tips:

  a、MCU片上集成的NVM中EEPROM/D-Flash和C_Flash/P-Flash通常屬於不一樣的block,因此能夠直接在Flash上運行NVM驅動對EEPROM/D-Flash進行擦除和編程操做;

  b、NVM驅動通常都是經過運行一個NVM command序列,在其中經過NVM控制器寄存器給出不一樣的NVM操做命令代碼、NVM編程數據和目標地址的方式完成,典型的NVM command序列以下(Freescale的S12(X)系列MCU Flash write command 序列):

  

  c、因爲NVM的工做速度通常較CPU內核頻率和總線頻率低,因此運行NVM驅動前必須對NVM進行初始化,將設置分頻器其工做頻率設置爲正常工做所需頻率範圍;

  d、MCU片內的NVM同一個block上不能運行NVM的驅動對其自身進行擦除和編程操做,不然會傳出read while write的總線訪問衝突(每一個NVM block只有一條數據總線,一個時刻只能進行讀出或者寫入,不支持同時讀出和寫入)。所以對於僅有一個block Flash的MCU來講,就必須在RAM中調用其NVM驅動,來對其自身進行擦除和編程操做,同時在launch Flash command到等待command完成期間必須關閉CPU全局中斷,禁止外設中斷響應,不然取中斷向量和運行中斷ISR都會訪問Flash。要使能中斷,就必須將中斷向量表偏移到RAM或者NVM block(EEPROM/D-Flash)並將響應的中斷ISR也拷貝到其餘RAM或者NVM block上(固然該中斷向量表也必須更新指導新的中斷ISR);

  e、因爲以上b的要求,一般須要將bootloader的NVM驅動拷貝到MCU的RAM中運行,其能夠將其完成的NVM拷貝到RAM中運行,也能夠只拷貝NVM command launch到等待command完成的幾條指令到RAM執行便可,由於NVM驅動中其餘操做(好比填寫NVM操做命令、寫入編程地址和數據等)並不會往佔用數據總線上往NVM中寫入數據;

  f、NVM的驅動程序駐留在Flash中,若是出現堆棧溢出等意外程序跑飛意外運行NVM驅動程序則會形成NVM內容意外擦除丟失或者修改的狀況。所以須要對關鍵數據或代碼(好比bootloader自己)進行保護以防止意外修改,或者更爲安全的方法是不將NVM驅動程序存放在NVM中,而是在bootloader最開始經過上位機將其下載到RAM中運行,bootloader結束後將該區域RAM清除,從而避免因爲意外運行NVM驅動程序形成的NVM數據丟失和修改。(PS:後續我會專門寫一篇文章介紹相關的方法,盡請關注閱讀)

  g、通常MCU廠商都會給出其MCU的NVM驅動庫,用戶可使用該類庫實現NVM操做,若是是Freescale/NXP的汽車級MCU,還可使用CodeWarrior IDE集成的Processor Expert生成相應的NVM驅動程序;

5、bootloader開發的其餘要點

  a、bootloader與應用程序的關係

  bootloader和應用程序分別是兩個完整的MCU軟件工程,各自都由本身的啓動代碼、main()函數、連接文件、外設驅動程序和中斷向量表;

  

所以bootloader和應用程序的連接文件中,對NVM的地址空間分配必須分開獨立,不能重疊(overlap),但其RAM分配沒有約束,二者均可以使用整個RAM空間,由於跳轉到應用工程後,

將啓動代碼將從新初始化RAM;

  bootloader必須使用MCU默認的中斷向量表,由於每次復位後MCU都是從其默認中斷向量表的復位向量取地址執行的;應用程序的中斷向量必須進行偏移(經過相應的中斷向量偏移寄存器,如S12(X)系列MCU的IVBR寄存器或者ARM Cortex M系列MCU的SCB-》VTOR寄存器);而NVM(P-Flash)的擦除都是按照sector進行的,因此爲了充分利用NVM(P-Flash)空間,都將bootloader分區到包含默認中斷向量表的若干NVM(P-Flash)sector(S12(X)系列MCU的NVM最後若干sector, ARM Cortex M系列MCU從0地址開始的若干sector);

  Tips:

  若是應用程序新過程當中斷電或者意外復位,則應用程序更新失敗,相應的應用程序完整性校驗通不過,固然得從新下載,爲了不這種狀況下應用程序丟失,經常BootLoader須要對應用程序進行雙備份,即便用兩個不一樣的NVM分區來保存應用程序,只有新的應用程序更新成功以後,才擦除老的應用程序,不然下次復位以後仍是運行老的應用程序

  b、bootloader到應用程序的跳轉方法

  開發使用bootloader後,每次ECU復位以後都將首先運行bootloader,若無遠程應用程序下載請求則直接跳轉到應用程序復位函數地址,這裏面有兩個問題須要考慮:

  如何得到應用程序復位函數地址:方法有:1)經過連接文件固定應用程序的復位啓動函數地址;2)從應用程序中斷向量表的復位向量地址獲取;推薦方法2):由於其靈活性好,每次應用程序變化後無需關心應用程序復位函數被編譯到了NVM的具體地址,只須要將應用程序中斷向量表中的復位向量取出運行便可:

  典型方法以下(假設S12(X)系列MCU的應用程序中斷向量表基地址寄存器IVBR=0x7F):

  typedef void (*near tIsrFunc)(void);/* ISR prototype definition */

  word *Ptr; /*pointer used for ISR vector fecth*/

  Ptr = (word *)0x7FFE; /*get the ISR vector from the interrupt vector table of APP project */

  ((tIsrFunc)(*Ptr))(); /*covert and run*/

  跳轉時機:方法有:1)bootloader更新完應用程序並校驗其完整性OK以後,將用到的外設(好比CAN/LIN通訊總線模塊、定時器、GPIO等)寄存器恢復到復位後的默認狀態,而後直接跳轉;bootloader更新完應用程序並校驗其完整性OK以後,等待看門狗定時器超時溢出復位,在bootloader最開始判斷無遠程應用程序下載請求而跳轉;推薦使用方法2):由於方法1)相對於軟件復位,其跳轉至應用程序復位啓動函數時MCU的硬件環境與直接運行應用程序可能存在差別,而方法2)的看門狗復位則屬於硬件復位,其會將絕大部分外設(模擬、時鐘和外設)電路復位,更接近直接運行應用程序的狀況。

  

  c、開發bootloader須要掌握的知識和調試方法技巧

  首先,開發bootloader須要對ECU所用的MCU的RAM和NVM資源十分清楚,而後對其進行分區,保證應用程序和bootloader的NVM分配沒有重疊。因此必須瞭解所用軟件開發工具IDE的連接文件的使用方法和編寫規則;

  而後,須要判斷中斷向量表偏移是否成功,NVM驅動拷貝的地址和大小等信息,因此必須掌握所用軟件開發工具IDE的編譯連接結果中map文件的具體信息;

  此外,掌握如何將NVM函數重定向(將函數程序代碼的存儲地址和運行時地址分開)到RAM中執行的方法也十分有用;

  Tips:

  在開發應用程序時,須要先對其進行單獨調試以保證其功能正常,這時雖然其外設中斷向量表已經進行了偏移,但其復位向量必須的放置在默認中斷向量表中復位向量所在的地址,不然下載後沒法運行,進行正常調試,由於若是把應用程序的復位向量放在偏移後的應用程序中斷向量表中,則默認的復位向量內容爲0xFFFF(Flash擦除後的狀態),CPU內核就會到0xFFFF的地址取指運行,顯然不是真實的工程啓動函數,因此沒法運行,其結果跟一個新MCU未寫入任何程序時上電運行的狀況同樣,會不斷的出現非法地址復位;而在應用程序開發完成後,再將其偏移到應用程序中斷向量中,以免與bootloader工程的Flash地址衝突;

  最後,掌握利用調試器的Hotsync或者attach方法加載elf文件中的調試信息對bootloader和應用程序進行無縫調試也是很是實用的,能夠大大提升bootloader的調試效率;

  d、量產時bootloader和應用程序的下載方法

  推薦將bootloader和應用程序編譯連接生成的編程文件進行合併,一次性使用量產工具(如Cyclone編程器)下載以提升生產效率。

 

引用地址:http://www.eeworld.com.cn/qcdz/article_2018042322465_2.html
相關文章
相關標籤/搜索