基于TMS320C6678的多核DSP加載模式研究
摘要:德州儀器TI推出的八核DSP芯片TMS320C6678是目前基于Keystone架構(gòu)的最高性能的DSP器件,是市場上應(yīng)用廣泛的C6455高端處理平臺升級的理想選擇。本文主要研究了C6678 DSP程序的各種單核加栽和多核加載的幾種模式,主要用到多核boot技術(shù),對EMIF16 FLASH boot引導(dǎo)模式、主機(PCIe接口)引導(dǎo)模式、I2C引導(dǎo)模式、SRIO引導(dǎo)模式、網(wǎng)絡(luò)引導(dǎo)boot引導(dǎo)模式的方法做了研究,對TI的高性能多核架構(gòu)DSP芯片的程序加載提供了有效的參考幫助。
近年來,以數(shù)字信號處理器(DSP)為基礎(chǔ)的通用信號處理模塊的研制受到人們的重視,DSP技術(shù)廣泛應(yīng)用于雷達、通信、圖像處理等領(lǐng)域。隨著聲納、雷達、高清視頻以及嵌入式機器視覺等需求不斷攀升,多核DSP的應(yīng)用已成為滿足發(fā)展的重要途徑。由于DSP系統(tǒng)穩(wěn)定運行起來后,在實際的應(yīng)用中都要脫離仿真器件,實現(xiàn)系統(tǒng)的自動加載,尤其是多核DSP加載過程中,不同于多芯片間的加載方式,需要實現(xiàn)核間的調(diào)度,數(shù)據(jù)協(xié)同處理,因此多核啟動的加載方式需要做具體研究。
TMS320C6678 DSP是TI最新發(fā)布的一款基于KeyStone架構(gòu)高性能的超長指令字(VLIW)架構(gòu)芯片,片內(nèi)有8個內(nèi)核,每個核頻率為1.25 GHz,單核每秒高達40 GB MAC定點運算和20 GB FLOP浮點運算能力,工作速度可達10GHz。與目前應(yīng)用較為廣泛的TMS320C6455 DSP,為單核1.2GHz工作,定點處理能力為9600M MAC??梢奀6678的處理能力要遠強于C6455。針對C6678多核協(xié)同處理特性,本文以自定義的雙6678板卡平臺為基礎(chǔ),深入研究C6678的多種加載方式,對EMIF16 FLASH boot引導(dǎo)模式、I2C引導(dǎo)模式、SRIO引導(dǎo)模式、網(wǎng)絡(luò)引導(dǎo)boot模式做了分析和說明,主機(PCIe接口)引導(dǎo)模式、HYPERLINK引導(dǎo)模式和SPI引導(dǎo)模式的使用,本文不做說明。
1 多核加載方式論述
在C6678的片內(nèi)地址空間0x20800000到0x20B1FFFF間集成了一塊128K的內(nèi)部ROM程序,又叫做RBL(ROMBoot Loader),Rom code是C6678出廠時固化在Rom中的,用戶不能改變,在DSP復(fù)位或上電時實現(xiàn)將DSP代碼從外部接口讀入到內(nèi)部高速ram。啟動過程可以大致分為主機引導(dǎo)和內(nèi)存引導(dǎo)啟動,在內(nèi)存引導(dǎo)啟動過程代碼從一個外部內(nèi)存的加載初始應(yīng)用程序到內(nèi)部的內(nèi)存來執(zhí)行。如果主機模式,啟動程序配置DSP在被動狀態(tài),等待代碼將DSP應(yīng)用程序程序由外部主機寫入ram開始執(zhí)行。為適應(yīng)不同的系統(tǒng)要求,RBL提供了幾種啟動的執(zhí)行方式。不同的引導(dǎo)方式如表1所示。
2 多核boot預(yù)處理
C6678有8個核,采用基于KeyStone架構(gòu)的中斷控制器、核間通信寄存器以及合適的通信拓撲結(jié)構(gòu)實現(xiàn)多核間的通信,core0為主核,其它7個核可以統(tǒng)一執(zhí)行相同的Romcode代碼,也可以不同,或者根據(jù)核號(即DNUM)進行不同程序的分支。對于core0來說,它主要是讀取DEVS TAT寄存器的加載模式,并根據(jù)當前加載模式進行一些接口的初始化和PLL的配置,還要根據(jù)加載模式?jīng)Q定是否搬移數(shù)據(jù)。對于其它的7個核來說,它們主要是掛載IPC中斷,然后進入IDLE狀態(tài)等待core0發(fā)過來的中斷。中斷一到,就跳到入口地址開始執(zhí)行程序,待加載工程總體流程如圖1所示。
代碼讀入前要根據(jù)不同的boot方式進行轉(zhuǎn)換格式,轉(zhuǎn)換工具是將各核的.out文件轉(zhuǎn)換成.dat或.bin文件,也有網(wǎng)絡(luò)boot時要轉(zhuǎn)換成.eth格式的文件來傳送,不同的轉(zhuǎn)化方式在各自的boot說明中詳細闡述。無論哪一種啟動方式,首先要boot起來core0之后再引導(dǎo)其他的從核,重點是從核在boot啟動時通過host向DSP寫了MAGIC_ADDRESS并觸發(fā)IPC中斷,DSP跳轉(zhuǎn)到BOOT_MAIGC_ADDRESS所指向的地址執(zhí)行程序。
3 C6678 EMIF flash boot
3.1 core0加載
C6678的EMIF16加載是一種直接從Nor Flash(必須掛在CE2空間:0x70000000)加載core0的模式,不需要I2CEEPROM的參與,由Rom code初始化EMIF16接口,由于EMIF16外接Nor Flash是一種XIP器件,因此直接跳到Nor Flash的起始地址處開始執(zhí)行。
為了將Nor Flash中的代碼搬移到C6678的core0的L2SRAM中,需要在core0的待加載工程中編寫引導(dǎo)代碼,此引導(dǎo)代碼的作用就是將core0的代碼按段加載到內(nèi)存中,最后跳到入口地址處開始執(zhí)行。引導(dǎo)代碼放在L2 SRAM的前1KB空間,并燒寫到Nor Flash的前1KB空間,應(yīng)用代碼放到1KB后面,生成.out文件編寫轉(zhuǎn)化工具生成.dat文件,如圖2所示Nor Flash代碼格式:
3.2 core0加載其它核
在多核加載過程中,core0是主核,corel-core7是從核,由core0加載從核,具體步驟是:
1)上電后,core0完成程序加載,并跳到入口地址開始執(zhí)行程序。
2)在core0主程序中.core0從Nor Flash中讀取corel的代碼,并按段加載到core1的L2 SRAM,然后將core1程序的入口地址寫到core1的BOOT_MAGIC_ADDRESS,最后向core1發(fā)送IPC中斷,其它核的加載過程一樣。各個核的Nor Flash空間分配如表2所示。
在將c_int00地址寫到magic address時,注意需要確保寫的是全局地址,如當程序放在L2時,c_int00地址應(yīng)該轉(zhuǎn)換為0x1n8xxxxx,其中n為coreID.
4 C6678 I2C boot
C6678的I2C boot是通過I2C總線讀取掛載在總線上的eepromm中的IBL讀取參數(shù)表配置RBL加載應(yīng)用程序到的指定數(shù)據(jù)塊。可以操作主I2C模式或從模式,在主模式的DSP讀取帶有鏡像文件的I2C從設(shè)備。在從模式,DSP為I2C連接的從設(shè)備,主設(shè)備大多是另一個DSP或FPGA。
4.1 單核啟動模式
單核啟動包括:RBL、IBL、應(yīng)用程序。對于I2C啟動,需要做的主要有4步:
1)編譯IBL:不同版本的IBL,其目錄下的內(nèi)容有些差別。編譯IBL需要的工具有TI CGEN eompiler CGT_C6000_7.x和MinGW。
2)將編譯好的IBL寫到EEPROM中,并根據(jù)需要修改EEPROM中的IBL configuration table;
3)將應(yīng)用程序?qū)懙絅OR FLASH或NAND FLASH中:
首先要編寫格式轉(zhuǎn)化工具,將CCS生成的應(yīng)用程序拷貝到格式轉(zhuǎn)化工具中,將ELF格式的.out轉(zhuǎn)換成CCS格式的數(shù)據(jù)文件.dat,然后將該.dat寫到NOR FLASH或者NAND FLASH即可。
4)將撥碼開關(guān)撥到相應(yīng)的啟動模式。C6678板卡NORboot的bootmode[]=101000100010000,NAND boot的bootmode[]=101010000010000。
4.2 多核啟動模式
多核啟動包括核內(nèi)RBL、IBL、MAD、應(yīng)用程序。
采用pre-link模式:在這種操作模式下的MAP工具為應(yīng)用程序段做地址分配和調(diào)用pre-linker。這種模式適合使用在多核,是應(yīng)用程序開發(fā)人員想要MAP工具協(xié)助地址分配,使多核應(yīng)用之間的通用代碼共享。
MAD引導(dǎo)的多核裝載的過程有以下幾個步驟:
1)在啟動時候,DSP設(shè)備將運行ROM引導(dǎo)裝載程序,將加載并運行在i2c eeprom上載好的IBL。
2)IBL將下載MAD鏡像文件從tftp服務(wù)器(MAD文件也可以存數(shù)在板上的NOR/NAND FLASH中)到DDR中。給IBL配置了一個執(zhí)行程序的入口地址,在非MAD引導(dǎo)的情況下,此地址將是運行程序下載的入口地址,在MAD引導(dǎo)情況下,IBL配置為跳轉(zhuǎn)到MAD Lader的入口地址。
3)MAD引導(dǎo)裝載程序情況,裝載應(yīng)用程序段,在每個配置好的核的運行地址開始執(zhí)行程序。
5 C6678網(wǎng)絡(luò)boot
C6678芯片網(wǎng)絡(luò)通過MARVEL控制芯片與外部RJ45網(wǎng)絡(luò)接口相連,注意增加通過MDIO對MARVEL芯片的控制,從而實現(xiàn)與PC的通信。建立C66 78的網(wǎng)絡(luò)boot主要有圖3所示過程。
DSP內(nèi)RBL主要配置SerDes,SGMII,SWITCH以及多核導(dǎo)航器,準備通過千兆以太網(wǎng)接口接收boot table。這些最初的配置是通過查詢與啟動模式相關(guān)的DEVSTAT寄存器和引導(dǎo)網(wǎng)絡(luò)boot的parameter table。在啟動模式選定后,PA子系統(tǒng)的時鐘主要參考main PLL的參考時鐘或Ser Des參考時鐘。
1)使用arp指令查看網(wǎng)絡(luò)緩存區(qū)鏈接狀態(tài),arp-a檢測網(wǎng)口外接的設(shè)備。
2)使用hex6x.exe將out文件生成hex文件:要有*.cmd文件和hex6x.exe和*.out文件。
3)編譯生成.eth網(wǎng)絡(luò)boot格式文件:最好將編譯工具放到本目錄下編譯,轉(zhuǎn)化得到.eth網(wǎng)絡(luò)文件。
4)獲取板卡的MAC地址:正確配置板卡的撥碼開關(guān)。
配置正確以后PC就能收到板卡發(fā)出的BOOTP包(3 s周期),設(shè)置C6678的bootmode[]=010000100111000。查看板卡的MAC地址:通過wires hark抓包獲取板卡板的MAC地址。
5)傳輸boot文件:MINGW環(huán)境里面運行指令,綁定板卡的MAC地址和IP,設(shè)置板卡IP地址為192.168.1.2,PC端的地址為192.168. 1.1。文件傳輸指令pcsendpkt.exe simple.eth 192.168.1.2。發(fā)送文件到板卡內(nèi)存,傳輸文件成功后可以板卡停止向PC發(fā)送MAC地址,并且可以看到PC向板卡利用UDP協(xié)議傳輸DSP Core0的代碼,Wireshark抓取網(wǎng)口數(shù)據(jù)包結(jié)果如圖4所示。
將Core0的代碼存到DSP的內(nèi)存,此時Core0仍處于boot load的EMAC加載模式,當發(fā)送完畢代碼后,向Core0發(fā)送結(jié)束包.Core0根據(jù)EMAC加載協(xié)議,當收到該包后則從加載模式跳轉(zhuǎn)為正常模式,PC指針從指定的程序入口地址處開始運行。
6)在core0加載的程序中編寫core1到core7的加載程序,通過網(wǎng)口讀入coreN各個核的代碼程序到對應(yīng)的RAM中,如果7個從核的代碼相同,只用讀入一次從核心代碼,加載到7個核中,0核像7個核發(fā)送IPC中斷觸發(fā)運行程序。觀察程序跳轉(zhuǎn)地址到設(shè)定的地址處,驗證程序運行結(jié)果。
6 C6678 SRIO boot
C6678支持的SRIO協(xié)議為2.1版本,link rate速率即1.25G,2.5G,3.125Gbit,使用4x模式。SRIO協(xié)議規(guī)定有兩種傳輸方式:Direct IO與Message方式。當DSP處于SRIO bootload模式時,將代碼直接寫入DSP內(nèi)存并中斷.DSP立即從boot模式跳轉(zhuǎn)到正常模式,執(zhí)行加載的代碼.
1)程序文件格式的轉(zhuǎn)換:
①使用代碼轉(zhuǎn)換工具hex6x.exe轉(zhuǎn)換ELF格式的out文件成為十六進制格式的boot table文件。
②使用Bttbl2Hfile.exe,hfite2array.exe將boot table文件轉(zhuǎn)換為一個DAT格式文件。
③復(fù)制生成文件到\srioboot_example\src,使boot image鏈接到DSP的啟動程序中。
2)DSP boot過程:DSP boot工程使用多核程序包的BIOS支持庫來初始化DDR,它首先從SRIO連接的DSP中通過SRIO將DDR的初始化程序的代碼讀入到Core0的L2RAM中,然后寫入DDR初始化引導(dǎo)程序的入口地址到core0的boot magic address中。在DSP上運行的RBL檢測到core0發(fā)起的入口地址,并跳轉(zhuǎn)開始啟動初始化DDR。DDR的初始化代碼在初始化DDR正確后將繼續(xù)校驗SRIO boot magicaddress,SRIO boot引導(dǎo)流程如圖5所示。
然后從DSP將由SRIO把應(yīng)用程序引導(dǎo)到本地的DDR內(nèi)存啟動板卡,寫入的應(yīng)用程序的入口地址到core0。Core0開始啟動和打印啟動信息,并通過write_boot_magic_number()和一個IPC中斷發(fā)送到其它核心,寫入入口地址啟動其它從核,程序會跳轉(zhuǎn)到其它核上運行的寫boot地址命令開始啟動,每個核心將寫入0xBABEFACE到對應(yīng)的SRIO boot magicaddress。
3)板卡SRIO boot:板卡上包含兩片C6678芯片,SRIOboot。兩片C6678通過4xlane差分線互聯(lián),使用RS-232總線連接到PC的串行端口,板卡設(shè)置boot模式,C6678_A的bootmode []=100000101011000,C6678_B的bootmode []=100000101011100。這將設(shè)置引導(dǎo)板從SRIO啟動,參考時鐘頻率為312.5 MHz,數(shù)據(jù)速率3.125 GBs和lane設(shè)置4x端口,在1GHz的系統(tǒng)時鐘。
打開超級終端或TERA終端連接,設(shè)置波特率115200,數(shù)據(jù)8位,無奇偶校驗,停止位和流量控制,連接主機的CCSv5,加載和運行srio boot_example_evm66xxl.out程序。CCS控制臺將顯示以下消息:…[C66xx_0]Transfer boot code via SRIO successfully
超級終端會顯示以下消息:SRIO Boot Hello World Example Version 01.00.00.01;Booting Hello World image on Core0 from SRIO … … Booting Hello World image on Core7 from Core 0
7 結(jié) 論
TMS320C6678是8內(nèi)核的DSP,主要實現(xiàn)了系統(tǒng)自動加載boot load程序,支持的多種加載方式:主要有EMIFFLASH加載、網(wǎng)絡(luò)EMAC加載,以及SRIO加載和I2C加載。多種加載方式能為實測項目應(yīng)用中達到更高的效率,在數(shù)字信號處理系統(tǒng)中多核DSP的發(fā)展必然成為一種趨勢,多核間的有效加載更直接影響到項目的整體特性,按照該設(shè)計思路編制的boot load方法已在TMS320CC6678+FPCA的CPCI處理卡中得到應(yīng)用,應(yīng)用的高端處理平臺可使用于航天領(lǐng)域、船舶領(lǐng)域、無線平臺和高速圖像處理領(lǐng)域等,多核DSP系統(tǒng)能很好的復(fù)位及快速完成多核間的加載,系統(tǒng)運行穩(wěn)定可靠性較高。