《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于TMS320C6678的多核程序加載研究與實現(xiàn)
基于TMS320C6678的多核程序加載研究與實現(xiàn)
2015年電子技術應用第3期
李飛平,卿粼波,滕奇志,舒 君,何小海
四川大學 電子信息學院,四川 成都610064
摘要: 針對多核DSP系統(tǒng)程序加載復雜的問題,基于TMS320C6678對多核程序加載進行了研究與設計。從一級引導程序出發(fā),設計并優(yōu)化了多核程序內(nèi)容存儲格式。設計了簡潔的二級引導程序,以修正一級引導程序只識別主核程序入口地址,而從核入口地址缺失的現(xiàn)象。為了快速生成特定格式的多核程序內(nèi)容,設計了多個工具用于添加SPI啟動參數(shù)表、DDR3啟動表、從核程序入口地址以及完成程序內(nèi)容格式的轉(zhuǎn)換。實現(xiàn)了SPI Flash多核程序加載以及基于I2C主模式的Nand Flash多核程序加載。
中圖分類號: TP368
文獻標識碼: A
文章編號: 0258-7998(2015)03-0031-04
Multicore program loading research and improve based on TMS320C6678
Li Feiping,Qing Lingbo,Teng Qizhi,Shu Jun,He Xiaohai
School of Electronics and Information Engineering,Sichuan University,Chengdu 610064,China
Abstract: Program loading for multicore DSP system is very complex, this paper takes a research on that issue based on TMS320C6678. According to the first level bootloader, this paper designs and improves one kind of multicore program data storage format. Since the first level bootloader can only recognize the c_int00 entry address of master core which causes the slave core′s c_int00 entry address missing, one secondary bootloader is designed to solve that problem. In order to generate the specified format multicore program for the Flash fastly, multiple utilities is designed to help adding SPI boot parameter table, DDR3 boot table, slave cores′ program entry address as well as changing program data format. SPI Flash multicore program loading and Nand Flash multicore program loading based on I2C master mode are realized in this paper.
Key words : multicore program loading;multicore program data storage format;boot configuration table;c_int00 address;second level bootloader

  

0 引言

  多核DSP的程序加載是其開發(fā)過程中一個重要的研究課題。多核協(xié)同工作時,通常需要為每個核單獨加載用戶程序,它涉及外設的初始化、主從核任務分配以及多核程序內(nèi)容存儲格式等諸多問題,工程應用中要求系統(tǒng)能夠脫機自啟動加載多核程序。

  隨著DSP的主頻越來越高以及外部接口越來越豐富,程序的加載方式也日趨復雜和多樣化。以德州儀器(TI)開發(fā)的8核keystone架構(gòu)的TMS320C6678(以下簡稱C6678)為例,它支持SPI Flash加載、I2C主從加載、網(wǎng)絡加載以及PCIe加載等多達7種方式。由于TI官方對多核DSP程序加載技術的相關指導及目前國內(nèi)外對多核程序加載的研究較少,且多核程序加載自身較復雜,大多數(shù)用戶無法深入理解多核程序加載的思想,難以在工程應用中快速實現(xiàn)多核程序的自啟動加載。本文實現(xiàn)了SPI Flash和基于I2C主模式的Nand Flash多核程序加載,提高了多核程序加載的效率。

1 C6678程序加載原理

  C6678內(nèi)部ROM中固化了一段一級引導程序,它針對不同的加載方式初始化相應外設,并從片外ROM或用戶主機等不同的存儲位置將用戶程序搬移到指定的高速存儲區(qū)中,如二級緩存(L2)或DDR3。C6678通過核索引編號(DNUM)將8個核標稱為core0~core7。只有core0有執(zhí)行一級引導程序的權限。C6678各核訪問自己的L2時,可以采用本地地址或全局地址,但訪問其他核的L2時,只能使用全局地址[1]。因此若要將多核程序存放到各核的L2中,在程序設計初期,程序各段內(nèi)容都必須使用全局地址進行映射,否則core0會將所有核的程序都搬移到自己的L2中,而導致程序被覆蓋無法執(zhí)行的錯誤。圖1是C6678多核程序加載的流程。C6678在每個核的L2中預留了一個被稱為Boot Magic Address的空間,用來存儲該核的c_int00入口地址。C6678完成多核程序的加載后,只有core0能夠自動跳轉(zhuǎn)到c_int00處執(zhí)行程序,core1~core7都處于空閑狀態(tài)(IDLE),需要core0喚醒。L2中的IPC中斷生成寄存器(IPCGRx),用于核間通信,當core0要喚醒core1,只需向IPCGR1中寫1即可[2]。

001.jpg

2 SPI Flash多核程序加載設計

  2.1 多核程序內(nèi)容存儲格式的設計與改進

  C6678的一級引導程序能識別的SPI Flash中的數(shù)據(jù)存儲格式分為兩類:(1)第一類,只含SPI啟動參數(shù)表和啟動表兩部分,其中啟動參數(shù)表含CPU時鐘、待加載表類型及偏移地址等信息;啟動表是待加載表的一種,含程序段的大小、目的地址等信息;(2)第二類,增加了啟動配置表,常用于初始化DDR3[3]。前者用于程序內(nèi)容小于512 KB,可全部搬移到L2中執(zhí)行的情況;當程序大于512 KB時,需搬移到DDR3中執(zhí)行,因此要先初始化DDR3。為增加適用性,本文采用第二類存儲格式。

  文獻[3]中,TI使用參數(shù)配置模板來初始化DDR3,即每一個寄存器都需要選擇置位、清除、保持原值中的一種模板狀態(tài)來設定每個bit位的值,用戶非常容易混淆不同模板的功能;且每個寄存器需要占用3個字的空間,造成了一定程度上的空間浪費。本文提出了將文獻[4]中提供的DDR3配置表轉(zhuǎn)換為特殊的DDR3啟動表對DDR3進行初始化的改進方式。表1以對DDR3的SDRFC寄存器進行配置為例,對兩種方式進行對比。

007.jpg

  采用參數(shù)配置模板時,當遇到連續(xù)的3個32 bit值為0的模板代表配置結(jié)束。而本文提出的方式指定了配置表的大小,不需要判定結(jié)束信息。圖2右半部分是本文最終生成的多核程序數(shù)據(jù)存儲格式,粗線框表示兩種DDR3初始化方式的差異,其中DDR3配置表存放的目的地址由一級引導程序固定為:0x00873500,SPI啟動參數(shù)表占8個字空間,DDR3配置表內(nèi)容為28個字,c_int00、各段目的地址以及大小均為1個字,其他各段內(nèi)容視程序而定。本文改進方式中,對DDR3的配置相當于core0的一段程序內(nèi)容,因此SPI啟動參數(shù)表對二者的判定亦不同,前者為啟動配置表,而后者為啟動表。

002.jpg

  2.2 多核程序內(nèi)容存儲格式的實現(xiàn)

  使用CCS開發(fā)的DSP程序,通常會生成一種COFF格式的.out文件,它包含重定位、符號表等輔助信息,格式解析復雜,且比有效數(shù)據(jù)要大數(shù)倍,造成存儲空間的浪費[5]。為了正確且快速的生成圖2所示的多核程序文件,本文采用圖3中的工具鏈對.out文件進行轉(zhuǎn)換。為了便于描述,圖3只列舉了core0的.out文件轉(zhuǎn)換為.btbl文件的過程。其中hex6x、mergebtbl、b2i2c和b2ccs是TI官方提供的工具, addcfg和addparam是本文為完善工具鏈,在VS2010平臺上開發(fā)的工具。hex6x去掉了.out文件中的所有輔助信息,并根據(jù)鏈接文件,生成特定的文件[6],.btbl文件末4個連續(xù)的值為0的字節(jié)表示文件內(nèi)容的結(jié)束;mergebtbl將多個.btbl文件進行合并[1];b2i2c將.btbl文件按124 B大小分塊,并生成相應的校驗碼字[3];b2ccs將十六進制字符合并為32 bit的十六進制數(shù)據(jù)[3];addcfg用于添加DDR3配置表到指定位置處;addparam則用于添加SPI啟動參數(shù)表。

003.jpg

  待添加的DDR啟動表的數(shù)據(jù)與.btbl格式一致,如SDRFC寄存器的內(nèi)容保存為00 00 14 50,而addparam添加的SPI啟動參數(shù)表內(nèi)的數(shù)據(jù)則與.dat格式一致,如0x00300000。由于工具鏈較長,本文采用批處理的方式將所有命令按順序?qū)懭胍粋€.bat文件中,并將多核.out文件、DDR3啟動表、SPI啟動參數(shù)表和hex6x的鏈接文件放在同一目錄下,即可一次性完成所有的轉(zhuǎn)換工作,極大地提升了轉(zhuǎn)換效率。本文所使用的hex6x工具鏈接文件如下:

  corex.out//輸入待轉(zhuǎn)換的COFF文件

  -a//生成支持32bit地址的 ASCII-Hex格式的目標文件

  -boot//轉(zhuǎn)換成啟動表格式

  -e  _c_int00//指明程序的c_int00入口地址

  -order  M//生成大端格式的數(shù)據(jù)(一級引導程序默認

  SPI中存儲的數(shù)據(jù)是按大端格式)

  ROMS

  {

  ROM1: org=0x0400,length=0x800000,memwidth=32,

  romwidth = 32,files = { corex.btbl }

  } //轉(zhuǎn)換生成corex.btbl文件(x為核號);指定存儲區(qū)

  起始地址、位寬等信息,本文對存儲區(qū)信息無要求

3 基于I2C主模式的Nand Flash多核程序加載設計


005.jpg


  NOR Flash的存儲容量通常小于16 MB,而Nand Flash則要大得多,常見的有128 MB、256 MB等。目前針對DSP系統(tǒng)的圖像處理算法越來越復雜,代碼體積急劇增加,本文設計了基于I2C主模式的Nand Flash多核程序加載方案,以供大型程序的自啟動加載。由圖2可知,SPI Flash加載多核程序時只包含了core0的c_int00地址,因此core0的程序中必須包含寫core1~7的c_int00地址到各自Boot Magic Address中的操作。若core1~7任一核的程序有改動導致其c_int00地址發(fā)生改變 ,就必須修改core0程序,重新找到并指定相應核的c_int00地址,并重新編譯core0工程,影響開發(fā)進度。本文通過基于I2C主模式的Nand Flash加載方式來解決這一缺陷。

  本加載方式中C6678作為I2C主機, EEPROM作為I2C從機用于存儲一段較小的可執(zhí)行的搬移程序,被稱為二級引導程序[7]。因為EEPROM存儲容量通常只有幾百KB,無法滿足一般用戶程序的存儲需求,真正的用戶程序則存儲在容量更大的Nand Flash中。

  3.1 Nand Flash中多核程序內(nèi)容存儲格式的設計

  Nand Flash中多核程序內(nèi)容存儲格式由二級引導程序決定,本文設計了如圖4中userapp.dat所示的存儲格式,比圖3更為簡潔,它一方面降低了二級引導程序的設計難度;一方面修正了SPI Flash加載中core1~core7的c_int00地址缺失問題。圖4中,merge_cint是本文對mergebtbl改進后的工具名,它增加了將core1~core7的c_int00地址保存在cint.map的文本文件中而不是直接丟棄處理的功能,若某核的.out文件缺失,則該核的c_int00地址為0x00000000;新設計的addentry工具的作用則是將多核合并時產(chǎn)生的cint.map文件中的c_int00地址添加到userapp.dat文件的相應位置處。

  3.2 EEPROM中二級引導程序的設計


006.jpg


  圖5是本文是針對圖4所示的多核程序存儲格式在CCS中開發(fā)的二級引導程序,它是一個與多核程序無關的獨立工程,編譯完成后,通過CCS可以直接下載到C6678系統(tǒng)的EEPROM中。加載不同的多核程序,每次只需修改Nand Flash中的內(nèi)容即可。二級引導程序循環(huán)主體部分:對Nand Flash采用隨機讀的方式,每次搬移4個字節(jié)到指定的存儲區(qū)中;core0~7的c_int00地址解析部分實現(xiàn)從Nand Flash多核程序內(nèi)容中提取8個核的c_int00地址,并依次寫入到相應核的Boot Magic Address中。為了保證多核程序的可靠加載,在c_int00地址解析以及循環(huán)主體部分,每當開始讀取新的塊時,都要檢查壞塊標志信息,以確定該塊數(shù)據(jù)是否可用[8]。

4 設計驗證

  本文采用同一個多核工程對SPI Flash和基于I2C主模式的Nand Flash兩種加載方式進行測試。該工程包含8個核的.out文件,分別命名為core0.out~core7.out,其中core0.out的大小為10 618 KB,core1.out~core7.out大小均為5 468 KB,core0開始執(zhí)行程序便向core1~core7發(fā)送IPC中斷,core1~core7成功收到中斷后分別點亮系統(tǒng)中的一盞LED燈標示程序成功執(zhí)行。本文對兩種操作方式分別進行了5次實驗,程序均成功執(zhí)行。其中SPI Flash耗時21.87 s,基于I2C主模式的Nand Flash加載耗時34.63 s。二者的時間差異來源于:Nand Flash的數(shù)據(jù)讀速率低于NOR型SPI Flash;基于I2C主模式的Nand Flash需經(jīng)歷二級加載,但如文中所述,二者各有優(yōu)劣。實際工程中應根據(jù)情況靈活選用加載方式。

5 結(jié)論

  本文總結(jié)了core0主導下的多核程序加載以及啟動的流程,設計并改進了SPI Flash多核加載,采用DDR3啟動配置表代替參數(shù)配置模板,并設計添加配置表,啟動參數(shù)表等相關工具,降低了SPI Flash多核程序加載的開發(fā)難度。針對SPI Flash多核程序加載中存在SPI Flash存儲容量偏小、core1~core7的c_int00地址缺失的問題,作為互補方案,本文設計了基于I2C主模式的Nand Flash多核程序加載,包括二級引導程序和相關工具的設計。最后通過實際的工程驗證了方案的可行性。本文也可為TI推出的C66x等系列多核DSP程序的加載提供參考,具有一定的工程應用價值。

  參考文獻

  [1] Texas Instruments. Multicore programming guide[Z].SPRA-B27A,August 2009.

  [2] 陶永燕.基于TI C66多核DSP技術的研究與應用[D].北京:北京郵電大學,2012.

  [3] Texas Instruments.DSP bootloader for keystone architectureuser′s guide[Z].SPRUGY9C,July 2013.

  [4] Texas Instruments. TMS320C6678 multicore fixed and float-ing-point digital signal processor[Z].SPRS691D,April 2013.

  [5] 吳家鑄,田希,趙傳軍,等.面向軟基站高密集度計算的創(chuàng)新DSP 的反匯編器研究[J].計算機工程與科學,2013,35(7):1-5.

  [6] Texas Instruments.TMS320C6000 assembly language tools v7.4 user′s guide[Z].SPRU186W,July 2012.

  [7] 何正軍,朱善安.TMS320DM642 DSP二級引導程序的設計與實現(xiàn)[J].電子器件,2006,29(1):260.

  [8] 文燚,謝凱年.超大容量NAND FLASH壞區(qū)管理方法的設計與實現(xiàn)[J].現(xiàn)代電子技術,2007,30(16):55-57.





此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權禁止轉(zhuǎn)載。