《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于TMS320C6678的多核程序加載研究與實(shí)現(xiàn)
基于TMS320C6678的多核程序加載研究與實(shí)現(xiàn)
2015年電子技術(shù)應(yīng)用第3期
李飛平,卿粼波,滕奇志,舒 君,何小海
四川大學(xué) 電子信息學(xué)院,四川 成都610064
摘要: 針對(duì)多核DSP系統(tǒng)程序加載復(fù)雜的問(wèn)題,基于TMS320C6678對(duì)多核程序加載進(jìn)行了研究與設(shè)計(jì)。從一級(jí)引導(dǎo)程序出發(fā),設(shè)計(jì)并優(yōu)化了多核程序內(nèi)容存儲(chǔ)格式。設(shè)計(jì)了簡(jiǎn)潔的二級(jí)引導(dǎo)程序,以修正一級(jí)引導(dǎo)程序只識(shí)別主核程序入口地址,而從核入口地址缺失的現(xiàn)象。為了快速生成特定格式的多核程序內(nèi)容,設(shè)計(jì)了多個(gè)工具用于添加SPI啟動(dòng)參數(shù)表、DDR3啟動(dòng)表、從核程序入口地址以及完成程序內(nèi)容格式的轉(zhuǎn)換。實(shí)現(xiàn)了SPI Flash多核程序加載以及基于I2C主模式的Nand Flash多核程序加載。
中圖分類號(hào): TP368
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 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的程序加載是其開(kāi)發(fā)過(guò)程中一個(gè)重要的研究課題。多核協(xié)同工作時(shí),通常需要為每個(gè)核單獨(dú)加載用戶程序,它涉及外設(shè)的初始化、主從核任務(wù)分配以及多核程序內(nèi)容存儲(chǔ)格式等諸多問(wèn)題,工程應(yīng)用中要求系統(tǒng)能夠脫機(jī)自啟動(dòng)加載多核程序。

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

1 C6678程序加載原理

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

001.jpg

2 SPI Flash多核程序加載設(shè)計(jì)

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

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

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

007.jpg

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

002.jpg

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

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

003.jpg

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

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

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

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

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

  -order  M//生成大端格式的數(shù)據(jù)(一級(jí)引導(dǎo)程序默認(rèn)

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

  ROMS

  {

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

  romwidth = 32,files = { corex.btbl }

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

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

3 基于I2C主模式的Nand Flash多核程序加載設(shè)計(jì)


005.jpg


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

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

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

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

  3.2 EEPROM中二級(jí)引導(dǎo)程序的設(shè)計(jì)


006.jpg


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

4 設(shè)計(jì)驗(yàn)證

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

5 結(jié)論

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

  參考文獻(xiàn)

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

  [2] 陶永燕.基于TI C66多核DSP技術(shù)的研究與應(yīng)用[D].北京:北京郵電大學(xué),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] 吳家鑄,田希,趙傳軍,等.面向軟基站高密集度計(jì)算的創(chuàng)新DSP 的反匯編器研究[J].計(jì)算機(jī)工程與科學(xué),2013,35(7):1-5.

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

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

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





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