文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2015)03-0031-04
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]。
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ì)比。
采用參數(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)表。
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ù)表。
待添加的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ì)
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ì)
圖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.