李興國(guó),周 榮,李 旭
(北京全路通信信號(hào)研究設(shè)計(jì)院集團(tuán)有限公司,北京 100070)
BootLoader 技術(shù)是應(yīng)用在Flash 程序存儲(chǔ)器的一種編程模式。它可以在應(yīng)用程序正常運(yùn)行的情況下,通過(guò)調(diào)用特定IAP 程序?qū)α硗庖欢蜦lash 空間進(jìn)行讀與寫(xiě)操作,這樣就可以按照傳入數(shù)據(jù)重新配置Flash 空間,從而實(shí)現(xiàn)對(duì)MCU 程序的更新。相較使用JTAG 工具的傳統(tǒng)燒錄方法,這種技術(shù)為鐵路現(xiàn)場(chǎng)固件升級(jí)帶來(lái)了更大的靈活性。
在實(shí)際應(yīng)用中,需要在編譯器上開(kāi)發(fā)2 個(gè)固件程序:BootLoader 程序和用戶程序。首先必須使用燒錄工具下載BootLoader 代碼,用戶代碼可以使用BootLoader 代碼IAP 功能下載,也可以使用燒錄工具下載,一般在現(xiàn)場(chǎng)應(yīng)用中都使用BootLoader更新用戶程序。這兩部分項(xiàng)目代碼需要同時(shí)燒錄在 Flash 中,BootLoader 程序用于更新用戶程序,用戶程序用于實(shí)現(xiàn)具體應(yīng)用。單片機(jī)上電進(jìn)入BootLoader 程序區(qū),如果收到更新程序指令,則對(duì)APP 區(qū)的程序進(jìn)行改寫(xiě)操作。如果未收到更新程序指令,程序指針跳到APP 區(qū),開(kāi)始執(zhí)行放在APP 區(qū)的程序,這樣便實(shí)現(xiàn)了升級(jí)程序的功能。傳統(tǒng)使用BootLoader 更新固件程序,大致流程如下。
1)當(dāng)給芯片上電后,首先執(zhí)行BootLoader 程序。
2)檢查是否需要更新用戶代碼。
3)如果不需要更新,執(zhí)行原用戶程序。
4)如果需要更新,擦除用戶程序區(qū),寫(xiě)入新用戶程序,并執(zhí)行新用戶程序。
BootLoader 是以從串口上接收更新標(biāo)志后進(jìn)入燒寫(xiě)程序狀態(tài)的。進(jìn)入燒寫(xiě)程序狀態(tài)后,BootLoader 程序做的第一件事情就是擦除原用戶程序的空間。如果在程序升級(jí)過(guò)程中,發(fā)生掉電或者通信連接斷開(kāi)的情況,單片機(jī)就會(huì)處于新程序未更新完畢,原程序已丟失的情景,導(dǎo)致程序更新失敗。
為解決這個(gè)問(wèn)題, 本文提出一種解決方法,在Flash 空間劃出一個(gè)區(qū)域用于備份用戶程序,MCU進(jìn)入BootLoader 引導(dǎo)程序后,在收到更新程序指令時(shí),先將程序?qū)懭雮浞輩^(qū),寫(xiě)入完成后置位待更新標(biāo)志Upsig,通知MCU 需要更新程序,然后再將備份區(qū)程序?qū)懭胗脩舫绦騾^(qū),寫(xiě)入完成后清零待更新標(biāo)志Upsig。因此在每次進(jìn)入BootLoader 程序,通過(guò)讀取Upsig 值用來(lái)判斷是否需要更新程序,相較于傳統(tǒng)BootLoader 下載程序的方法,本文提出的方法可以降低風(fēng)險(xiǎn),保障下載程序的完整性。
基于在C3+ATO 項(xiàng)目的應(yīng)用中,所述下載系統(tǒng)包括:遠(yuǎn)程控制模塊、通信模塊、程序下載控制模塊、存儲(chǔ)模塊,功能結(jié)構(gòu)框如圖1 所示。遠(yuǎn)程控制模塊用于提供交互式操作入口,通過(guò)交互式操作入口控制所述程序下載,控制模塊執(zhí)行下載流程,遠(yuǎn)程控制終端為SecureCRT 終端軟件。通信模塊將系統(tǒng)與所述遠(yuǎn)程控制模塊相連接,本應(yīng)用使用串口通信。程序下載控制模塊包括:下載單元和執(zhí)行單元,下載單元用于下載應(yīng)用程序到所述存儲(chǔ)模塊,執(zhí)行單元用于執(zhí)行或更新應(yīng)用程序。嵌入式系統(tǒng)的處理器是Power PC 系列處理器。
圖1 下載系統(tǒng)功能結(jié)構(gòu)框圖Fig.1 Block diagram of functions of download system
在本應(yīng)用中使用的硬件環(huán)境如下:MCU 選用Freescale 公司的處理器MPC8323E,閃存采用16 M Flash,內(nèi)存采用2 GB DDR2,設(shè)置串口波特率230 400。硬件結(jié)構(gòu)框如圖2 所示。
圖2 CPU模塊硬件結(jié)構(gòu)框圖Fig.2 Block diagram of hardware of CPU module
在本應(yīng)用中,MCU采用Freescale公司的MPC8323E 微處理器, 具有強(qiáng)大的功能。MPC8323E 是Freescale 公司PowerQUICC ? II Pro 系列的微處理器,此系列微處理器在Power Architecture 架構(gòu)的e300c2 內(nèi)核基礎(chǔ)上,配置單RISC 版本的QUICC Engine ?通信引擎形成MPC8323E 網(wǎng)絡(luò)功能的核心,最高可達(dá)300 MIPS處理能力。
根據(jù)前面的介紹,需要將Flash 存儲(chǔ)分為4 部分:第1 部分為BootLoader 程序區(qū),第2 部分為BootLoader 參數(shù)區(qū),第3 部分為應(yīng)用程序區(qū),第4 部分分配為應(yīng)用程序備份區(qū)。如圖3 所示,將Flash 分區(qū)劃分為如下4 個(gè)部分:BootLoader 程序區(qū)用于存儲(chǔ)引導(dǎo)程序,BootLoader 參數(shù)區(qū)用于存儲(chǔ)程序更新參數(shù), 應(yīng)用程序備份區(qū)用于備份應(yīng)用程序,應(yīng)用程序區(qū)用于存儲(chǔ)應(yīng)用程序。Flash 空間分布如圖3 所示。
圖3 Flash空間分布圖Fig.3 Distribution of FLASH storage area
首次使用系統(tǒng)時(shí),通過(guò)專用JTAG 下載器將BootLoader 程序下載到Flash 存儲(chǔ)的0x00000000~0x000BFFFF 區(qū) 域,BootLoader。BootLoader 程序燒制完成后,系統(tǒng)上電啟動(dòng),MCU 從地址0x00000000 開(kāi)始運(yùn)行BootLoader程序,通過(guò)USB 向遠(yuǎn)程終端secureCRT 發(fā)送交互信息。程序更新完畢后,CPU 直接跳轉(zhuǎn)至應(yīng)用程序區(qū)0x00100000 地址,運(yùn)行應(yīng)用程序。
本應(yīng)用通過(guò)串口通信使用YModem 協(xié)議進(jìn)行文件傳輸, 通過(guò)secureCRT 遠(yuǎn)程控制終端選擇YModem 傳輸文件模式。YModem 協(xié)議是由XModem 協(xié)議演變而來(lái)的,具有快速,穩(wěn)定傳輸?shù)膬?yōu)點(diǎn)。每包數(shù)據(jù)可以傳輸1 024 Byte,同時(shí)支持多文件傳輸,也就是批文件傳輸,是一個(gè)非常高效的文件傳輸協(xié)議。發(fā)送數(shù)據(jù)時(shí)使用CRC 校驗(yàn),保證數(shù)據(jù)傳輸?shù)恼_性。它每傳輸一個(gè)信息塊數(shù)據(jù)時(shí),就會(huì)等待接收端回應(yīng)ACK 信號(hào),接收到回應(yīng)后,才會(huì)繼續(xù)傳輸下一個(gè)信息塊,保證數(shù)據(jù)已經(jīng)全部正確接收。
BootLoader 是嵌入式系統(tǒng)在上電后執(zhí)行的第一段代碼,用于完成CPU 和相關(guān)硬件的初始化之后,更新應(yīng)用程序,再將應(yīng)用程序裝到內(nèi)存中運(yùn)行。本實(shí)例中,BootLoader 用于與遠(yuǎn)程控制終端的交互,執(zhí)行應(yīng)用程序下載、應(yīng)用程序備份、應(yīng)用程序更新和應(yīng)用程序啟動(dòng)執(zhí)行。
預(yù)先使用專用下載器將BootLoader 程序燒錄進(jìn)Flash 指定空間,給系統(tǒng)上電后,MCU 首先進(jìn)入BootLoader 程序,系統(tǒng)啟動(dòng)后進(jìn)入預(yù)定時(shí)間的倒計(jì)時(shí);若所述預(yù)定時(shí)間的倒計(jì)時(shí)結(jié)束且系統(tǒng)沒(méi)有接收到預(yù)定輸入,獲取參數(shù)區(qū)升級(jí)標(biāo)志。若為“1”,則系統(tǒng)進(jìn)入下載模式第二步。若為“0”,則系統(tǒng)進(jìn)入執(zhí)行應(yīng)用程序流程;若所在述預(yù)定時(shí)間的倒計(jì)時(shí)結(jié)束前,系統(tǒng)接收到預(yù)定的第一鍵入信息,則系統(tǒng)進(jìn)入配置模式;在配置模式下,若系統(tǒng)接收到預(yù)定的第二鍵入信息,則系統(tǒng)進(jìn)入執(zhí)行原應(yīng)用程序流程;在配置模式下,若系統(tǒng)接收到預(yù)定的第三鍵入信息,則系統(tǒng)進(jìn)入應(yīng)用程序下載模式;在下載模式下,第一步先擦除備份區(qū)數(shù)據(jù),再將接收數(shù)據(jù)寫(xiě)入備份區(qū),置位參數(shù)區(qū)升級(jí)標(biāo)志Upsig;第二步先擦除應(yīng)用區(qū)數(shù)據(jù),再將備份區(qū)數(shù)據(jù)寫(xiě)入應(yīng)用區(qū),清零參數(shù)區(qū)升級(jí)標(biāo)志Upsig,升級(jí)過(guò)程完成,系統(tǒng)進(jìn)入執(zhí)行應(yīng)用流程。升級(jí)過(guò)程程序流程如圖4 所示。
本文介紹的升級(jí)程序方法不需要專用下載器、專用開(kāi)發(fā)環(huán)境,不需要對(duì)下載軟件進(jìn)行下載地址設(shè)置、Flash 擦除,不需要拔出插入板卡等,給程序下載帶來(lái)很大便利性,解決了Power PC 系列處理器在線升級(jí)不方便的問(wèn)題,提高了列車自動(dòng)運(yùn)行系統(tǒng)的開(kāi)發(fā)及測(cè)試效率。同時(shí),本方法設(shè)置有安全下載控制,避免了下載遇到突發(fā)情況時(shí),系統(tǒng)執(zhí)行錯(cuò)誤的目標(biāo)應(yīng)用程序,提高系統(tǒng)運(yùn)行安全性。且下載完成后可以直接執(zhí)行,提高了效率。
圖4 程序流程圖Fig.4 Program flowchart