李興國,周 榮,李 旭
(北京全路通信信號研究設計院集團有限公司,北京 100070)
BootLoader 技術是應用在Flash 程序存儲器的一種編程模式。它可以在應用程序正常運行的情況下,通過調用特定IAP 程序對另外一段Flash 空間進行讀與寫操作,這樣就可以按照傳入數據重新配置Flash 空間,從而實現對MCU 程序的更新。相較使用JTAG 工具的傳統燒錄方法,這種技術為鐵路現場固件升級帶來了更大的靈活性。
在實際應用中,需要在編譯器上開發2 個固件程序:BootLoader 程序和用戶程序。首先必須使用燒錄工具下載BootLoader 代碼,用戶代碼可以使用BootLoader 代碼IAP 功能下載,也可以使用燒錄工具下載,一般在現場應用中都使用BootLoader更新用戶程序。這兩部分項目代碼需要同時燒錄在 Flash 中,BootLoader 程序用于更新用戶程序,用戶程序用于實現具體應用。單片機上電進入BootLoader 程序區,如果收到更新程序指令,則對APP 區的程序進行改寫操作。如果未收到更新程序指令,程序指針跳到APP 區,開始執行放在APP 區的程序,這樣便實現了升級程序的功能。傳統使用BootLoader 更新固件程序,大致流程如下。
1)當給芯片上電后,首先執行BootLoader 程序。
2)檢查是否需要更新用戶代碼。
3)如果不需要更新,執行原用戶程序。
4)如果需要更新,擦除用戶程序區,寫入新用戶程序,并執行新用戶程序。
BootLoader 是以從串口上接收更新標志后進入燒寫程序狀態的。進入燒寫程序狀態后,BootLoader 程序做的第一件事情就是擦除原用戶程序的空間。如果在程序升級過程中,發生掉電或者通信連接斷開的情況,單片機就會處于新程序未更新完畢,原程序已丟失的情景,導致程序更新失敗。
為解決這個問題, 本文提出一種解決方法,在Flash 空間劃出一個區域用于備份用戶程序,MCU進入BootLoader 引導程序后,在收到更新程序指令時,先將程序寫入備份區,寫入完成后置位待更新標志Upsig,通知MCU 需要更新程序,然后再將備份區程序寫入用戶程序區,寫入完成后清零待更新標志Upsig。因此在每次進入BootLoader 程序,通過讀取Upsig 值用來判斷是否需要更新程序,相較于傳統BootLoader 下載程序的方法,本文提出的方法可以降低風險,保障下載程序的完整性。
基于在C3+ATO 項目的應用中,所述下載系統包括:遠程控制模塊、通信模塊、程序下載控制模塊、存儲模塊,功能結構框如圖1 所示。遠程控制模塊用于提供交互式操作入口,通過交互式操作入口控制所述程序下載,控制模塊執行下載流程,遠程控制終端為SecureCRT 終端軟件。通信模塊將系統與所述遠程控制模塊相連接,本應用使用串口通信。程序下載控制模塊包括:下載單元和執行單元,下載單元用于下載應用程序到所述存儲模塊,執行單元用于執行或更新應用程序。嵌入式系統的處理器是Power PC 系列處理器。

圖1 下載系統功能結構框圖Fig.1 Block diagram of functions of download system
在本應用中使用的硬件環境如下:MCU 選用Freescale 公司的處理器MPC8323E,閃存采用16 M Flash,內存采用2 GB DDR2,設置串口波特率230 400。硬件結構框如圖2 所示。

圖2 CPU模塊硬件結構框圖Fig.2 Block diagram of hardware of CPU module
在本應用中,MCU采用Freescale公司的MPC8323E 微處理器, 具有強大的功能。MPC8323E 是Freescale 公司PowerQUICC ? II Pro 系列的微處理器,此系列微處理器在Power Architecture 架構的e300c2 內核基礎上,配置單RISC 版本的QUICC Engine ?通信引擎形成MPC8323E 網絡功能的核心,最高可達300 MIPS處理能力。
根據前面的介紹,需要將Flash 存儲分為4 部分:第1 部分為BootLoader 程序區,第2 部分為BootLoader 參數區,第3 部分為應用程序區,第4 部分分配為應用程序備份區。如圖3 所示,將Flash 分區劃分為如下4 個部分:BootLoader 程序區用于存儲引導程序,BootLoader 參數區用于存儲程序更新參數, 應用程序備份區用于備份應用程序,應用程序區用于存儲應用程序。Flash 空間分布如圖3 所示。

圖3 Flash空間分布圖Fig.3 Distribution of FLASH storage area
首次使用系統時,通過專用JTAG 下載器將BootLoader 程序下載到Flash 存儲的0x00000000~0x000BFFFF 區 域,BootLoader。BootLoader 程序燒制完成后,系統上電啟動,MCU 從地址0x00000000 開始運行BootLoader程序,通過USB 向遠程終端secureCRT 發送交互信息。程序更新完畢后,CPU 直接跳轉至應用程序區0x00100000 地址,運行應用程序。
本應用通過串口通信使用YModem 協議進行文件傳輸, 通過secureCRT 遠程控制終端選擇YModem 傳輸文件模式。YModem 協議是由XModem 協議演變而來的,具有快速,穩定傳輸的優點。每包數據可以傳輸1 024 Byte,同時支持多文件傳輸,也就是批文件傳輸,是一個非常高效的文件傳輸協議。發送數據時使用CRC 校驗,保證數據傳輸的正確性。它每傳輸一個信息塊數據時,就會等待接收端回應ACK 信號,接收到回應后,才會繼續傳輸下一個信息塊,保證數據已經全部正確接收。
BootLoader 是嵌入式系統在上電后執行的第一段代碼,用于完成CPU 和相關硬件的初始化之后,更新應用程序,再將應用程序裝到內存中運行。本實例中,BootLoader 用于與遠程控制終端的交互,執行應用程序下載、應用程序備份、應用程序更新和應用程序啟動執行。
預先使用專用下載器將BootLoader 程序燒錄進Flash 指定空間,給系統上電后,MCU 首先進入BootLoader 程序,系統啟動后進入預定時間的倒計時;若所述預定時間的倒計時結束且系統沒有接收到預定輸入,獲取參數區升級標志。若為“1”,則系統進入下載模式第二步。若為“0”,則系統進入執行應用程序流程;若所在述預定時間的倒計時結束前,系統接收到預定的第一鍵入信息,則系統進入配置模式;在配置模式下,若系統接收到預定的第二鍵入信息,則系統進入執行原應用程序流程;在配置模式下,若系統接收到預定的第三鍵入信息,則系統進入應用程序下載模式;在下載模式下,第一步先擦除備份區數據,再將接收數據寫入備份區,置位參數區升級標志Upsig;第二步先擦除應用區數據,再將備份區數據寫入應用區,清零參數區升級標志Upsig,升級過程完成,系統進入執行應用流程。升級過程程序流程如圖4 所示。
本文介紹的升級程序方法不需要專用下載器、專用開發環境,不需要對下載軟件進行下載地址設置、Flash 擦除,不需要拔出插入板卡等,給程序下載帶來很大便利性,解決了Power PC 系列處理器在線升級不方便的問題,提高了列車自動運行系統的開發及測試效率。同時,本方法設置有安全下載控制,避免了下載遇到突發情況時,系統執行錯誤的目標應用程序,提高系統運行安全性。且下載完成后可以直接執行,提高了效率。

圖4 程序流程圖Fig.4 Program flowchart