嵌入式系統BootLoader設計分析

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

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

嵌入式系統BootLoader設計分析

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

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

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

1IAP原理

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

2關鍵技術點

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

2.1MCU配置

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

2.2以太網實現

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

3軟件流程圖

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

4IAP升級測試

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

5結語

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

參考文獻

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

[2]劉火良,楊森.LwIP應用開發實戰指南:基于STM32[M].北京:機械工業出版社,2019.

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

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