李媛媛
(南京康尼機電股份有限公司, 江蘇 南京 210013)
為了避免在進行程序更新、 升級過程中拆除門控器,通過仿真器將應(yīng)用程序更新到處理器中的這種繁瑣、費時、耗力的工作,需要研究通過串行總線、USB 口或其它總線以及相應(yīng)的通訊協(xié)議實現(xiàn)在線升級。 在更新過程中,可靠性是開發(fā)過程中首要考慮因素。為了應(yīng)對程序更新出錯的意外狀況,采取在開始更新、更新過程中以及更新完成后讀寫同一塊地址不同標志的策略增強程序的可靠性。
本文著重研究基于TMS570LS0714 處理器UART 總線Bootloader 的設(shè)計與實現(xiàn), 采用Ymodem 協(xié)議實現(xiàn)文件傳輸, 通過實驗說明設(shè)計的Bootloader 可以實現(xiàn)應(yīng)用程序在線更新。
應(yīng)用Flash 程序存儲器的一種編程方式稱為在線應(yīng)用編程IAP(In-Application Programming),它能夠在應(yīng)用程序正常運行過程中, 借助特定的IAP 程序讀/寫另一段程序的Flash 空間,甚至可以讀/寫某段、某頁甚至某個字節(jié), 這使得程序的在線升級和數(shù)據(jù)存儲有了很大的便捷性和靈活性[1]。
為了實現(xiàn)IAP 功能, 通常Flash 內(nèi)部要劃分為兩塊,一塊叫做Boot 區(qū),專門用來存儲Bootloader 程序,一塊稱為存儲區(qū),用來存儲應(yīng)用程序。 處理器TMS570 上電之后首先在Boot 區(qū)運行,如果有滿足外部改寫程序的條件,則先擦除原有程序數(shù)據(jù), 并通過UART 總線下載待升級程序到Flash,再拷貝到RAM 中運行;如果不滿足改寫程序的條件,則程序指針跳轉(zhuǎn)到存儲區(qū),執(zhí)行應(yīng)用程序,這就是IAP 功能實現(xiàn)原理[2]。
TMS570LS0714 處理器, 是TI 公司的一款安全控制芯片,符合功能安全要求的微控制器,具有雙核校驗、RAM和FLASH 的ECC 校驗等系統(tǒng)可靠性保障手段,可以識別出系統(tǒng)運行過程中的各類異常并執(zhí)行用戶預(yù)置的異常處理程序[3]。
TMS570LS0714 對用戶可操作的Flash 范圍是0x0000_0000~0x000B_FFFF,共768K[3]。 通常會安排Bootloader 代碼處于Flash 的開始區(qū)域0x0000_0000, 而應(yīng)用程序代碼緊隨其后。Bootloader 實現(xiàn)的功能就是升級加載應(yīng)用程序,應(yīng)本著可靠、簡化的原則,占用的存儲空間不應(yīng)過大, 本文分配Bootloader 存放地址為0x0000_0000~0x0001_FFFF,共128K。剩下的Flash 空間用0x0000_0000~0x000B_FFFF 來存放應(yīng)用程序。
本模塊通過UART 接口使用Ymodem 通信協(xié)議傳輸文件。 Ymodem 協(xié)議在發(fā)送方發(fā)送完成一包數(shù)據(jù)之后,需要等待接收方的確認,如果發(fā)生方收到“ACK”信號,則可以發(fā)送新的數(shù)據(jù)包,如果收到“NAK”信號,則需要重發(fā)或者錯誤退出。
Ymodem 協(xié)議是廣泛使用的異步文件傳輸協(xié)議之一,它是Xmodem 的改進版協(xié)議,相較于Xmodem 協(xié)議,Ymodem 協(xié)議允許批處理文件傳輸,傳輸效率、可靠性更高,一幀可以傳輸128*8bite 或1024*8bite, 一次傳輸可發(fā)送或接收幾個文件,使用CRC 校驗技術(shù)對發(fā)送數(shù)據(jù)包進行數(shù)據(jù)校驗確保數(shù)據(jù)傳輸正確性。每發(fā)送一個數(shù)據(jù)包后,會等待接收端回應(yīng),直到接收到“ACK”信號后,下一個數(shù)據(jù)包才會繼續(xù)傳輸,確保數(shù)據(jù)被接收完成。
本模塊定義的傳輸波特率是115200bit/s,8 個數(shù)據(jù)位,1 個停止位,偶校驗。
本協(xié)議接收方和發(fā)送方約定的收發(fā)過程中的一些標記信號定義見表1。
表1 收發(fā)過程約定符號定義
文件傳輸過程為[4]:
(1) 開啟是由接收方的處理器發(fā)送一個大寫字母“C”開啟傳輸,之后等待發(fā)送方發(fā)送“SOH”,如果接收不到回應(yīng),則一直向上位機發(fā)送“C”,若超過5S 上位機還沒有回應(yīng),則處理器會向上位機連續(xù)發(fā)送兩個“CAN”,然后超時退出。
(2)發(fā)送方開始時處于等待過程中,等待“收到“C”以后,發(fā)送文件名數(shù)據(jù)包,然后進入等待“ACK”狀態(tài)。
(3)接收方收到數(shù)據(jù)包之后,對數(shù)據(jù)包進行CRC 校驗,校驗成功則發(fā)送“ACK”信號。 發(fā)送方接收到“ACK”,又重新進入等待“C”的狀態(tài)。
(4)至此文件名數(shù)據(jù)包傳輸完成,此后文件傳輸正式開啟,Ymodem 支持每個數(shù)據(jù)包以128 字節(jié)以“SOH”開始或者1024 字節(jié)以 “STX” 開始, 本文規(guī)定每個數(shù)據(jù)包為1024 字節(jié)。
接收方開始準備接收文件又發(fā)出一個“C”信號,然后進入等待“STX”狀態(tài)。
(5)發(fā)送接收到“C”以后,發(fā)送數(shù)據(jù)包(詳見3.5 章節(jié)數(shù)據(jù)格式),等待接收方的“ACK”信號。
(6)發(fā)送方發(fā)出“EOT”信號表示文件發(fā)送完成,接收方回應(yīng)“ACK”信號。
緊接著發(fā)送方發(fā)出一個全“0”數(shù)據(jù)包,接收方回應(yīng)“ACK”,正式結(jié)束此次通訊。
Ymodem 通信協(xié)議接收數(shù)據(jù)格式,第一包數(shù)據(jù)只是傳輸文件的文件名和文件大小信息, 之后傳輸?shù)臄?shù)據(jù)包才是文件的內(nèi)容。 若最后一包內(nèi)容不足1024 字節(jié), 則以0補齊。 具體傳輸格式如下:
第一包:
圖1 第一包發(fā)送數(shù)據(jù)格式
第二包:
圖2 第二包發(fā)送數(shù)據(jù)格式
之后每一包依次類推下去。
接收方以一個大寫字母“C”開啟傳輸,收到發(fā)送來的數(shù)據(jù)以后,CRC 校驗滿足,則發(fā)送“ACK”應(yīng)答信號,CRC 校驗不滿足,則連續(xù)發(fā)送兩個“CAN”信號,表示取消該次傳輸。
接收方接收數(shù)據(jù)成功以后, 開始寫入flash 操作,如果寫入失敗,則連續(xù)發(fā)送兩個“CAN”信號,如果寫入成功,則發(fā)送一個“ACK” 應(yīng)答信號。
接收數(shù)據(jù)過程中,如果連續(xù)收到兩個“CAN”信號,則表示取消傳輸,發(fā)送方以發(fā)送“ACK”應(yīng)答;如果連續(xù)到一個“EOT”信號,則表示文件傳輸結(jié)束,發(fā)送方以發(fā)送“ACK”應(yīng)答。
配置Bootloader 的CMD 文件是應(yīng)用程序能否被正確升級的關(guān)鍵,CMD 文件的兩大主要功能是通過MEMORY偽指令來指示存儲空間和通過SECTIONS 偽指令來分配段到存儲空間,CMD 文件就是由這兩部分內(nèi)容構(gòu)成的。
在控制器復(fù)位以后, 啟動程序?qū)⒀b載引導(dǎo)程序的Flash API 從FLASH 中復(fù)制到RAM 中, 并在RAM 中執(zhí)行裝載引導(dǎo)程序??梢栽贑MD 文件中劃分一段用以設(shè)置RAM 的載入和運行地址,定義輸出段將被裝載到哪里的關(guān)鍵字、輸出段從哪里開始運行的關(guān)鍵字、API 從哪里開始下載、API 從哪里開始運行以及API 的長度等信息[5]。
串口IAP 的實現(xiàn)流程見圖3 所示,控制器復(fù)位以后,首先是在Flash 起始地址運行Bootloader 程序。Bootloader程序執(zhí)行的任務(wù)就是檢測是否升級應(yīng)用程序, 通過判斷Flash EEPROM block1 上的值是否是約定標志A,若block1 上的值不是A, 則表示要進行更新, TMS570 向上位機發(fā)送請求執(zhí)行代碼升級函數(shù), 同時驅(qū)動數(shù)碼管顯示“CC”。
圖3 IAP 實現(xiàn)流程
若block1 中的值滿足約定條件, 則說明分配的應(yīng)用程序地址空間(0x0002_0000~0x000B_FFFF)里有完整的應(yīng)用程序, 不需要進行升級操作, 直接跳轉(zhuǎn)到用戶代碼段,即起始地址0x0002_0000 執(zhí)行應(yīng)用程序。
定義運行Bootloader 程序, 門控器數(shù)碼管顯示“CC”指示Flash 中沒有應(yīng)用程序,數(shù)碼管顯示“FE”指示正在升級,數(shù)碼管顯示“FF”指示升級完成。
在程序升級過程中,為了防止誤升級錯誤的文件,或者是升級過程中出現(xiàn)意外導(dǎo)致升級失敗, 升級標志在不同階段寫不同值。
即在正常運行應(yīng)用程序時,收到上位機的升級請求,應(yīng)用程序首先向Flash EEPROM block1 寫需要升級標志B,然后關(guān)閉定時器引起復(fù)位操作,CPU 復(fù)位后進入Bootloader,重復(fù)4.1 節(jié)的操作,進入升級流程,在升級流程里,首先讀取block1 中的標志是否是B,若是B,則向block1中寫正在升級標志C,然后正式啟動升級操作。 升級完成后,跳轉(zhuǎn)到應(yīng)用程序段執(zhí)行應(yīng)用程序,應(yīng)用程序在執(zhí)行正常功能之前,先讀block1 中的標志是否是A,按照上述思路,這個時候block1 中存放的是標志C,而不是A,這時候CPU 立即向block1 中寫標志A,然后復(fù)位重啟,重復(fù)4.1 節(jié)操作。
這樣略顯繁瑣的操作, 恰好能規(guī)避誤升級錯誤文件的操作。 若正常升級過程出現(xiàn)意外導(dǎo)致升級失敗, 重啟CPU,Bootloader 上電檢測block1 無標志A, 再次進入升級流程升級即可。
本章節(jié)設(shè)計了四個試驗,通過配套上位機軟件發(fā)送應(yīng)用APP 程序數(shù)據(jù)流到TMS570 并運行, 測試上文設(shè)計的Bootloader 能否實現(xiàn)預(yù)期的升級功能。 該APP 程序運行起來后循環(huán)檢測有無升級請求, 并控制數(shù)碼管顯示“00”,輸出口O0 紅色指示燈以1HZ 頻率閃爍, 以方便用戶觀察APP 程序是否得以正確并完整升級,是否能夠正常運行。
Flash 中只有Bootloader,應(yīng)用程序段是空的,啟動上位機發(fā)送升級請求, 觀察升級過程中數(shù)碼管及指示燈情況見表2。 表中的數(shù)碼管及指示燈顯示情況表明該升級過程沒有出現(xiàn)數(shù)據(jù)丟失情況,Bootloader 能完整的解碼上位機發(fā)送的數(shù)據(jù)并寫到相應(yīng)Flash 上,升級成功。
表2 Flash 中只有Bootloader 升級APP
繼5.1 節(jié)之后,控制器輸出口O0 閃爍過程中, 啟動上位機發(fā)送升級請求, 觀察升級過程中數(shù)碼管及指示燈見情況見表3。
表3 Flash 中有Bootloader 和APP 升級APP
該試驗結(jié)果表明設(shè)計的Bootloader 能夠?qū)崿F(xiàn)過程升級。
繼5.1 節(jié)之后,控制器輸出口O0 閃爍過程中,啟動上位機發(fā)送升級請求,但是發(fā)送的不是和Bootloader 配套的APP 程序, 該APP 程序沒有實時檢測升級的功能,也沒有點亮輸出口的功能,即錯誤APP。觀察升級過程中數(shù)碼管及指示燈情況見表4。
表4 升級錯誤APP
該實驗表明升級了錯誤APP 后,Bootloader 不會跳轉(zhuǎn)到錯誤APP 程序執(zhí)行,會一直等待升級, 直到升級了正確APP 后,才會跳轉(zhuǎn)執(zhí)行APP 程序,能有效防護誤升級錯誤APP。
在升級過程中,斷開上位機與控制器的連接,制造升級過程出錯的現(xiàn)象,觀察上位機顯示升級超時出錯,重啟控制器,數(shù)碼管顯示“CC”,指示Flash 中沒有APP 程序。該實驗表明Bootloader 能夠有效防護升級過程出錯。
本文設(shè)計并實現(xiàn)了基于Ymodem 協(xié)議的Bootloader,在開發(fā)過程中增加防錯處理, 有效防止升級錯誤的執(zhí)行文件及升級失敗。經(jīng)過試驗證明Bootloader 能正確引導(dǎo)程序運行,下載數(shù)據(jù)完整、無誤、快速,沒有出現(xiàn)數(shù)據(jù)丟失、錯誤等現(xiàn)象。