楊海學,張 偉,李小齊,何 斌
(中電科蓉威電子技術有限公司,四川成都 610036)
TMS320C6678 是TI 公司的一款高性能超長指令字架構的數(shù)字信號處理技術芯片,由于它具有多核、高頻率、定點浮點運算能力強等特點,作為當前高端信號處理芯片,在圖形圖像、通信、醫(yī)療和雷達信號處理領域得到了廣泛應用[1-5]。
多核TMS320C6678 的程序加載可通過外部擴展的存儲器或遠程工控機來進行。目前使用的加載接口有I2C、SPI、PCIE、EMIF、SRIO、SGMII 等,通過設置硬件管腳BOOTMODE[12:0]的值,均可作程序的啟動接口[6]。在實際的星載、雷達、機載等場景中,一般是通過外接存儲器進行啟動,當需要在線重構時,TI提供的眾多啟動方案卻難以滿足。
TMS320C6678 提供了很多加載模式,包括EMIF boot、SPI boot、I2C boot、SRIO boot、ETHERNET boot、PCIE boot等。在進行任何加載之前,都需要執(zhí)行一級啟動(芯片內部的RBL:ROM Boot loader),一級啟動主要有如下操作:使能重啟隔離功能;使能boot過程中所有可能需要用到的外設的時鐘;配置系統(tǒng)PLL、DDR以及L1D和LIP;讀取BOOTMODE的配置模式[7]。
若使用SRIO boot、ETHERNET boot和PCIE boot,則需要通過遠程工控機將執(zhí)行代碼通過相對應的接口發(fā)送至板上內存運行。若使用SPI boot、I2C boot 啟動,指針會直接指向外掛存儲單元,通過自動搬移將運行代碼搬入內存運行,EMIF boot 啟動也是直接指向外掛存儲單元,但是需要自己將代碼搬移到內存運行。C6678 加載模式分類如圖1 所示。
圖1 C6678加載模式分類
文獻[8]研究了I2C的二級加載啟動方式,它是基于TI公司提供的開發(fā)套件IBL(Intermediate Bootloader),但是采用I2C啟動方式需要掛載額外的EEPRAM 做啟動牽引,然后再從NOR FLASH 或者NAND FLASH 加載用戶應用程序,對成本和硬件空間設計均不友好。文獻[9]通過優(yōu)化程序存儲格式實現(xiàn)優(yōu)化啟動速度,具有一定的工程價值,但是需要每次對代碼進行格式修改。也有學者使用基于SPI 的啟動方式加入了二級Boot Loader,旨在實現(xiàn)一套多級加載模式,效果較好,但是針對啟動而言,受SPI 接口速度的限制,不能達到快速啟動的要求,動態(tài)重構采用串口方式也會降低升級速率[10]。文獻[11]介紹了EMIF 總線的加載方式,通過EMIF外掛存儲單元方式實現(xiàn)快速啟動,沒有進一步進行二級啟動和動態(tài)重構的研究。文獻[12-15]主要關注多核代碼的部署,通過TI 提供的工具或自己研發(fā)的工具實現(xiàn)將多個應用程序進行合并之后再部署,都沒有談及在線重構的問題。文獻[16]展示了一種可以利用C6678 網(wǎng)口自動升級DSP 內部程序的方法,可是該方法沒有進一步做多級啟動方案,網(wǎng)口因做升級部署而被占用,故使用場景受限。
綜上,在一些特殊場景中,需要采用較快速的多級啟動方式,并且可能隨時需要進行動態(tài)重構,若采用仿真器更新,靈活性較差。為此,該文設計了一種基于EMIF接口的多級加載與在線動態(tài)重構方案,該方案硬件需求簡易,啟動速度較快,并且在不掉電的情況下能夠在線重構應用程序,具有很高的實際運用價值。
為了實現(xiàn)多級加載與動態(tài)重構,該文通過EMIF總線外掛NOR FLASH 芯片,將引導外設開關BOO TMODE[12∶0]配置為EMIF 啟動。在一級啟動RBL完成之后,直接跳轉到EMIF 接口進行啟動引導。
將NOR FLASH 的空間分為獨立的三段。其中,第一段為部署段,第二段為動態(tài)重構段,第三段為應用段,具體分布如圖2 所示。
圖2 EMIF外掛NOR FLASH分區(qū)
三段各有一套代碼,相互獨立。部署段主要用于部署后兩段的程序,重構段主要用于在線重構,應用段放置用戶的使用程序。
部署段程序主要包含三個部分,第一部分為匯編搬移代碼,第二部分為初始化,第三部分為部署執(zhí)行,部署程序流程圖如圖3 所示。
圖3 部署段程序流程圖
對于從EMIF 啟動,由于工藝水平的限制,部署程序在片外存儲器中的執(zhí)行速度遠小于片內存儲器中的執(zhí)行速度。因此,需要執(zhí)行一段匯編代碼,將部署段的程序搬移到片內高速緩存中,并跳轉至片內高速緩存中執(zhí)行[1]。
以下是bootloads.s 部分代碼示例:
初始化部分主要涉及到電源管理控制器(Power Sleep Controller,PSC)、鎖相環(huán)(Phase Lock Loop,PLL)、串口(UART)和DDR 等系統(tǒng)必備模塊的初始化。
部署執(zhí)行通過外部的串口輸入值,進行選擇部署,該文設計串口輸入為2 時,則部署重構段代碼,串口輸入其他值或沒有輸入時,則直接部署應用段代碼。
部署執(zhí)行代碼是基于TI 公司提供的開發(fā)工具包里的IBL 進行修改的,原本的IBL 編程主要放置在I2C的EEPRAM 中,用于引導部署存放在外部FLASH 內的程序,并且可以同時部署多核應用程序。該次將其代碼進行修改,放置在部署段中,對后面重構段與應用段進行部署。
重構段:該文通過傳輸速度較快的以太網(wǎng)口進行重構。重構段的程序分三步:首先,完成以太網(wǎng)口和串口的初始化。然后,通過接收外部串口的輸入選擇更新的段,通過TCP 或者UDP 接收外部客戶端的更新數(shù)據(jù),最后,將數(shù)據(jù)寫入相對應的NOR FLASH 區(qū)域,向網(wǎng)口發(fā)送完成重構結束命令,重構軟件流程圖如圖4 所示。
圖4 重構軟件流程圖
網(wǎng)口初始化主要依托NDK(一種基于SYS/BIOS實時多任務操作系統(tǒng)的網(wǎng)絡開發(fā)集成工具),其提供了所有以太網(wǎng)開發(fā)需要的硬件驅動、用戶接口(Socket)和各層協(xié)議。NDK 主要由Nettool.lib、Stack.lib、OS.lib、Hal.lib、Netcrl.lib 五部分組成。分別對應網(wǎng)絡應用開發(fā)工具、協(xié)議棧、操作系統(tǒng)接口、底層硬件驅動和網(wǎng)絡控制層。
整個重構程序基于SYS/BIOS 實時多任務操作系統(tǒng),采用Socket 套接字,創(chuàng)建UDP 服務器端(Server)等待外部連接,外部客戶端(Client)連接服務端發(fā)送待更新的數(shù)據(jù)包,服務端將對接收到的數(shù)據(jù)進行解析,當包總數(shù)和包序號相等時,則表示數(shù)據(jù)全部接收完畢,將更新的數(shù)據(jù)拼接之后放入內存中,然后再寫入NOR FLASH。
1)串口輸入為0,擦除NOR FLASH的部署段,接收更新的數(shù)據(jù)包并燒寫NOR FLASH 中的部署段程序;
2)串口輸入為1,擦除NOR FLASH的重構段,接收更新的數(shù)據(jù)包并燒寫NOR FLASH 中的重構段程序;
3)串口輸入為2,擦除NOR FLASH 的應用段,接收更新的數(shù)據(jù)包并燒寫NOR FLASH 中的應用段程序。
燒寫完畢之后,向服務器端發(fā)送結束包,表示已完成接收,之后采用硬/軟復位,即寫RSCTRL 寄存器實現(xiàn)復位,F(xiàn)LASH 燒寫流程圖如圖5 所示。
圖5 FLASH燒寫流程圖
綜上可知,在不掉電的情況,重構段的任務核心在于與外部建立網(wǎng)絡連接,通過網(wǎng)絡協(xié)議接收待重構的代碼數(shù)據(jù),將接收到的完整數(shù)據(jù)燒寫入NOR FLASH 相應的段,最后采用硬/軟復位重啟,從而實現(xiàn)在線的動態(tài)重構。
應用段:應用程序主要是用戶的實際使用代碼,根據(jù)實際的情況,無論單核應用程序還是多核應用程序,均可部署。
為了驗證該設計的有效性,基于某項目要求搭建相應的硬件平臺,如圖6 所示。該設計采用的是32 MB 的NOR FLASH,外掛在EMIF 接口總線上,依次規(guī)劃為部署段8 MB,網(wǎng)絡重構段占用8 MB,應用代碼段占用16 MB 空間。
圖6 硬件平臺結構搭建
調試階段,準備好部署程序、重構程序和應用程序后,通過仿真器將其代碼都燒入NOR FLASH。CCS 環(huán)境編譯生成的.out 文件不能直接燒寫NOR FLASH,必須用TI 公司提供的三個工具軟件hex6x.exe、b2ccs.exe 和ccs2bin.exe,將.out文件轉換為.bin 文件,若應用代碼涉及多核時,還需要軟件mcaimage.exe,并結合.cfg 文件(對多核的程序配置文件)將多個.out 文件轉換成.image 文件。最后,將部署程序、重構程序和應用程序分別燒入FLASH 地址0x70000000、0x70800000、0x71000000,分段燒寫完成后關電,設置為EMIF 啟動方式重啟。對該設計進行測試,主要有兩種場景,一種是直接啟動,另一種是進行在線重構。
測試第一種場景,即直接啟動應用代碼。上電啟動之后,串口無輸入或者接收下發(fā)1 時,直接對應用代碼進行啟動,該次測試的應用程序是基于TI 提供的庫函數(shù)做的接口初始化程序,版本為V1.0,記錄了打印顯示,可以直接完成應用段啟動。
測試第二種場景,即實施在線重構應用代碼,該次重構代碼版本為V2.0。外部復位之后,串口下發(fā)2,將啟動重構段程序,輸出打印,如圖7 所示。
圖7 重構程序啟動顯示
重構段程序將初始化串口與以太網(wǎng)口,通過串口選擇需要更新的應用段程序,連通網(wǎng)絡建立服務端,等待客戶端向DSP 發(fā)送將要固化的代碼,該次客戶端運行在基于VC++的MFC 界面,程序中需設計兩個同步線程,用來實現(xiàn)數(shù)據(jù)的實時接收顯示功能。
該次測試選擇動態(tài)重構應用段代碼(串口持續(xù)輸入2),當接收網(wǎng)絡數(shù)據(jù)包結束之后,將應用段對應的FLASH 段進行擦除與寫入(地址:0x71000000),完成之后,通過網(wǎng)口回復完成包,最后通過寫寄存器實現(xiàn)硬/軟復位,過程顯示如圖8 所示。復位之后,通過打印可以觀察到,直接啟動的應用代碼由之前的V1.0 升級為V2.0,證實了該重構的有效性。
圖8 代碼重構過程顯示
可見,該設計在不需要更新時,串口無輸入即可,需要更新應用段程序時,串口持續(xù)輸入2 即可。完成重構之后,會直接進入硬/軟復位。
該文對TMS320C6678 的加載模式進行研究和擴展,設計和實現(xiàn)了一套基于EMIF 接口的多級加載和動態(tài)重構方案,通過搭建軟硬件對設計方案進行了驗證,結果表明,該方案能夠實現(xiàn)快速的EMIF 二級加載,并且能夠實現(xiàn)在線重構功能,能極大地簡化后期產品的運行維護和升級,具有一定的參考價值。