嵌入式系統(tǒng)BootLoader設計分析

時間:2022-10-20 09:46:58

導語:嵌入式系統(tǒng)BootLoader設計分析一文來源于網(wǎng)友上傳,不代表本站觀點,若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

嵌入式系統(tǒng)BootLoader設計分析

摘要:IAP技術為嵌入式產(chǎn)品的程序燒寫提供了一種很好的實現(xiàn)方式,適合各種復雜的應用工況。針對IAP,本文提出了一種基于Ethernet的嵌入式系統(tǒng)bootloader設計方案,重點闡述了方案中涉及到的幾個關鍵技術點,例如中斷向量表重定位、LwIP協(xié)議棧應用等。

關鍵詞:IAP;BootLoader;中斷向量表;LwIP

隨著信息化、智能化、網(wǎng)絡化的發(fā)展,嵌入式系統(tǒng)技術已經(jīng)深入到我們生產(chǎn)、生活中,應用廣泛。在嵌入式產(chǎn)品開發(fā)及應用中,程序燒寫技術是必備技術之一,在有些應用場合中甚至至關重要。目前,嵌入式微控制器(MCU)程序燒寫方式主要有以下三種:①ICP:通過仿真器連接MCU調試端口對MCU進行程序燒寫;②ISP:通過MCU廠商預置的BootLoader程序引導燒寫;③IAP:針對MCU對外通信接口(例如UART、Eth-ernet等),用戶自行設計代碼實現(xiàn)BootLoader功能,對正在應用的MCU進行程序燒寫。無論是ICP還是ISP技術,都需要一些涉及嵌入式產(chǎn)品內部的機械性操作,若產(chǎn)品的電路已經(jīng)被外殼封裝,要利用ICP或ISP對產(chǎn)品進行程序更新勢必極為不便,某些特定應用場合甚至無法實現(xiàn)。但若應用IAP技術,通過預留的外部通信端口可方便實現(xiàn)程序更新,甚至可以實現(xiàn)遠程或無線更新,極大降低了維護成本。針對IAP技術,本文提出了一種基于Ethernet的嵌入式系統(tǒng)BootLoader設計方案。

1IAP原理

IAP是MCU通過運行用戶自己編寫的引導程序完成對用戶FLASH指定區(qū)域的程序燒寫,可實現(xiàn)嵌入式產(chǎn)品后通過預留的通信接口對固件進行升級。IAP功能涉及兩段用戶編寫的代碼:第一段為引導程序(即BootLoader),實現(xiàn)對用戶APP程序的更新;第二段為用戶APP程序,即產(chǎn)品真正的功能代碼。這兩段代碼同時燒寫在用戶FLASH中,當MCU上電復位后,首先執(zhí)行BootLoader代碼,一般執(zhí)行步驟如下:①檢查是否需要對用戶APP進行更新;②若不需要更新,則直接執(zhí)行步驟④;③若需要更新,則執(zhí)行更新操作;④跳轉至用戶APP并復位執(zhí)行。

2關鍵技術點

現(xiàn)以IAP技術在STM32Fxxx系列[1]MCU應用為例,重點闡述基于Ethernet的嵌入式系統(tǒng)BootLoader設計過程中的幾個關鍵技術點。

2.1MCU配置

現(xiàn)以CortexM3/M4內核的MCU(用戶FLASH分配參考第2.1.1節(jié))為例,講一講IAP技術中的中斷向量表重定位,通過配置向量表偏移量寄存器VTOR來實現(xiàn)。正常地,MCU啟動模式會選擇從用戶FLASH處啟動(由BOOT0/BOOT1引腳實現(xiàn)配置),用戶FLASH空間會被重映射到0x00000000處,VTOR的具體配置過程如下(見圖2):①上電復位后,MCU默認從0x00000000地址處取程序中斷向量表(復位向量),此時MCU取到的是Boot-Loader程序中斷向量表并開始執(zhí)行復位中斷程序,其中將VTOR寄存器設置為0x08000000(默認值),即中斷向量表被重定位于0x08000000處;②程序更新操作執(zhí)行完成后,BootLoader程序從0x08010000處(用戶APP程序起始地址)取中斷向量表(復位向量),這里不建議修改復位中斷程序中VTOR默認值,可在跳轉到用戶APP程序主函數(shù)后立即修改VTOR值為0x08010000。

2.2以太網(wǎng)實現(xiàn)

在本方案中,以太網(wǎng)通信是關鍵技術之一,而LwIP協(xié)議棧是以太網(wǎng)通信設計的最大難點,本文重點講述一下LwIP的應用經(jīng)驗。2.2.1LwIP是什么LwIP[2-3]是一個輕量化的TCP/IP,是瑞典計算機科學院的AdamDunkels開發(fā)的一個小型開源TCP/IP協(xié)議棧。LwIP的設計初衷就是用少量的資源消耗實現(xiàn)一個完整的TCP/IP協(xié)議棧,非常適合嵌入式產(chǎn)品的以太網(wǎng)應用。2.2.2LwIP的應用LwIP是一種數(shù)據(jù)通信機制,本質上就是對數(shù)據(jù)進行處理。了解LwIP協(xié)議棧數(shù)據(jù)管理機制以及如何實現(xiàn)與外部的數(shù)據(jù)交互,是嵌入式開發(fā)者掌握LwIP應用的最合適切入點。(1)LwIP內存管理及數(shù)據(jù)緩沖眾所周知,網(wǎng)絡數(shù)據(jù)量是非常大的,而作為一個針對嵌入式應用的TCP/IP協(xié)議棧,LwIP的內存管理策略及數(shù)據(jù)緩沖機制顯得非常重要。在LwIP中,內存分配策略有動態(tài)內存堆(HEAP)分配及動態(tài)內存池(POOL)分配,兩種分配策略混合使用,提高了內存使用效率。至于如何合理使用上述兩種分配策略,具體就涉及到LwIP數(shù)據(jù)包的緩沖機制。LwIP采用統(tǒng)一的數(shù)據(jù)結構體pbuf來描述數(shù)據(jù)包,協(xié)議棧各層之間的數(shù)據(jù)共享避免了數(shù)據(jù)包在傳輸過程中的層層復制以提高數(shù)據(jù)處理效率(TCP/IP分層模型:應用層、傳輸層、網(wǎng)絡層、網(wǎng)絡接口層,LwIP未遵循嚴格的TCP/IP分層機制)。針對種類繁多的以太網(wǎng)數(shù)據(jù)包,LwIP提供了4種類型的pbuf:①PBUF_RAM類型:通過內存堆分配得到,協(xié)議棧中應用的最多,要發(fā)送的數(shù)據(jù)和應用程序要傳送的數(shù)據(jù)一般采用此類型。②PBUF_POOL類型:通過內存池分配得到,由于分配時間短,網(wǎng)卡接收數(shù)據(jù)時,LwIP一般使用這種類型的pbuf存儲接收到的數(shù)據(jù)。③PBUF_ROM類型:通過內存池分配得到,分配的空間不含數(shù)據(jù)區(qū)域,數(shù)據(jù)存放于非協(xié)議棧內存的ROM空間。此類型的pbuf用于應用程序要發(fā)送的數(shù)據(jù)放置在應用程序管理的ROM區(qū)域,可降低協(xié)議棧內存空間的消耗。④PBUF_REF類型:通過內存池分配得到,與PBUF_ROM類型的pbuf類似,區(qū)別為數(shù)據(jù)存放于非協(xié)議棧內存的RAM空間。特別說明,對于一個數(shù)據(jù)包,它可能使用任意類型的pbuf進行描述,也可能使用多種不同的pbuf一起描述。(2)網(wǎng)卡協(xié)議棧網(wǎng)絡數(shù)據(jù)是在網(wǎng)卡(即網(wǎng)絡接口)進入?yún)f(xié)議棧網(wǎng)絡接口層,反之亦然。網(wǎng)絡接口層提供的不是具體協(xié)議,而是一種網(wǎng)絡接口規(guī)范。在LwIP中,采用數(shù)據(jù)結構體netif來描述網(wǎng)絡接口,結構體中定義了網(wǎng)卡IP地址、網(wǎng)絡接口輸入/輸出函數(shù)聲明、MAC地址、網(wǎng)卡名稱等。由于netif是LwIP抽象出來的網(wǎng)絡接口,用戶還須自己提供網(wǎng)卡底層接口函數(shù),ethernetif.c文件即為LwIP提供的底層接口驅動模板,用戶編寫網(wǎng)卡驅動時參照模板修改即可。當有數(shù)據(jù)需要交互時,LwIP調用網(wǎng)卡底層接口函數(shù)即可。(3)協(xié)議棧應用程序一般地,網(wǎng)絡數(shù)據(jù)經(jīng)協(xié)議棧層層處理之后,在傳輸層或者應用層將數(shù)據(jù)交給應用程序,區(qū)別在于,傳輸層給出的是二進制數(shù)據(jù)流,應用層將傳輸層給出的二進制數(shù)據(jù)轉換成特定數(shù)據(jù)格式;反之亦然。本方案選擇采用傳輸層協(xié)議UDP實現(xiàn)BootLoader功能,程序結構簡單、數(shù)據(jù)傳輸高效。同時,針對LwIP協(xié)議棧提供的RAWAPI、NetconnAPI、SocketAPI三種編程接口,本方案也選擇執(zhí)行效率高的RAWAPI編程接口實現(xiàn)以太網(wǎng)UDP通信,以下是相關的應用經(jīng)驗。首先,RAWAPI是內核回調型API,如果LwIP收到了一個數(shù)據(jù)包,會立即調用一個注冊在LwIP內核中的數(shù)據(jù)處理函數(shù)進行數(shù)據(jù)處理,這個函數(shù)稱為回調函數(shù)。回調函數(shù)中有你想要的業(yè)務邏輯,可以自由處理接收到的數(shù)據(jù),也可以發(fā)送任何數(shù)據(jù)。在本方案中,回調函數(shù)根據(jù)自定義的應用協(xié)議解析來自上位機的用戶APP程序二進制代碼,然后將其直接寫入指定的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,記錄本地/遠程端口號、本地/遠程IP地址、回調函數(shù)等UDP通信相關信息;②udp_bind用于綁定本地IP和端口號,即為UDP連接綁定特定網(wǎng)絡接口和應用/進程;③udp_connect用于綁定遠程IP和端口號,以建立UDP通信的一對一連接,這樣可以提高UDP通信的穩(wěn)定性和效率。如果確實存在多個客戶端,也可以在服務器端創(chuàng)建多個UDP控制塊udppcb以實現(xiàn)與多個客戶端間的通信。

3軟件流程圖

在本方案中,軟件設計的核心是以太網(wǎng)數(shù)據(jù)包的收發(fā):①首先,軟件升級包幀頭的接收包含升級包包長、版本號、更新時間等信息,解析之后向上位機發(fā)出應答幀。②之后,升級包的接收與處理,升級包按500字節(jié)進行分包,單包的前面增加2個字節(jié)存放包序號。判斷升級包序號是否正確,若正確,則直接將數(shù)據(jù)幀內容依次寫入用戶FLASH指定區(qū)域(如果系統(tǒng)RAM空間足夠大,可以先將升級數(shù)據(jù)緩存一下,確保FLASH內原有程序遭到破壞);反之,則申請重發(fā)。③最后,升級包長校驗,若正確反饋升級成功,則等待復位命令,反之則申請重新操作。BootLoader軟件流程圖如圖3和圖4所示。

4IAP升級測試

本方案中,BootLoader設計需求源于基于以太網(wǎng)構建的工業(yè)控制局域網(wǎng)中的嵌入式控制產(chǎn)品固件升級,將安裝有配套開發(fā)的固件升級上位機的計算機連接產(chǎn)品自身預留的以太網(wǎng)口或者局域網(wǎng)交換機公共端口,通過上位機操作即可實現(xiàn)嵌入式產(chǎn)品固件升級。經(jīng)實驗室/現(xiàn)場測試,本方案設計的BootLoader功能正常,符合產(chǎn)品設計需求,固件升級上位機界面如圖5所示。

5結語

本文是IAP技術的一個簡單應用,完成了基于以太網(wǎng)的嵌入式系統(tǒng)BootLoader設計,可實現(xiàn)局域網(wǎng)內的嵌入式產(chǎn)品固件升級,而真正能體現(xiàn)以太網(wǎng)+IAP技術給嵌入式產(chǎn)品帶來巨大便捷的應用為遠程在線升級或無線升級,這些技術對嵌入式系統(tǒng)固件更新或者現(xiàn)場維護具有一定的實用價值。

參考文獻

[1]孟博宇.STM32自學筆記[M].北京:北京航空航天大學出版社,2011:134.

[2]劉火良,楊森.LwIP應用開發(fā)實戰(zhàn)指南:基于STM32[M].北京:機械工業(yè)出版社,2019.

[3]AdamDunkels.DesignandImplementationoftheLwIPTCP/IPStack[J].SwedishInstitudeofComputerScience,2001,20(2).

作者:黃鈺強 岳偉 單位:中車株洲電力機車有限公司