文獻標(biāo)識碼: A
文章編號: 0258-7998(2013)04-0029-03
設(shè)備的運行維護在嵌入式系統(tǒng)生命周期中占有絕大部分時間,因此研究一種能使現(xiàn)場工程師方便快捷地升級軟件而又絕不破壞設(shè)備可用性的技術(shù)方案是十分必要的。隨著物流網(wǎng)及相關(guān)領(lǐng)域的技術(shù)發(fā)展,RFID技術(shù)已經(jīng)得到廣泛應(yīng)用[1]。
本文針對應(yīng)用高頻RFID技術(shù)的嵌入式設(shè)備設(shè)計了一種基于IAP技術(shù)的運行時軟件升級方案,利用高頻大容量RFID對系統(tǒng)進行軟件升級。軟件架構(gòu)上設(shè)計引導(dǎo)程序、應(yīng)用程序、升級程序。該方案確保系統(tǒng)無論升級是否成功都可以維持正常工作。
該技術(shù)在基于IAP11F62X單片機和FM1702SL非接觸卡讀寫控制器的水控器硬件平臺,以及基于STM32F-
103RC單片機和FM1701非接觸卡讀寫控制器的加油機控制板硬件平臺上進行驗證。投入批量運行兩年多來,極大降低了現(xiàn)場維護成本。
本文首先介紹基于高頻RFID系統(tǒng)的IAP方案軟件架構(gòu)、引導(dǎo)程序設(shè)計及應(yīng)用程序設(shè)計,然后在硬件平臺上進行了驗證。
1 IAP方案設(shè)計
為了不破壞設(shè)備的可用性,又可以便捷地對系統(tǒng)進行升級,方案設(shè)計時將軟件系統(tǒng)劃分為引導(dǎo)程序、應(yīng)用程序、升級程序、用戶數(shù)據(jù)和IAP參數(shù)區(qū),如圖1所示。
引導(dǎo)程序負責(zé)檢查應(yīng)用程序和升級程序的數(shù)據(jù)完整性,決定是否升級軟件或者恢復(fù)舊版本軟件,最后運行應(yīng)用程序。應(yīng)用程序和升級程序都是當(dāng)前設(shè)備的應(yīng)用軟件,兩者僅版本不同:一個為當(dāng)前版本,一個為待升級版本。在應(yīng)用程序和升級程序中包含IAP功能,從RFID中讀取升級數(shù)據(jù)寫入相應(yīng)升級程序區(qū)域。
1.1 引導(dǎo)程序設(shè)計
設(shè)備上電或復(fù)位時首先運行引導(dǎo)程序,工作時不依賴任何外部功能。程序進行硬件自檢,設(shè)置中斷向量,檢查應(yīng)用程序和升級程序的數(shù)據(jù)完整性,并根據(jù)IAP參數(shù)的設(shè)置決定是需要升級程序還是回滾恢復(fù)舊版本應(yīng)用程序,再判斷升級過程是否被中斷并決定是否繼續(xù)升級。引導(dǎo)程序流程如圖2(a)所示。
為了確保系統(tǒng)可用型,升級過程中先要備份當(dāng)前版本應(yīng)用程序,通過一個緩存頁面,升級程序和應(yīng)用程序按Flash頁塊進行交換,復(fù)制次序如圖2(b)所示,確保升級過程既不破壞原有版本程序代碼,也不丟失新版本程序。
根據(jù)Flash按頁擦除、字節(jié)寫入的特性,在IAP參數(shù)區(qū),用8 B共64 bit代表64個頁面,初始化時為0xff,完成一頁則依次清除一位,這種寫模式下不需要擦除頁面即可記錄升級進度。一旦升級過程發(fā)生斷電等意外,開機重啟后可以檢測到升級斷點,繼續(xù)升級。
如果升級后應(yīng)用程序功能不穩(wěn)定,還可以在應(yīng)用程序中通過管理卡設(shè)置,回滾恢復(fù)到原來版本。這個過程和升級新版本軟件過程一樣,只是不需要讀取升級卡,僅需通過管理卡設(shè)置回滾標(biāo)志,通知引導(dǎo)程序“升級”(恢復(fù))到原來版本應(yīng)用程序。
1.2 應(yīng)用程序設(shè)計
應(yīng)用程序完成所需設(shè)備功能后,還需要實現(xiàn)讀取升級卡寫入升級程序區(qū),或者通過管理卡設(shè)置回滾標(biāo)志,在應(yīng)用程序的卡處理過程中增加升級卡處理,應(yīng)用程序流程如圖3(a)所示。
在應(yīng)用程序檢測到有卡時,執(zhí)行卡事件處理流程中,如圖3(b)所示,識別卡的類型如果是消費卡或管理卡,則進入相應(yīng)功能處理。管理卡與程序版本相關(guān)的只有版本選擇參數(shù),置位時寫入IAP參數(shù)區(qū),由引導(dǎo)程序交換應(yīng)用程序和升級程序,主要用于升級后的版本回退。
識別到升級卡時,讀取升級卡格式數(shù)據(jù)塊。如果當(dāng)前已經(jīng)讀取過升級卡并寫過升級程序區(qū),則升級卡版本信息必須與已經(jīng)寫入的升級卡版本一致才能繼續(xù)讀入。確認校驗數(shù)據(jù)完整性后,根據(jù)數(shù)據(jù)地址信息寫入升級程序區(qū),否則提示拒絕該卡,確保升級卡版本一致。如果尚未讀取過升級卡,則先讀取并判斷升級卡版本。如果與應(yīng)用程序或升級程序版本重復(fù),則提示已經(jīng)升級;如果為新版本軟件,則需要先擦除升級程序區(qū)Flash,再根據(jù)升級卡頭信息寫入升級程序區(qū)。如果本套升級卡已經(jīng)全部讀取并寫入升級程序區(qū),則更新IAP參數(shù),軟件復(fù)位跳轉(zhuǎn)到引導(dǎo)程序。
2 IAP硬件平臺設(shè)計
目前支持IAP的51單片機有STC的IAP11F系列以及新茂、新唐(華邦)和SST等很多型號,而基于ARM的單片機基本都支持IAP功能,這里以兩種典型應(yīng)用為例介紹IAP系統(tǒng)設(shè)計。
2.1 51單片機系統(tǒng)
水控器是應(yīng)用于飲用水或浴室等用水管理的設(shè)備,通過控制電磁閥管理出水,通過定時器計時收費,通過脈沖式流量傳感器計量收費,或者通過RTC時鐘包時收費。
系統(tǒng)采用STC公司的IAP11F60X單片機,具有62 KB程序空間,引導(dǎo)程序占1 KB,應(yīng)用程序和升級程序各占28 KB,IAP參數(shù)占1 KB(2頁),其余為用戶數(shù)據(jù)區(qū)[2]。
射頻模塊為FM1702SL,單片機通過模擬SPI與之連接,可以讀取ISO14442A標(biāo)準(zhǔn)系列非接觸卡。具體功能模塊見圖4。
在項目設(shè)置中需要設(shè)置應(yīng)用程序起始地址,例如在本系統(tǒng)中起始地址設(shè)為0x0400,此外需要特別處理中斷向量。51單片機的中斷向量為固定地址,此時中斷向量都在引導(dǎo)程序中,而中斷服務(wù)函數(shù)均在應(yīng)用程序中,因此需要在引導(dǎo)程序中設(shè)置中斷跳轉(zhuǎn)到應(yīng)用程序中,舉例如下:
;-----定時中斷0----------------
ORG 000BH
LJMP AP_ADDR+0BH
;-----定時中斷1----------------
ORG 001BH
LJMP AP_ADDR+1BH
;-----------------------------
AP_ADDR 定義為應(yīng)用程序起始地址,而在應(yīng)用程序中依然通過以下語法實現(xiàn)中斷函數(shù):
void timer0_ISR(void) interrupt 1 using 1
void timer1_ISR(void) interrupt 3 using 1
使用IAP11F62X單片機,在處理完升級卡后可以通過給IAP_CONTR賦值0x20強制軟件復(fù)位跳轉(zhuǎn)到引導(dǎo)程序,引導(dǎo)程序完成升級。然后通過LJMP AP_ADDR 指令跳轉(zhuǎn)到應(yīng)用程序,完成IAP過程并繼續(xù)運行。
2.2 STM32單片機系統(tǒng)IAP
某型非接觸卡加油機控制板采用STM32F103RC處理器,具有256 KB Flash,讀卡電路采用性價比更高的FM1701,由軟件實現(xiàn)FM1208 CPU卡的加密認證讀取,通過車號識別模塊識別車輛,并可以通過串口攝像模塊拍照,與加油記錄一起保存在大容量串口Flash中,其結(jié)構(gòu)框圖如圖5所示。
STM32位處理器IAP功能與51單片機系統(tǒng)大體相似,需要設(shè)置程序起始位置,引導(dǎo)程序必須設(shè)置為Flash基地址(0x08000000),而應(yīng)用程序地址則是0x0800-2000。不同之處在于STM32的中斷向量表可以通過NVIC_Set-VectorTable函數(shù)設(shè)置到0x08002000,而不必通過引導(dǎo)程序跳轉(zhuǎn)[3]。此外,STM32F103RC具有48 KB SRAM,可以讀入升級卡全部數(shù)據(jù),校驗正確后寫入Flash。
引導(dǎo)程序完成升級程序代碼復(fù)制交換后,通過絕對地址跳轉(zhuǎn)語句即可跳轉(zhuǎn)到指定地址的應(yīng)用程序執(zhí)行。應(yīng)用程序也通過相同語句跳轉(zhuǎn)到引導(dǎo)程序執(zhí)行,僅地址不同。
3 主機寫升級卡軟件
主機寫卡軟件讀取HEX格式或者BIN格式程序文件,按IC卡容量分割后寫入升級卡。由于RFID卡數(shù)據(jù)容量有限,升級程序可能需要寫入多張升級卡。
規(guī)劃卡數(shù)據(jù)的存放時,必須考慮升級時的卡類型識別以及版本控制、數(shù)據(jù)完整性等,因此需要設(shè)計格式頭,如圖6所示。
識別碼用于確認該卡為本設(shè)備所用;類型碼用于判定識別卡類型屬于消費卡、管理卡或升級卡;版本為本卡內(nèi)應(yīng)用程序版本號;起始地址和數(shù)據(jù)長度為卡內(nèi)數(shù)據(jù)在升級程序空間內(nèi)的起始地址和數(shù)據(jù)字節(jié)數(shù);卡數(shù)說明升級程序共包含多少張卡;卡序則是說明當(dāng)前卡為第幾張卡;數(shù)據(jù)校驗用于驗證卡內(nèi)數(shù)據(jù)的完整性。主機寫卡軟件根據(jù)應(yīng)用程序大小計算所需升級卡數(shù)量,并依次寫入升級卡格式以及數(shù)據(jù)[4]。
4 功能驗證
該升級方案應(yīng)用于某型非接觸卡水控器,采用4 KB數(shù)據(jù)容量的FM11F32卡作為升級介質(zhì),單片機為IAP11F62X。一套升級卡一直控制在7張卡以內(nèi)。某型非接觸卡加油機控制板也采用這一方案,采用8 KB數(shù)據(jù)容量的FM1208 CPU卡作為升級介質(zhì),單片機為STM32-
F103RC。由于加油站現(xiàn)場環(huán)境限制,這種升級方式更易于接受[5]。
在設(shè)備運行的近2年時間時,由于修復(fù)BUG、調(diào)整功能等需求,設(shè)備進行了十多次升級,正因為采用這種方式,沒有給用戶和維護人員帶來額外負擔(dān)。
本設(shè)計采用大容量RFID卡作為升級介質(zhì),無須下載線,更不必拆開設(shè)備,就可以進行現(xiàn)場升級,極大降低了維護難度。雖然由于目前非接觸卡存儲容量有限,可能需要多張IC卡才能完成升級,但由于設(shè)備讀卡速度快,整個軟件升級過程也不過兩三分鐘時間。實際應(yīng)用證明,這種升級方式無論用戶還是現(xiàn)場維護人員都易于接受,具有較高的應(yīng)用價值。
參考文獻
[1] 王愛英.智能卡技術(shù)[M].北京:清華大學(xué)出版社,2009.
[2] 丁向榮.STC系列增強型8051單片機原理與應(yīng)用[M].北京:電子工業(yè)出版社,2011.
[3] 李寧.基于MDK的STM32處理器開發(fā)應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2008.
[4] 鄭群星.RFID原理[M].臺北:全華圖書股份有限公司,2011.
[5] 王幸之.單片機應(yīng)用系統(tǒng)電磁干擾與抗干擾技術(shù)[M].北京:北京航空航天大學(xué)出版社,2006.