,,,,
(南京南瑞繼保電氣有限公司,南京 211102)
電力系統(tǒng)二次設(shè)備繼電保護(hù)、測(cè)控設(shè)備面對(duì)用戶越來(lái)越多的新需求、軟件自身錯(cuò)誤等問(wèn)題,需要及時(shí)對(duì)設(shè)備程序進(jìn)行升級(jí)和維護(hù),改善設(shè)備性能,延長(zhǎng)設(shè)備生命周期。傳統(tǒng)的方法需要拆卸設(shè)備,通過(guò)仿真器或者編程器燒寫(xiě)程序,這種方式在現(xiàn)場(chǎng)調(diào)試、設(shè)備數(shù)量龐大時(shí),維護(hù)非常困難。在線升級(jí)是被廣泛采用的一種方式,這種升級(jí)方式可以不受環(huán)境的限制,充分提高了系統(tǒng)升級(jí)的便利性和可維護(hù)性[1]。參考文獻(xiàn)[2]~[4]介紹了利用串口、RS422、網(wǎng)絡(luò)等方法實(shí)現(xiàn)將程序升級(jí)到處理器片內(nèi)、片外Flash中。一般是先燒寫(xiě)一段BOOT程序,通過(guò)解析應(yīng)用程序文件完成程序升級(jí)。這些方法往往存在BOOT程序無(wú)法升級(jí)自身、程序燒寫(xiě)無(wú)法脫離仿真器或編程器、應(yīng)用程序運(yùn)行無(wú)法實(shí)時(shí)升級(jí)等問(wèn)題,影響了工程應(yīng)用的可靠性和便捷性。
本文設(shè)計(jì)了一種基于CAN通信實(shí)現(xiàn)的通用程序在線升級(jí)方法,支持BOOT程序、應(yīng)用程序兩種模式下的升級(jí)。BOOT程序不僅支持升級(jí)應(yīng)用程序,還支持升級(jí)BOOT程序自身。通過(guò)在上位機(jī)、下位機(jī)間設(shè)計(jì)一套升級(jí)服務(wù)協(xié)議,保證了程序升級(jí)過(guò)程的可靠性。針對(duì)程序升級(jí)的異常情況,設(shè)計(jì)了相應(yīng)的恢復(fù)措施,保證了系統(tǒng)異常時(shí)能夠及時(shí)恢復(fù)。此外,結(jié)合ZYNQ芯片多種啟動(dòng)模式,實(shí)現(xiàn)了通過(guò)SD卡啟動(dòng)程序完成BOOT程序燒寫(xiě),不需要借助仿真器或編程器,提高了生產(chǎn)調(diào)試、工程維護(hù)的便捷性。
程序在線升級(jí)系統(tǒng)硬件總體結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)圖
上位機(jī)通過(guò)以太網(wǎng)通信將程序下發(fā)給下位機(jī)管理插件,下位機(jī)管理插件通過(guò)CAN總線透?jìng)鹘o目標(biāo)插件,目標(biāo)插件接收數(shù)據(jù)后寫(xiě)入片外Flash中。下位機(jī)可以根據(jù)實(shí)際應(yīng)用需求配置多個(gè)目標(biāo)插件,所有目標(biāo)插件的程序均可以由上位機(jī)下發(fā),管理插件根據(jù)每個(gè)目標(biāo)插件的槽號(hào)節(jié)點(diǎn)轉(zhuǎn)發(fā)完成程序升級(jí)。
目標(biāo)插件硬件系統(tǒng)主要由ZYNQ-7000 片上系統(tǒng)、DDR3內(nèi)存、片外Flash存儲(chǔ)、SD卡存儲(chǔ)、CAN接口電路、UART接口電路等組成,硬件框圖如圖2所示。ZYNQ-7000 SoC包含處理器系統(tǒng)(Processing System,PS)和可編程邏輯器件(Programmable Logic,PL)兩部分,處理器系統(tǒng)集成了雙核ARM Cortex-A9、存儲(chǔ)器接口和豐富的外設(shè)接口,可編程邏輯器件包含大量FPGA的邏輯單元[7]。片外QSPI Flash作為非易失性存儲(chǔ),用于存儲(chǔ)BOOT程序、雙核應(yīng)用程序、FPGA程序,程序運(yùn)行在DDR3內(nèi)存中。CAN接口用于與管理插件通信交互。UART負(fù)責(zé)串口調(diào)試信息展示,SD卡存儲(chǔ)設(shè)備日志信息、生產(chǎn)調(diào)試燒寫(xiě)B(tài)OOT程序。
圖2 目標(biāo)插件硬件框圖
本文設(shè)計(jì)的程序在線升級(jí)方法可以在BOOT程序、應(yīng)用程序運(yùn)行過(guò)程中實(shí)時(shí)進(jìn)行。系統(tǒng)軟件采用雙裸核(Standalone)的非對(duì)稱多處理(Asymmetric MultiProcessing,AMP)模式總體架構(gòu)設(shè)計(jì),CPU0核完成程序在線升級(jí)功能,CPU1程序通過(guò)CPU0代理完成升級(jí)。通過(guò)代理模式可以避免在線升級(jí)過(guò)程中雙核訪問(wèn)CAN、Flash、DDR等硬件資源競(jìng)爭(zhēng)。軟件上通過(guò)模塊化方式設(shè)計(jì),BOOT程序和應(yīng)用程序可以快速?gòu)?fù)用CAN模塊驅(qū)動(dòng)、Flash模塊驅(qū)動(dòng)及程序升級(jí)模塊等完成在線升級(jí)功能集成。
ZYNQ-7000處理器系統(tǒng)內(nèi)部集成兩個(gè)CAN控制器,最大支持1 Mbps傳輸速率,可以滿足系統(tǒng)要求。CAN驅(qū)動(dòng)主要包括CAN模塊硬件初始化、報(bào)文發(fā)送、接收處理。初始化配置硬件引腳、通信波特率、工作模式等。報(bào)文發(fā)送、接收采用中斷方式處理,既可以節(jié)省CPU的資源,也能夠保證及時(shí)響應(yīng)CAN報(bào)文。CAN報(bào)文采用29位擴(kuò)展幀格式,管理插件通過(guò)擴(kuò)展幀中的應(yīng)用報(bào)文類型、源地址、目的地址來(lái)實(shí)現(xiàn)對(duì)各個(gè)槽位的目標(biāo)插件升級(jí)程序。通過(guò)在CAN驅(qū)動(dòng)中增加報(bào)文重發(fā)機(jī)制、總線異常自恢復(fù)等措施,提高了程序在線升級(jí)過(guò)程的可靠性。
Flash采用的是Micron公司MT25QL256芯片,該存儲(chǔ)器一共有512個(gè)扇區(qū),每個(gè)扇區(qū)大小為64 KB,共32 MB存儲(chǔ)空間。Flash驅(qū)動(dòng)主要包含硬件初始化、擦除扇區(qū)、寫(xiě)數(shù)據(jù)、讀數(shù)據(jù)接口。通過(guò)識(shí)別文件名中關(guān)鍵字來(lái)確定不同程序?qū)懭氲腇lash位置,F(xiàn)lash的空間劃分如表1所列。
表1 Flash空間分配
在上位機(jī)、下位機(jī)間設(shè)計(jì)一套升級(jí)服務(wù)協(xié)議,可以提高程序升級(jí)過(guò)程的可靠性。上位機(jī)、下位機(jī)交互的報(bào)文數(shù)據(jù)幀格式如下:
幀頭1幀頭2類型長(zhǎng)度內(nèi)容校驗(yàn)碼字節(jié)0字節(jié)1字節(jié)2字節(jié)3字節(jié)4~NN字節(jié)累加和
升級(jí)服務(wù)的應(yīng)用層協(xié)議內(nèi)容如表2所列。
表2 應(yīng)用層協(xié)議內(nèi)容
通過(guò)BOOT程序、應(yīng)用程序兩種模式,實(shí)現(xiàn)在線升級(jí)功能。BOOT程序完成應(yīng)用程序加載、升級(jí)及自身程序升級(jí),應(yīng)用程序完成自身程序升級(jí)和應(yīng)用功能,兩者通過(guò)集成CAN模塊驅(qū)動(dòng)、Flash模塊驅(qū)動(dòng)及程序升級(jí)模塊來(lái)實(shí)現(xiàn)。ZYNQ-7000上電運(yùn)行的啟動(dòng)流程如圖3所示。
圖3 啟動(dòng)流程
啟動(dòng)流程如下:
① 首先執(zhí)行片內(nèi)BootROM程序,完成對(duì)QSPI、SD等外設(shè)控制器初始化。
② 然后加載FSBL(First Stage Boot Loader)程序到OCM(On Chip Memory)上運(yùn)行,F(xiàn)SBL完成GPIO、時(shí)鐘、DDR3內(nèi)存初始化后,加載BOOT程序到DDR3中運(yùn)行。
③ BOOT程序判斷當(dāng)前模式和校驗(yàn)Flash內(nèi)容,如果是BOOT模式或者Flash應(yīng)用程序校驗(yàn)出錯(cuò),則初始化CAN及中斷,等待升級(jí)應(yīng)用程序。如果是應(yīng)用程序模式,則加載雙核CPU0、CPU1應(yīng)用程序,F(xiàn)PGA程序,跳轉(zhuǎn)執(zhí)行應(yīng)用程序。
BOOT和應(yīng)用程序的在線升級(jí)過(guò)程基本一致,如圖4所示,主要是升級(jí)服務(wù)應(yīng)用層的交互過(guò)程。
圖4 在線升級(jí)流程
① 上位機(jī)主動(dòng)發(fā)起程序升級(jí)檢查命令,下位機(jī)進(jìn)入在線升級(jí)模式,解析命令中的文件類型、名稱、長(zhǎng)度計(jì)算總的Flash擦除時(shí)間,應(yīng)答上位機(jī)擦除時(shí)間、報(bào)文校驗(yàn)結(jié)果。
② 上位機(jī)發(fā)送下載擦除命令,等待下位機(jī)返回Flash擦除操作結(jié)果。
③ 上位機(jī)發(fā)送下載請(qǐng)求命令,下位機(jī)應(yīng)答文件類型校驗(yàn)結(jié)果。
④ 上位機(jī)發(fā)送下載地址段命令,通知下位機(jī)數(shù)據(jù)升級(jí)的Flash起始地址,下位機(jī)應(yīng)答地址范圍校驗(yàn)結(jié)果。
⑤ 上位機(jī)發(fā)送下載數(shù)據(jù)命令,逐個(gè)數(shù)據(jù)包發(fā)送程序內(nèi)容,下位機(jī)接收后將數(shù)據(jù)寫(xiě)入Flash中。重復(fù)此過(guò)程,直到程序數(shù)據(jù)下載完成。
⑥ 上位機(jī)發(fā)送下載結(jié)束命令,通知下位機(jī)數(shù)據(jù)校驗(yàn)和,下位機(jī)回讀Flash內(nèi)容計(jì)算校驗(yàn)和,應(yīng)答校驗(yàn)和比較結(jié)果。
⑦ 若步驟①~⑥上位機(jī)收到下位機(jī)否定應(yīng)答,則上位機(jī)發(fā)送下載取消命令,取消本次升級(jí)。下位機(jī)中應(yīng)用程序可能被擦寫(xiě),重啟后程序在BOOT中運(yùn)行,等待下一次程序升級(jí)。
⑧ 上位機(jī)發(fā)送復(fù)位命令通知下位機(jī)啟動(dòng)看門(mén)狗復(fù)位,完成程序在線升級(jí),執(zhí)行新程序。
通過(guò)上位機(jī)給下位機(jī)下載CPU0、CPU1以及FPGA程序,借助串口工具查看程序升級(jí)信息,分別進(jìn)行正常升級(jí)、異常升級(jí)過(guò)程測(cè)試。通過(guò)上千次程序升級(jí)測(cè)試,驗(yàn)證升級(jí)功能正常。
測(cè)試BOOT程序、應(yīng)用程序模式下的升級(jí)功能,應(yīng)用程序模式下的升級(jí)信息如圖5所示。
圖5 正常升級(jí)測(cè)試
圖6 異常升級(jí)測(cè)試
模擬升級(jí)過(guò)程異常斷電、CPU0程序文件校驗(yàn)碼出錯(cuò)。CPU0程序文件校驗(yàn)碼出錯(cuò)升級(jí)信息如圖6所示。此時(shí)新程序還沒(méi)有寫(xiě)入Flash中,而Flash中的舊程序已經(jīng)被擦除。設(shè)備重新上電后在BOOT程序中運(yùn)行,可以重新升級(jí)應(yīng)用程序恢復(fù)運(yùn)行。