姜曉道,趙紫君
(華東光電集成器件研究所,安徽蚌埠,233000)
在產(chǎn)品開發(fā)過程中,對微處理器的調(diào)試通常使用專用的仿真調(diào)試工具,如ARM系列芯片通常使用J-Link,DSP芯片使用XDS工具,這都需要將調(diào)試工具通過線纜連接到產(chǎn)品單板上,通過JTAG接口對微處理器進行仿真和程序下載[1]。此種調(diào)試方法在開發(fā)階段非常適合于軟件工程師調(diào)試產(chǎn)品,然而當軟硬件定型且產(chǎn)品大批量生產(chǎn)之后,這種程序更新方法就顯得效率低下,每次產(chǎn)品升級都需要維保人員現(xiàn)場更新程序,會導致企業(yè)維護成本增加。另外,一個企業(yè)的產(chǎn)品往往多種多樣,特別是目前芯片壟斷的大背景下,各個廠家都在尋求國產(chǎn)化替代方案,不同產(chǎn)品應用的微處理器可能多種多樣。針對上述產(chǎn)品開發(fā)背景,本文提出了一種新型的在線升級方案,基于在線應用編程技術原理,設計一個獨立的引導加載軟件,可利用產(chǎn)品的現(xiàn)有通信端口,對產(chǎn)品的軟件程序進行更新。此方案不僅能夠?qū)崿F(xiàn)程序代碼的在線更新,還能做到在不同型號微處理器之間進行快捷移植,實現(xiàn)跨平臺應用。
IAP(In Application Programming)即在線應用編程,指的是用戶自己設計的程序在運行過程中可實現(xiàn)對芯片應用程序部分的Flash區(qū)域的擦除和燒寫[2]。在后續(xù)維護升級時,尤其是產(chǎn)品發(fā)布后,IAP可復用現(xiàn)有的通信端口對產(chǎn)品的應用程序進行更新,實現(xiàn)產(chǎn)品軟件版本的升級。因為IAP僅僅使用產(chǎn)品的一組通信接口,所以IAP從技術理論上可實現(xiàn)產(chǎn)品的不拆封調(diào)試和遠程調(diào)試。
在一款芯片中應用IAP技術中可以實現(xiàn)程序A對程序B的在線更新,意味著芯片存儲程序的Flash至少需要映射為兩個存儲單元[3],分別存儲程序A和B。程序A命名為引導加載(Bootloader)軟件,程序B命名為應用程序(Application)軟件。Bootloader軟件主要實現(xiàn)的功能:
(1)判斷程序執(zhí)行在線升級功能還是跳轉(zhuǎn)應用程序執(zhí)行;(2)通過某種通信方式(USB、CAN、UART、SPI、MODBUS等)接收上位機發(fā)送的數(shù)據(jù);(3)擦除“應用程序”區(qū)的Flash并將接收到的數(shù)據(jù)寫入“應用程序”區(qū)Flash;(4)從引導加載軟件跳轉(zhuǎn)到應用程序處并執(zhí)行。
Bootloader軟件必須在出廠前通過JTAG或ISP等方式燒寫到芯片中,并且每臺產(chǎn)品的bootloader軟件僅需在出廠時燒寫一次即可,后續(xù)應用程序則可以由Bootloader軟件進行燒寫和更新。
一個完整的產(chǎn)品bootloader功能需要包含的軟件有三部分:bootloader軟件、PC上位機軟件和應用程序軟件。Bootloader軟件和應用程序軟件使用C語言編程,非常方便移植和后續(xù)升級;PC上位機軟件采用當前主流的C#語言編程,實現(xiàn)指令下發(fā)和通信數(shù)據(jù)幀的顯示。
本次Bootloader軟件設計背景是基于STM32F407芯片的電機控制器,產(chǎn)品默認配置啟動方式為從內(nèi)部Flash啟動,產(chǎn)品本身設有的RS232接口,Bootloader軟件可復用RS232端口實現(xiàn)在線升級功能。
對于bootloader軟件,要求上電后立即進入boot區(qū)域執(zhí)行,即系統(tǒng)上電復位后,bootloader軟件從地址為0x8000000處執(zhí)行,因此Flash起始地址需設置為0x0800000。根據(jù)對bootloader軟件的規(guī)劃和對應用程序大小的分析評估,應用程序規(guī)模不超過400K字節(jié)大小,所以bootloader軟件所占用flash大小設置為16K字節(jié),即flash地址從0x8000000處開始,前16k字節(jié)存儲bootloader軟件,其余496K字節(jié)全部作為應用程序存儲使用,如圖1所示。
圖1 Flash內(nèi)部區(qū)域劃分示意圖
STM32F407芯片編程使用的工具為Keil,F(xiàn)lash區(qū)域劃分方法如下:
(1)keil軟件“魔術棒工具”菜單下“Target”頁面中起始地址設置為0x8000000,大小設置為0x3E80。
(2)修改工程文件中的SCT文件,將SCT文件中起始地址和程序大小設置為0x0800000和0x3E80。
Bootloader在線燒錄系統(tǒng)包含上位機控制端軟件和嵌入式終端設備兩部分,上位機控制軟件主要功能是將編譯器編譯完成的應用程序燒寫文件進行處理打包,然后發(fā)送至嵌入式設備,嵌入式設備接收后更新應用程序區(qū)的Flash,F(xiàn)lash更新完成后,嵌入式設備給上位機發(fā)送結(jié)束幀命令,并將寫入Flash的數(shù)據(jù)校驗碼返回給上位機,上位機收到校驗碼并校驗無誤后,結(jié)束與嵌入式設備的通信[4]。上位機軟件運行流程如圖2所示。
圖2 上位機軟件運行流程示意圖
要實現(xiàn)在線加載功能,最關鍵部分為bootloader軟件的引導加載設計。對引導加載軟件的功能進行分析,將引導加載軟件整個執(zhí)行過程分為三大狀態(tài):升級態(tài)、跳轉(zhuǎn)態(tài)和空閑態(tài)。三種狀態(tài)的轉(zhuǎn)換條件如圖3所示。
圖3 Bootloader軟件狀態(tài)遷移圖
其中“空閑態(tài)”為系統(tǒng)上電時的狀態(tài),此時bootl oader軟件處于待命狀態(tài),接收上位機的指令?!吧墤B(tài)”主要完成對應用程序區(qū)flash擦除和燒寫任務,并重新讀取應用程序區(qū)Flash數(shù)據(jù),計算出校驗值?!疤D(zhuǎn)態(tài)”需要完成任務是完成bootloader到應用程序軟件的跳轉(zhuǎn)。通過對bootloader軟件功能的分析,由升級態(tài)到空閑態(tài),跳轉(zhuǎn)態(tài)到空閑態(tài),跳轉(zhuǎn)態(tài)到升級態(tài)三種狀態(tài)轉(zhuǎn)換不適應bootloader軟件。最終只保留空閑態(tài)轉(zhuǎn)升級態(tài),空閑態(tài)轉(zhuǎn)跳轉(zhuǎn)態(tài),升級態(tài)轉(zhuǎn)跳轉(zhuǎn)態(tài)三種狀態(tài)轉(zhuǎn)換。三種狀態(tài)轉(zhuǎn)換的條件如下:
條件①:(1)上位機軟件與Bootloader軟件握手成功;(2)Bootloader 軟件接收到正確的升級命令。
條件②:(1)Bootloader軟件接收到的幀校驗與從應用程序Flash中讀取到的數(shù)據(jù)計算出的校驗碼一致;(2)Bootloader軟件接收到上位機發(fā)送的幀結(jié)束命令。
條件③:Bootloader軟件運行后,五秒內(nèi)沒有收到上位機發(fā)送的握手指令。
STM32F407內(nèi)部劃分為兩個區(qū)域,如圖4所示。
圖4 在線燒錄功能系統(tǒng)中斷向量表
STM32的Flash的兩個存儲區(qū)分別存儲兩個獨立的程序,同時也包含兩個中斷向量表。程序從起始地址0x08000000處開始運行,運行至地址0x08000004處時取此地址的復位中斷向量,然后跳轉(zhuǎn)到對應的中斷服務函數(shù)中,中斷服務函數(shù)運行結(jié)束后,跳轉(zhuǎn)到bootloader軟件的main函數(shù)中執(zhí)行。當Bootloader軟件對應用程序區(qū)Flash的擦除和燒寫任務執(zhí)行完成后,跳轉(zhuǎn)到應用程序區(qū)的復位中斷向量(應用程序的起始地址)處執(zhí)行,從復位中斷向量中取出新程序的復位中斷向量地址,然后跳轉(zhuǎn)到新程序的中斷服務函數(shù)開始執(zhí)行,執(zhí)行完中斷服務函數(shù)后跳轉(zhuǎn)到應用程序區(qū)的main函數(shù)中執(zhí)行。
由于STM32芯片硬件的設計,在main函數(shù)執(zhí)行過程中,若CPU得到一個中斷請求,系統(tǒng)的PC指針仍然會跳轉(zhuǎn)至地址為0x08000004的中斷向量表處,而非應用程序中新的中斷向量表處。因此應用程序中所有的中斷向量地址都需要根據(jù)Flash區(qū)域的劃分而相應的調(diào)整,本系統(tǒng)中應用程序中斷向量表的偏移地址為bootloader軟件占用的Flash大小,即應用程序中斷向量表偏移量需設置為0x3E80。在工程文件中全局搜索:
SCB->VTOR=FLASH_BASE|VECT_TAB_OFFSET
“VECT_TAB_OFFSET”宏定義中定義的是系統(tǒng)的中斷偏移量,將其設置為0x3E80即可完成應用程序中斷向量偏移量的設置。
為了實現(xiàn)bootloader軟件在不同平臺之間的通用性,從通信協(xié)議上制定一套完整的與上位機主機的交互協(xié)議[5]。上位機向bootloader發(fā)送數(shù)據(jù)幀的協(xié)議格式如表1所示。
表1 bootloader軟件接收協(xié)議格式
其中,數(shù)據(jù)類型Type有3種指令格式格式,如表2所示。
表2 數(shù)據(jù)類型(Type)格式定義
Bootloader解析上位機指令幀后,返回給上位機應答幀格式如表3所示。
表3 bootloader軟件通信發(fā)送協(xié)議格式
上位機與bootloader之間的通信協(xié)議嚴格按照上述協(xié)議格式要求執(zhí)行,不區(qū)分通信方式。
根據(jù)對bootloader軟件需求的分析,軟件主要需要實現(xiàn)的模塊功能有:
(1)RS232通信;(2)Flash讀寫;(3)Flash絕對地址跳轉(zhuǎn)。
上述功能模塊采用前后臺設計框架即可實現(xiàn)所有功能,因此無需使用實時操作系統(tǒng),故bootloader軟件采用前后臺設計框架,即主函數(shù)循環(huán)執(zhí)行為后臺,中斷服務函數(shù)為前臺。bootloader軟件設計原則為分層架構(gòu),即單向逐層調(diào)用,針對接口編程。從上到下分為3層,如圖5所示。
圖5 軟件架構(gòu)分層示意圖
硬件驅(qū)動層:包括MCU片內(nèi)資源驅(qū)動代碼與外部各類IC的底層驅(qū)動代碼,MCU片內(nèi)驅(qū)動代碼與IC驅(qū)動代碼最好也能各自保持獨立。向上提供API接口。
模塊功能層:隔離頂層與底層,實現(xiàn)與提供頂層所需的API接口。
業(yè)務邏輯層:具體業(yè)務邏輯代碼,也可以說是應用層。
2.6.1 RS232通信
Bootloader軟件與嵌入式設備采用RS232通信,通信收發(fā)和解析為前臺中斷收發(fā),后臺循環(huán)解析的方式,中斷將上位機軟件下發(fā)的數(shù)據(jù)幀全部接收,在主循環(huán)中尋找軟件通信幀中幀頭字節(jié),幀頭字節(jié)確認后,按照字節(jié)尋址解析數(shù)據(jù)內(nèi)容。待所有的數(shù)據(jù)幀解析完成后,存放于數(shù)據(jù)緩存數(shù)組中等待Flash讀寫使用。
Flash讀寫模塊按照數(shù)據(jù)幀中的flash地址將數(shù)據(jù)寫入flash后,需要對寫入的Flash數(shù)據(jù)進行校驗,然后按照bootloader軟件通信發(fā)送協(xié)議將寫入flash的結(jié)果進行回傳。等待上位機所有的數(shù)據(jù)幀都下發(fā)完成后,bootloader軟件將寫入flash地址的所有數(shù)據(jù)進行總校驗,并將校驗結(jié)果回傳至上位機軟件。若bootloader軟件的校驗和與上位機軟件下發(fā)的校驗和一致,bootloader自動執(zhí)行跳轉(zhuǎn)函數(shù),跳轉(zhuǎn)至應用軟件區(qū)域執(zhí)行。若bootloader對flash的總校驗和與app下發(fā)的總校驗和不一致,則bootloader軟件將校驗異常結(jié)果回傳,提示操作者應用軟件更新失敗,操作者可重新推送應用軟件進行更新。
2.6.2 Flash讀寫
根據(jù)bootloader軟件需求分析,STM32的Flash讀寫功能主要包含flash塊擦除、讀指定地址長度數(shù)據(jù)功能。因此調(diào)用ST官方庫函數(shù)即可實現(xiàn)Flash讀寫的全部功能。
2.6.3 跳轉(zhuǎn)函數(shù)實現(xiàn)
Bootloader軟件對應用程序區(qū)Flash擦除和燒寫完成并且校驗無誤之后,即執(zhí)行Flash跳轉(zhuǎn),從bootloader區(qū)跳轉(zhuǎn)至應用程序區(qū)執(zhí)行,跳轉(zhuǎn)函數(shù)設計思路如下:
(1)檢查棧頂?shù)刂肥欠窈戏ǎ?2)初始化棧頂指針;(3)跳轉(zhuǎn)到指定地址執(zhí)行。
跳轉(zhuǎn)函數(shù)代碼實現(xiàn)如下:
void PhyIAP_Loadapp(u32 ulAppAddr)
{
if(((*(vu32*) ulAppAddr)&0x2FFE0000)==0x20000000)
{
vJumpApp =(vIapFunc)*(vu32*)(ulAppAddr +4);
_MSP(*(vu32*) ulAppAddr);
vJumpApp();
}
}
將Bootloader軟件通過J-Link燒寫到電機控制器中,電機控制器通過USB-232轉(zhuǎn)換器連接電腦,設置上位機波特率為115200,上位機加載應用程序的燒錄文件并校驗無誤后自動開始燒寫。應用軟件燒錄文件為bin文件,大小為482K字節(jié),通過理論計算,每幀傳輸數(shù)據(jù)個數(shù)為16字節(jié),共需約30125幀字節(jié)傳輸整個燒錄文件,每幀數(shù)據(jù)結(jié)合幀頭幀尾等指令字后,結(jié)合波特率計算,理論燒寫時間約為59s。實際測試,bootloader加載482K字節(jié)的燒寫文件實際花費時間為62s,符合設計要求。
基于IAP技術的通用嵌入式系統(tǒng)在線升級軟件,可在復雜工況條件下對設備產(chǎn)品進行維護升級,其操作僅需一臺電腦就可實現(xiàn),大大提高了產(chǎn)品維保升級的效率,同時軟件設計時兼顧的可移植性,可在不同產(chǎn)品平臺進行功能移植,也降低了企業(yè)開發(fā)成本。