嵌入式系統(tǒng)BootLoader設(shè)計分析
時間:2022-10-20 09:46:58
導(dǎo)語:嵌入式系統(tǒng)BootLoader設(shè)計分析一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
摘要:IAP技術(shù)為嵌入式產(chǎn)品的程序燒寫提供了一種很好的實(shí)現(xiàn)方式,適合各種復(fù)雜的應(yīng)用工況。針對IAP,本文提出了一種基于Ethernet的嵌入式系統(tǒng)bootloader設(shè)計方案,重點(diǎn)闡述了方案中涉及到的幾個關(guān)鍵技術(shù)點(diǎn),例如中斷向量表重定位、LwIP協(xié)議棧應(yīng)用等。
關(guān)鍵詞:IAP;BootLoader;中斷向量表;LwIP
隨著信息化、智能化、網(wǎng)絡(luò)化的發(fā)展,嵌入式系統(tǒng)技術(shù)已經(jīng)深入到我們生產(chǎn)、生活中,應(yīng)用廣泛。在嵌入式產(chǎn)品開發(fā)及應(yīng)用中,程序燒寫技術(shù)是必備技術(shù)之一,在有些應(yīng)用場合中甚至至關(guān)重要。目前,嵌入式微控制器(MCU)程序燒寫方式主要有以下三種:①ICP:通過仿真器連接MCU調(diào)試端口對MCU進(jìn)行程序燒寫;②ISP:通過MCU廠商預(yù)置的BootLoader程序引導(dǎo)燒寫;③IAP:針對MCU對外通信接口(例如UART、Eth-ernet等),用戶自行設(shè)計代碼實(shí)現(xiàn)BootLoader功能,對正在應(yīng)用的MCU進(jìn)行程序燒寫。無論是ICP還是ISP技術(shù),都需要一些涉及嵌入式產(chǎn)品內(nèi)部的機(jī)械性操作,若產(chǎn)品的電路已經(jīng)被外殼封裝,要利用ICP或ISP對產(chǎn)品進(jìn)行程序更新勢必極為不便,某些特定應(yīng)用場合甚至無法實(shí)現(xiàn)。但若應(yīng)用IAP技術(shù),通過預(yù)留的外部通信端口可方便實(shí)現(xiàn)程序更新,甚至可以實(shí)現(xiàn)遠(yuǎn)程或無線更新,極大降低了維護(hù)成本。針對IAP技術(shù),本文提出了一種基于Ethernet的嵌入式系統(tǒng)BootLoader設(shè)計方案。
1IAP原理
IAP是MCU通過運(yùn)行用戶自己編寫的引導(dǎo)程序完成對用戶FLASH指定區(qū)域的程序燒寫,可實(shí)現(xiàn)嵌入式產(chǎn)品后通過預(yù)留的通信接口對固件進(jìn)行升級。IAP功能涉及兩段用戶編寫的代碼:第一段為引導(dǎo)程序(即BootLoader),實(shí)現(xiàn)對用戶APP程序的更新;第二段為用戶APP程序,即產(chǎn)品真正的功能代碼。這兩段代碼同時燒寫在用戶FLASH中,當(dāng)MCU上電復(fù)位后,首先執(zhí)行BootLoader代碼,一般執(zhí)行步驟如下:①檢查是否需要對用戶APP進(jìn)行更新;②若不需要更新,則直接執(zhí)行步驟④;③若需要更新,則執(zhí)行更新操作;④跳轉(zhuǎn)至用戶APP并復(fù)位執(zhí)行。
2關(guān)鍵技術(shù)點(diǎn)
現(xiàn)以IAP技術(shù)在STM32Fxxx系列[1]MCU應(yīng)用為例,重點(diǎn)闡述基于Ethernet的嵌入式系統(tǒng)BootLoader設(shè)計過程中的幾個關(guān)鍵技術(shù)點(diǎn)。
2.1MCU配置
現(xiàn)以CortexM3/M4內(nèi)核的MCU(用戶FLASH分配參考第2.1.1節(jié))為例,講一講IAP技術(shù)中的中斷向量表重定位,通過配置向量表偏移量寄存器VTOR來實(shí)現(xiàn)。正常地,MCU啟動模式會選擇從用戶FLASH處啟動(由BOOT0/BOOT1引腳實(shí)現(xiàn)配置),用戶FLASH空間會被重映射到0x00000000處,VTOR的具體配置過程如下(見圖2):①上電復(fù)位后,MCU默認(rèn)從0x00000000地址處取程序中斷向量表(復(fù)位向量),此時MCU取到的是Boot-Loader程序中斷向量表并開始執(zhí)行復(fù)位中斷程序,其中將VTOR寄存器設(shè)置為0x08000000(默認(rèn)值),即中斷向量表被重定位于0x08000000處;②程序更新操作執(zhí)行完成后,BootLoader程序從0x08010000處(用戶APP程序起始地址)取中斷向量表(復(fù)位向量),這里不建議修改復(fù)位中斷程序中VTOR默認(rèn)值,可在跳轉(zhuǎn)到用戶APP程序主函數(shù)后立即修改VTOR值為0x08010000。
2.2以太網(wǎng)實(shí)現(xiàn)
在本方案中,以太網(wǎng)通信是關(guān)鍵技術(shù)之一,而LwIP協(xié)議棧是以太網(wǎng)通信設(shè)計的最大難點(diǎn),本文重點(diǎn)講述一下LwIP的應(yīng)用經(jīng)驗(yàn)。2.2.1LwIP是什么LwIP[2-3]是一個輕量化的TCP/IP,是瑞典計算機(jī)科學(xué)院的AdamDunkels開發(fā)的一個小型開源TCP/IP協(xié)議棧。LwIP的設(shè)計初衷就是用少量的資源消耗實(shí)現(xiàn)一個完整的TCP/IP協(xié)議棧,非常適合嵌入式產(chǎn)品的以太網(wǎng)應(yīng)用。2.2.2LwIP的應(yīng)用LwIP是一種數(shù)據(jù)通信機(jī)制,本質(zhì)上就是對數(shù)據(jù)進(jìn)行處理。了解LwIP協(xié)議棧數(shù)據(jù)管理機(jī)制以及如何實(shí)現(xiàn)與外部的數(shù)據(jù)交互,是嵌入式開發(fā)者掌握LwIP應(yīng)用的最合適切入點(diǎn)。(1)LwIP內(nèi)存管理及數(shù)據(jù)緩沖眾所周知,網(wǎng)絡(luò)數(shù)據(jù)量是非常大的,而作為一個針對嵌入式應(yīng)用的TCP/IP協(xié)議棧,LwIP的內(nèi)存管理策略及數(shù)據(jù)緩沖機(jī)制顯得非常重要。在LwIP中,內(nèi)存分配策略有動態(tài)內(nèi)存堆(HEAP)分配及動態(tài)內(nèi)存池(POOL)分配,兩種分配策略混合使用,提高了內(nèi)存使用效率。至于如何合理使用上述兩種分配策略,具體就涉及到LwIP數(shù)據(jù)包的緩沖機(jī)制。LwIP采用統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)體pbuf來描述數(shù)據(jù)包,協(xié)議棧各層之間的數(shù)據(jù)共享避免了數(shù)據(jù)包在傳輸過程中的層層復(fù)制以提高數(shù)據(jù)處理效率(TCP/IP分層模型:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、網(wǎng)絡(luò)接口層,LwIP未遵循嚴(yán)格的TCP/IP分層機(jī)制)。針對種類繁多的以太網(wǎng)數(shù)據(jù)包,LwIP提供了4種類型的pbuf:①PBUF_RAM類型:通過內(nèi)存堆分配得到,協(xié)議棧中應(yīng)用的最多,要發(fā)送的數(shù)據(jù)和應(yīng)用程序要傳送的數(shù)據(jù)一般采用此類型。②PBUF_POOL類型:通過內(nèi)存池分配得到,由于分配時間短,網(wǎng)卡接收數(shù)據(jù)時,LwIP一般使用這種類型的pbuf存儲接收到的數(shù)據(jù)。③PBUF_ROM類型:通過內(nèi)存池分配得到,分配的空間不含數(shù)據(jù)區(qū)域,數(shù)據(jù)存放于非協(xié)議棧內(nèi)存的ROM空間。此類型的pbuf用于應(yīng)用程序要發(fā)送的數(shù)據(jù)放置在應(yīng)用程序管理的ROM區(qū)域,可降低協(xié)議棧內(nèi)存空間的消耗。④PBUF_REF類型:通過內(nèi)存池分配得到,與PBUF_ROM類型的pbuf類似,區(qū)別為數(shù)據(jù)存放于非協(xié)議棧內(nèi)存的RAM空間。特別說明,對于一個數(shù)據(jù)包,它可能使用任意類型的pbuf進(jìn)行描述,也可能使用多種不同的pbuf一起描述。(2)網(wǎng)卡協(xié)議棧網(wǎng)絡(luò)數(shù)據(jù)是在網(wǎng)卡(即網(wǎng)絡(luò)接口)進(jìn)入?yún)f(xié)議棧網(wǎng)絡(luò)接口層,反之亦然。網(wǎng)絡(luò)接口層提供的不是具體協(xié)議,而是一種網(wǎng)絡(luò)接口規(guī)范。在LwIP中,采用數(shù)據(jù)結(jié)構(gòu)體netif來描述網(wǎng)絡(luò)接口,結(jié)構(gòu)體中定義了網(wǎng)卡IP地址、網(wǎng)絡(luò)接口輸入/輸出函數(shù)聲明、MAC地址、網(wǎng)卡名稱等。由于netif是LwIP抽象出來的網(wǎng)絡(luò)接口,用戶還須自己提供網(wǎng)卡底層接口函數(shù),ethernetif.c文件即為LwIP提供的底層接口驅(qū)動模板,用戶編寫網(wǎng)卡驅(qū)動時參照模板修改即可。當(dāng)有數(shù)據(jù)需要交互時,LwIP調(diào)用網(wǎng)卡底層接口函數(shù)即可。(3)協(xié)議棧應(yīng)用程序一般地,網(wǎng)絡(luò)數(shù)據(jù)經(jīng)協(xié)議棧層層處理之后,在傳輸層或者應(yīng)用層將數(shù)據(jù)交給應(yīng)用程序,區(qū)別在于,傳輸層給出的是二進(jìn)制數(shù)據(jù)流,應(yīng)用層將傳輸層給出的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成特定數(shù)據(jù)格式;反之亦然。本方案選擇采用傳輸層協(xié)議UDP實(shí)現(xiàn)BootLoader功能,程序結(jié)構(gòu)簡單、數(shù)據(jù)傳輸高效。同時,針對LwIP協(xié)議棧提供的RAWAPI、NetconnAPI、SocketAPI三種編程接口,本方案也選擇執(zhí)行效率高的RAWAPI編程接口實(shí)現(xiàn)以太網(wǎng)UDP通信,以下是相關(guān)的應(yīng)用經(jīng)驗(yàn)。首先,RAWAPI是內(nèi)核回調(diào)型API,如果LwIP收到了一個數(shù)據(jù)包,會立即調(diào)用一個注冊在LwIP內(nèi)核中的數(shù)據(jù)處理函數(shù)進(jìn)行數(shù)據(jù)處理,這個函數(shù)稱為回調(diào)函數(shù)?;卣{(diào)函數(shù)中有你想要的業(yè)務(wù)邏輯,可以自由處理接收到的數(shù)據(jù),也可以發(fā)送任何數(shù)據(jù)。在本方案中,回調(diào)函數(shù)根據(jù)自定義的應(yīng)用協(xié)議解析來自上位機(jī)的用戶APP程序二進(jìn)制代碼,然后將其直接寫入指定的FLASH區(qū)域。其次,利用RAWAPI提供的功能函數(shù)建立UDP連接及數(shù)據(jù)交互,主要功能函數(shù)包括udp_new、udp_bind、udp_recv、udp_connect、udp_send等。這里需著重提一下其中的3個函數(shù):①udp_new用于創(chuàng)建UDP控制塊udppcb,記錄本地/遠(yuǎn)程端口號、本地/遠(yuǎn)程IP地址、回調(diào)函數(shù)等UDP通信相關(guān)信息;②udp_bind用于綁定本地IP和端口號,即為UDP連接綁定特定網(wǎng)絡(luò)接口和應(yīng)用/進(jìn)程;③udp_connect用于綁定遠(yuǎn)程IP和端口號,以建立UDP通信的一對一連接,這樣可以提高UDP通信的穩(wěn)定性和效率。如果確實(shí)存在多個客戶端,也可以在服務(wù)器端創(chuàng)建多個UDP控制塊udppcb以實(shí)現(xiàn)與多個客戶端間的通信。
3軟件流程圖
在本方案中,軟件設(shè)計的核心是以太網(wǎng)數(shù)據(jù)包的收發(fā):①首先,軟件升級包幀頭的接收包含升級包包長、版本號、更新時間等信息,解析之后向上位機(jī)發(fā)出應(yīng)答幀。②之后,升級包的接收與處理,升級包按500字節(jié)進(jìn)行分包,單包的前面增加2個字節(jié)存放包序號。判斷升級包序號是否正確,若正確,則直接將數(shù)據(jù)幀內(nèi)容依次寫入用戶FLASH指定區(qū)域(如果系統(tǒng)RAM空間足夠大,可以先將升級數(shù)據(jù)緩存一下,確保FLASH內(nèi)原有程序遭到破壞);反之,則申請重發(fā)。③最后,升級包長校驗(yàn),若正確反饋升級成功,則等待復(fù)位命令,反之則申請重新操作。BootLoader軟件流程圖如圖3和圖4所示。
4IAP升級測試
本方案中,BootLoader設(shè)計需求源于基于以太網(wǎng)構(gòu)建的工業(yè)控制局域網(wǎng)中的嵌入式控制產(chǎn)品固件升級,將安裝有配套開發(fā)的固件升級上位機(jī)的計算機(jī)連接產(chǎn)品自身預(yù)留的以太網(wǎng)口或者局域網(wǎng)交換機(jī)公共端口,通過上位機(jī)操作即可實(shí)現(xiàn)嵌入式產(chǎn)品固件升級。經(jīng)實(shí)驗(yàn)室/現(xiàn)場測試,本方案設(shè)計的BootLoader功能正常,符合產(chǎn)品設(shè)計需求,固件升級上位機(jī)界面如圖5所示。
5結(jié)語
本文是IAP技術(shù)的一個簡單應(yīng)用,完成了基于以太網(wǎng)的嵌入式系統(tǒng)BootLoader設(shè)計,可實(shí)現(xiàn)局域網(wǎng)內(nèi)的嵌入式產(chǎn)品固件升級,而真正能體現(xiàn)以太網(wǎng)+I(xiàn)AP技術(shù)給嵌入式產(chǎn)品帶來巨大便捷的應(yīng)用為遠(yuǎn)程在線升級或無線升級,這些技術(shù)對嵌入式系統(tǒng)固件更新或者現(xiàn)場維護(hù)具有一定的實(shí)用價值。
參考文獻(xiàn)
[1]孟博宇.STM32自學(xué)筆記[M].北京:北京航空航天大學(xué)出版社,2011:134.
[2]劉火良,楊森.LwIP應(yīng)用開發(fā)實(shí)戰(zhàn)指南:基于STM32[M].北京:機(jī)械工業(yè)出版社,2019.
[3]AdamDunkels.DesignandImplementationoftheLwIPTCP/IPStack[J].SwedishInstitudeofComputerScience,2001,20(2).
作者:黃鈺強(qiáng) 岳偉 單位:中車株洲電力機(jī)車有限公司