摘 要:本文以ARM處理器為平臺,以恩智浦公司的LPC2136為例,在In-Application Progamming(IAP)技術原理基礎上設計并實現了嵌入式微處理器在線及遠程升級技術。該技術摒棄了傳統升級前需要打開設備跳線等繁瑣過程,并解決了升級過程意外中斷、傳輸誤碼等關鍵難點問題。
關鍵詞:應用編程;ARM;啟動裝載程序
中圖分類號:TP368.11;TN06 文獻標識碼:A 文章編號:2096-4706(2018)08-0050-02
Abstract:This paper takes ARM processor as the platform,takes LPC2136 of NXP Company as an example,and designs and implements the online and remote upgrade technology of embedded microprocessor on the basis of the principle of In-Application Progamming(IAP)technology. The technology eliminates the tedious process of opening device jumpers before upgrading,and solves the key problems such as unexpected interruption during the upgrade process,transmission error code and so on.
Keywords:application programming;ARM;boot loader
0 引 言
目前嵌入式系統應用相關技術取得了突飛猛進的發展,嵌入式應用已經深入到工業控制、通信、消費類電子、信息家電等不同領域,同時ARM處理器芯片由于其突出的低功耗、高性能、應用范圍廣泛等特點在嵌入式系統中得到廣泛的應用。為了能夠滿足客戶需求的變化,為現有產品提供新的功能或修正原有系統存在的缺陷,從而延長原有產品的生命周期,降低維護保養費用,產品所設計的嵌入式系統支持固件升級是必不可少的。在很多嵌入式應用場合,由于所使用的設備正在承擔關鍵的職能,不能因為固件升級過程而中斷該設備的使用。
目前的固件升級方法,往往需要打開設備跳線等繁瑣過程,升級過程可能出現意外中斷、傳輸無碼等問題,固件升級完畢,需要對固件系統進行復位后,才能繼續工作,不能提供連續的服務。本文以恩智浦(NXP)公司的ARM7芯片LPC2136為例,提出基于ARM的固件升級方法,可以在系統運行過程中完成固件升級、提供連續的服務,具備良好的可靠性和擴展性。
1 IAP基本原理
應用編程(IAP)函數是固化在微處理器內部Flash上的功能函數代碼,用戶程序可以直接通過調用這些代碼來對內部Flash進行擦除和編程操作。IAP技術主要應用于嵌入式系統的數據存儲和在線升級過程,通常可利用芯片的串行口接到計算機的RS232口、通過現有的Internet、無線網絡或者其他通信方式很方便地實現在線以及遠程升級和維護。LPC2136的IAP程序位于芯片的Boot Block中,芯片出廠時由廠家寫入,不可修改。IAP程序是Thumb代碼,位于地址0x7FFFFFFO[1](重映射后地址)處。用戶可通過跳轉到該地址來調用相應的IAP函數,具體的調用方法可見文獻[2]中的相關章節。由于IAP代碼是Thumb代碼,要設置編譯器以支持從ARM指令集到Thumb指令集的轉換[3]。對于LPC2136的應用編程來說,應當通過寄存器r0中的字指針指向存儲器(RAM)包含的命令代碼和參數來調用IAP程序。IAP命令的結果返回到寄存器r1所指向的返回表。用戶可通過傳遞寄存器r0和r1中的相同指針重用命令表來得到結果。參數表應當大到足夠保存所有的結果,以防結果的數目大于參數的數目。IAP參數傳遞如圖1所示,參數和結果的數目根據IAP命令有所不同。參數的最大數目為5,由“將RAM內容復制到Flash”命令傳遞。結果的最大數目為2,“扇區查空”命令返回。命令處理程序在接收到一個未定義的命令時發送狀態代碼INVALID_COMMAND。
2 基于IAP的ARM片內Flash的固件升級軟件設計
本文基于IAP的ARM片內Flash的固件升級設計,將ARM片內Flash劃分為2個區域,其中一個區域用來正常運行固件,另一個區域用來升級固件;獲取新版本的固件,存儲在外部存儲器存儲中,以及設置各用戶固件備份區的升級標志;當需要升級時,將需升級的固件更新到用戶代碼分區2中;同時系統在升級過程中,執行用戶代碼分區1中的固件,并不需要系統暫停去實現固件升級,可以在系統運行過程中完成固件升級,可以提供連續的服務,保證升級完成后系統中至少有一套可執行的固件,對于升級后的固件的可執行性和執行結果能夠進行可靠識別。
將ARM片內Flash劃分為用戶代碼分區1和用戶代碼分區2,其中,用戶代碼分區1為低地址區域,用戶代碼分區2為高地址區域,例如,對于地址為1000的ARM片內Flash,將地址從0至500劃分為戶代碼分區1,將地址從500至1000劃分為戶代碼分區2。為了進一步確保固件升級數據的安全性,防止升級過程出現的意外中斷、傳輸數據錯誤等情況,進行固件升級信息完整性的判斷。基于ARM的固件升級流程,如圖2所示。具體的執行操作步驟:(1)系統將ARM片內Flash劃分為用戶代碼分區1和用戶代碼分區2。(2)將初始固件導入到用戶代碼分區1,系統執行用戶代碼分區1中的固件。(3)當升級ARM固件時,系統獲取新版本的固件,并導入外部存儲器。在外部存儲器中,初始化外部存儲器時,設置每個用戶固件備份區的升級標志為不需升級;當有新版本的固件時,將新版本的固件存儲在其中一個用戶固件備份區,并設置該用戶固件備份區的升級標志為需要升級。(4)系統檢測外部存儲器中的升級標志,當需要升級時,獲取所需升級固件的長度信息。(5)獲取所需升級固件的校驗信息,判斷固件升級信息是否完整,若是,則進行步驟(6);若否,則進行步驟(7)。(6)將需升級的固件, 從用戶固件備份區更新到用戶代碼分區2。(7)繼續執行用戶代碼分區1的固件。
為了提高系統固件運行的安全性,如圖3所示固件升級后系統進行重啟動,裝載程序(Boot Loader)并判斷固件的升級執行情況,具體的操作步驟:(1)系統重啟動。(2)系統判斷是否需要升級固件;若是,則進入步驟(3);若否,則進行步驟(4)。(3)按圖1所示的方法進行固件升級。(4)判斷用戶代碼分區2的執行成功標志是否為真;若否,則進行步驟(6);若是,則進行步驟(5)。(5)試執行用戶代碼分區2的固件,設置用戶代碼分區2的執行成功標志為假(即清除用戶代碼分區2執行成功標識);判斷用戶代碼分區2的固件執行是否成功,若是,則進行步驟(7);若否,則進行步驟(6)。(6)執行用戶代碼分區1的固件。(7)正式執行用戶代碼分區2的固件,并設置用戶代碼分區2的執行成功標志為真。正式執行用戶代碼分區2的固件,由用戶代碼分區2的固件負責設置用戶代碼分區2的執行成功標志為真。
3 結 論
根據上述方法編寫的固件升級程序,能夠穩定地接收外部發來的新程序,并成功燒寫進片內Flash區,實現程序的更新;該設計可有效處理升級過程意外中斷、數據傳輸錯誤等異常情況,確保軟件正常運行。本文的設計以LPC2136為例實現,對于具有IAP功能的其他公司的ARM7芯片的固件程序更新也有借鑒意義。
參考文獻:
[1] 恩智浦半導體公司.LPC2131/2/4/6/8用戶手冊RV4.0 [Z].荷蘭:恩智浦半導體公司,2012.
[2] 周立功,張華.深入淺出ARM7—LPC213x/214x(上) [M].北京:北京航空航天大學出版社,2005.
作者簡介:方彬浩(1978.10-),男,漢族,廣東人,碩士。研究方向:電子設備嵌入式技術研究。