關(guān)鍵詞 視頻設(shè)備驅(qū)動(dòng)程序 TMS320F2812 DSP/BI0S GIO/FVID模型
引言
隨著時(shí)代的發(fā)展,DSP技術(shù)在遠(yuǎn)程監(jiān)控、可視電話、工業(yè)檢測等視頻處理領(lǐng)域得到了廣泛的應(yīng)用,對于不同的視頻處理系統(tǒng),會(huì)使用不同的視頻設(shè)備,所以有必要為視頻沒備設(shè)計(jì)驅(qū)動(dòng)程序,為高層應(yīng)用程序提供統(tǒng)一的接口來操作底層硬件。只要是遵循此驅(qū)動(dòng)程序接口標(biāo)準(zhǔn)開發(fā)的高層應(yīng)用程序,都可以在具有相同接口的不同硬件平臺(tái)上運(yùn)行,具有很好的通用性和可移植性。同時(shí)高層應(yīng)用程序設(shè)計(jì)人員只要會(huì)使用設(shè)備驅(qū)動(dòng)程序提供的API接口,就不必了解底層硬件的具體實(shí)現(xiàn),可以大大提高整個(gè)視頻系統(tǒng)的開發(fā)效率。
對于視頻設(shè)備,TI公司也提出了對應(yīng)的視頻設(shè)備驅(qū)動(dòng)程序模型,但這些模型主要是針對6000系列高端DSP,甚至是DM64X這樣的視頻處理專用DSP設(shè)計(jì)的。而TMS320F2812(簡稱F2812)DSP這樣的低端處理器,內(nèi)部存儲(chǔ)空間較小,且沒有DM64X那樣專用的視頻接口。本文針對這類問題,提出了對TI視頻驅(qū)動(dòng)模型進(jìn)行簡化和改造的方法,使視頻設(shè)備驅(qū)動(dòng)程序占用盡量少的系統(tǒng)資源,來完成對視頻硬件設(shè)備的操作。這種視頻驅(qū)動(dòng)模型的裁減方法,對于使用低端處理器的視頻處理系統(tǒng)具有借可鑒性。
1、基于DSP/BIOS的外設(shè)驅(qū)動(dòng)開發(fā)模型
TI公司為開發(fā)DsP的外設(shè)驅(qū)動(dòng)程序,推出了DSP/BIOS Device Driver kit,定義了標(biāo)準(zhǔn)的設(shè)備驅(qū)動(dòng)模型,并提供了一系列的API接口。如圖1所示,外設(shè)驅(qū)動(dòng)程序分為兩層:
①類驅(qū)動(dòng)(class driver)。類驅(qū)動(dòng)程序用來為應(yīng)用程序提供接口。這部分程序與設(shè)備無關(guān),主要功能包括維護(hù)設(shè)備數(shù)據(jù)緩沖區(qū),向上提供API接口供應(yīng)用層程序調(diào)用,并協(xié)調(diào)應(yīng)用程序?qū)ν庠O(shè)操作的同步和阻塞;向下提供適配層與迷你驅(qū)動(dòng)層相連,實(shí)現(xiàn)API接口函數(shù)到迷你驅(qū)動(dòng)層程序的映射。類驅(qū)動(dòng)程序與硬件無關(guān),只要外設(shè)驅(qū)動(dòng)模型選定了,類驅(qū)動(dòng)程序就定下來了,不需要做多少修改。
②迷你驅(qū)動(dòng)(mini driver)。迷你驅(qū)動(dòng)程序與設(shè)備相關(guān),所以設(shè)計(jì)迷你驅(qū)動(dòng)程序是外設(shè)驅(qū)動(dòng)開發(fā)中的重點(diǎn)。迷你驅(qū)動(dòng)程序與類驅(qū)動(dòng)層的接口格式是統(tǒng)一的,但迷你驅(qū)動(dòng)程序?qū)Φ讓佑布牟僮魇歉鶕?jù)硬件平臺(tái)的不同而變化的。迷你驅(qū)動(dòng)接收類驅(qū)動(dòng)層發(fā)出的IOM_Packet命令包,決定對底層硬件進(jìn)行什么樣的操作。
外設(shè)驅(qū)動(dòng)程序模型又可以分為以下3類:
①PIP/PI0模型。基于數(shù)據(jù)管道的I/O模型,每個(gè)管道都在維護(hù)自己的一個(gè)緩沖區(qū)。當(dāng)數(shù)據(jù)寫入緩沖區(qū),或從緩沖區(qū)取出數(shù)據(jù)時(shí),便會(huì)激發(fā)notifyReader和notifyWriter函數(shù)實(shí)現(xiàn)數(shù)據(jù)的同步。
②SIO/DIO模型。基于數(shù)據(jù)流的I/O模型,一個(gè)數(shù)據(jù)流是單向的,要么是輸入,要么是輸出,而且SIO/DIO模瓔使用異步方式來操作I/0,對于數(shù)據(jù)的讀寫、處理可以同時(shí)進(jìn)行。
③GI0模型。通用的I/O模型,靈活性很強(qiáng),且沒有適配層,直接操作迷你驅(qū)動(dòng)程序,主要用來設(shè)計(jì)新型的設(shè)備驅(qū)動(dòng)模型。
2、視頻處理系統(tǒng)硬件平臺(tái)
硬件平臺(tái)如圖2所示。系統(tǒng)以TI公司的F2812 DSP作為中心處理器,以模擬攝像機(jī)進(jìn)行視頻信號(hào)采集,再使用SAA7111視頻解碼芯片將其轉(zhuǎn)換為BT601格式的數(shù)字視頻信號(hào)。DSP將數(shù)字視頻信號(hào)處理后,再寫入輸出幀緩存AL422中,并控制視頻編碼芯片ADV7177,將其轉(zhuǎn)換為模擬電視信號(hào)輸出。整個(gè)系統(tǒng)以l片CPLD——IspMachLC4128來協(xié)調(diào)各個(gè)芯片之間的時(shí)序關(guān)系。
系統(tǒng)工作過程:圖像信號(hào)經(jīng)由LVDS轉(zhuǎn)換芯片后轉(zhuǎn)換成LVTTL信號(hào),直接傳送至FPGA解碼為8位數(shù)據(jù),以字節(jié)方式一行一行寫入SRAM靜態(tài)存儲(chǔ)器(存儲(chǔ)器由兩部分組成),用于乒乓緩存輸入數(shù)據(jù),每部分滿1幀后由FPGA控制送出幀中斷給DSP,DSP啟動(dòng)EDMA讀入1幀數(shù)據(jù),采用JPEG2000方式編碼后連續(xù)寫入到FIFO_OUT,F(xiàn)PGA負(fù)責(zé)從FIFO_OUT讀出數(shù)據(jù),非空即讀,緩存積累不會(huì)超過1幀數(shù)據(jù)。讀出的數(shù)據(jù)另行打包后以9 Mb/s的碼率通過DS26LV31 422接口芯片從out1接口輸出,或者分流后從out1和out2以各4.5 Mb/s的碼率輸出。
2 FPGA功能模塊設(shè)計(jì)
2.1 Camera Link接口模塊
Camera Link接口模塊負(fù)責(zé)對高頻幀數(shù)字?jǐn)z像頭輸出的LVDS信號(hào)轉(zhuǎn)換為TTL標(biāo)準(zhǔn)信號(hào)。
關(guān)于Camera Link的采集數(shù)據(jù)的邏輯代碼,關(guān)鍵之處在于產(chǎn)生存儲(chǔ)器的地址信號(hào)、存儲(chǔ)器寫信號(hào)以及在對應(yīng)的地址處將數(shù)據(jù)穩(wěn)定地寫進(jìn)存儲(chǔ)器。本系統(tǒng)用像素時(shí)鐘產(chǎn)生列地址計(jì)數(shù)器、行同步信號(hào)產(chǎn)生行地址計(jì)數(shù)器,兩者拼接產(chǎn)生存儲(chǔ)器的地址信號(hào)。這樣產(chǎn)生的有效地址雖然不連續(xù),但意義明確,而且有利于顯示部分的隔行隔列顯示。對于8 bit的數(shù)據(jù),可將2個(gè)有效數(shù)據(jù)拼接成16 bit后再存儲(chǔ),這樣可以提高FPGA讀寫存儲(chǔ)器的速度。
Camera Link接口時(shí)序如圖2所示。
圖2中:VD為幀同步信號(hào),電平模式,高電平有效;HD為行同步信號(hào),脈沖模式,上升沿有效;PCLK為像素同步時(shí)鐘,脈沖模式;DATA為10 bit圖像數(shù)據(jù),在PCLK的下降沿推出,接收端在PCLK上升沿采集,PCLK為常運(yùn)行模式。每個(gè)VD有效期內(nèi)有480個(gè)HD有效信號(hào),在第0~478個(gè)HD有效時(shí),每個(gè)HD有效期間有600個(gè)有效圖像數(shù)據(jù),第479個(gè)HD(即每幀的最后1行)有效時(shí),前600個(gè)DATA為有效圖像數(shù)據(jù),600個(gè)DATA后預(yù)留6個(gè)字節(jié)輸出圖像相關(guān)信息,即第D600~D605為預(yù)留字節(jié)。
2.2 SRAM乒乓緩存
在圖像采集處理系統(tǒng)中,DSP的壓縮算法在實(shí)現(xiàn)時(shí)間上往往并不是固定不變的,然而前端的采集模塊卻使用均勻速度對圖像進(jìn)行采集,這樣存在時(shí)間上的不同步,有可能會(huì)導(dǎo)致圖像數(shù)據(jù)的丟失和影響幀數(shù)據(jù)的完整性[2]。為此,本系統(tǒng)在采集和壓縮模塊之間增加1個(gè)緩沖電路來解決這一問題。
常用的緩沖電路主要有3種[3]:雙口RAM結(jié)構(gòu)、FIFO結(jié)構(gòu)和乒乓結(jié)構(gòu)。由于乒乓結(jié)構(gòu)可以使用相對比較便宜的高速大容量SRAM,而且可以實(shí)現(xiàn)數(shù)據(jù)的連續(xù)性,因此本系統(tǒng)采用了乒乓結(jié)構(gòu)雙SRAM作為視頻數(shù)據(jù)的緩沖。在將1幀圖像的數(shù)據(jù)全部存儲(chǔ)完以后,DSP再利用很短的時(shí)間直接將1幀圖像數(shù)據(jù)讀入片內(nèi),這樣既可以保證不丟失像素?cái)?shù)據(jù)、DSP可以連續(xù)采集每1幀像素?cái)?shù)據(jù),又能為DSP留出更多空余時(shí)間,為后面進(jìn)行圖像處理提供可能。為了實(shí)現(xiàn)數(shù)據(jù)幀的完整性,必須保證讀取數(shù)據(jù)幀的優(yōu)先級(jí)要高于寫數(shù)據(jù)幀的優(yōu)先級(jí),所以本系統(tǒng)的數(shù)據(jù)輸入輸出單元是根據(jù)數(shù)據(jù)處理流程來進(jìn)行切換的。
乒乓控制模塊按照功能還分為:S0、S1、S2、S3 4個(gè)轉(zhuǎn)換狀態(tài)。其中,狀態(tài)S0為初始化狀態(tài)(所有信號(hào)都處于初始化狀態(tài)),系統(tǒng)加電或者復(fù)位后進(jìn)入此狀態(tài);在S1狀態(tài),主要負(fù)責(zé)對SRAM0的寫入,不可以對SRAM1進(jìn)行讀操作;在S2狀態(tài),主要負(fù)責(zé)對SRAM1進(jìn)行寫操作,對SRAM0進(jìn)行讀操作,當(dāng)SRAM1寫完后,如果SRAM0未讀完,則繼續(xù)處于狀態(tài)S2,如果SRAM0讀完,則進(jìn)入狀態(tài)S3;在S3狀態(tài),主要負(fù)責(zé)對SRAM0進(jìn)行寫操作,對SRAM1進(jìn)行讀操作,當(dāng)SRAM0寫完后,如果SRAM1未讀完,則繼續(xù)處于狀態(tài)S3,如果SRAM1讀完,則進(jìn)入狀態(tài)S2。乒乓控制模塊狀態(tài)轉(zhuǎn)換圖如圖3所示。
SRAM乒乓電路如圖4所示。圖中,wr_data為Camera Link接口接收到的只包含灰度信號(hào)的圖像數(shù)據(jù)。為了方便圖像數(shù)據(jù)的管理,每個(gè)像素、每行的像素都對應(yīng)到了SRAM的固定地址,所以wr_addr為該像素在SRAM中的地址,同時(shí)也可以表示該像素在一幅圖像中的位置。CHANNEL_SEL為讀SRAM的標(biāo)志位,0代表SRAM0,1代表SRAM1。
2.3 FIFO緩存模塊和RS422傳輸模塊
由于DSP向RS422模塊傳輸數(shù)據(jù)并不是勻速傳輸,而且傳輸速度比RS422的傳輸速度快很多倍,所以必須采用FIFO模塊。
3 DSP程序設(shè)計(jì)
TI公司的TMS320DM642芯片是一款高性能視頻處理器,其主頻可以高達(dá)600 MHz,數(shù)字處理能力可以達(dá)到4 800 MI/ps[3]。
DSP工作流程圖如圖5所示,DSP在相關(guān)外設(shè)與EDMA相關(guān)寄存器初始化完成后,才開始響應(yīng)中斷事件觸發(fā)EDMA傳輸,在本系統(tǒng)中由EXITUINT4中斷上升沿觸發(fā)EDMA進(jìn)行傳輸。在接收到FPGA發(fā)送的中斷信號(hào)后,開始進(jìn)行EDMA傳輸,整個(gè)EDMA傳輸?shù)倪^程需要10 ms左右,傳輸完成后觸發(fā)EDMA中斷,在中斷服務(wù)函數(shù)中觸發(fā)1個(gè)軟中斷,在軟中斷服務(wù)函數(shù)中進(jìn)行圖像數(shù)據(jù)的壓縮。
3.1 EDMA乒乓程序設(shè)計(jì)
在整個(gè)DSP的工作流程中,要實(shí)現(xiàn)圖像數(shù)據(jù)采集、壓縮、傳輸同時(shí)進(jìn)行,則在DSP程序中需要1個(gè)雙緩沖buffer,在向buf1中采集圖像信號(hào)的時(shí)候,DSP可以對buf2中的數(shù)據(jù)進(jìn)行壓縮,而在對buf2中進(jìn)行采集的時(shí)候,DSP可以對buf1中的數(shù)據(jù)進(jìn)行壓縮。
實(shí)現(xiàn)這個(gè)功能的方法是采用EDMA ping_pong方式。在DSP中使用hEdmaPing和hEdmaPong雙通道EDMA并建立PingBuffer和PongBuffer兩個(gè)數(shù)據(jù)存儲(chǔ)區(qū)。 當(dāng)寫完1幀圖像后,F(xiàn)PGA發(fā)送EXTINT4中斷信號(hào)啟動(dòng)hEdmaPing將數(shù)據(jù)搬移到PingBuffer,同時(shí)將通道鏈接至hEdmaPong。在下一個(gè)中斷事件發(fā)生時(shí)將數(shù)據(jù)搬移到PongBuffer中,CPU在hEdmaPong通道完成中斷服務(wù)程序中鏈接hEdmaPing通道。如此往復(fù),使系統(tǒng)數(shù)據(jù)搬移和處理連續(xù)進(jìn)行。
3.2 DSP/BIOS調(diào)度程序設(shè)計(jì)
僅僅采用EDMA乒乓方式進(jìn)行EDMA數(shù)據(jù)傳輸還是不夠的,不能實(shí)現(xiàn)數(shù)據(jù)的采集和壓縮同時(shí)進(jìn)行,還需要DSP/BIOS調(diào)度程序。在任務(wù)、硬件中斷、軟件中斷中進(jìn)行調(diào)度,在軟中斷服務(wù)函數(shù)中進(jìn)行圖像壓縮任務(wù)。
DSP/BIOS是TI公司所設(shè)計(jì)開發(fā)的、尺寸可裁剪的實(shí)時(shí)多任務(wù)操作系統(tǒng)內(nèi)核,通過使用DSP/BIOS提供的豐富的內(nèi)核服務(wù),開發(fā)者能快速地創(chuàng)建滿足實(shí)時(shí)性能要求的精細(xì)復(fù)雜的多任務(wù)應(yīng)用程序。
DSP/BIOS程序編寫過程如下:
(1)在DSP/BIOS配置面板中添加1個(gè)軟中斷jpeg_swi,并將該軟中斷的服務(wù)函數(shù)設(shè)置為jpeg。
(2)添加軟中斷服務(wù)函數(shù)jpeg();代碼如下:
void jpeg(void)
{
Uint32 i;
if(pingpong)
bitstream_length=my_jpegenc->fxns->encode(my_jpegenc,(XDAS_Int8**)buf0,output_bitstream_buffer);
else
bitstream_length=my_jpegenc->fxns->encode(my_jpegenc,(XDAS_Int8 **)buf1,output_bitstream_buffer);
submit_qdma();
while(!(EDMA_getPriQStatus()&EDMA_OPT_PRI_HIGH));
}
(3)在EDMA中斷服務(wù)函數(shù)中添加如下代碼:
SWI_post(&jpeg_swi);
該函數(shù)的作用是觸發(fā)jpeg_swi軟中斷。
4 系統(tǒng)關(guān)鍵技術(shù)
4.1 時(shí)鐘
在使用內(nèi)部生成的時(shí)鐘過程中,可能引起設(shè)計(jì)上的功能和時(shí)限問題。組合邏輯產(chǎn)生的時(shí)鐘會(huì)引入毛刺,造成功能問題,而引入的延遲則可能會(huì)導(dǎo)致時(shí)限問題。
本設(shè)計(jì)中用到很多全局時(shí)鐘的整數(shù)倍分頻,且由于分頻的整數(shù)倍較大,如果利用FPGA中自帶的DCM模塊很難實(shí)現(xiàn)這樣的功能。因此,采用同步計(jì)數(shù)器的分頻方法,并且在各個(gè)時(shí)鐘信號(hào)輸出之前,再加一級(jí)寄存器輸出,這樣的操作就避免了組合邏輯生成的毛刺被阻擋在寄存器的數(shù)據(jù)輸入端口上。
4.2 DSP與FPGA數(shù)據(jù)交換
由于壓縮算法采用MECOSO公司的JPEG壓縮算法,經(jīng)過優(yōu)化和處理后,壓縮1幅圖像僅需要4 ms。所以影響整個(gè)系統(tǒng)能否實(shí)現(xiàn)高頻幀的關(guān)鍵技術(shù)是EDMA向SDRAM中搬移數(shù)據(jù)的速度,在本設(shè)計(jì)中設(shè)幀圖像的大小為600×480=288 KB,傳輸1幅圖像所需的時(shí)間需要10 ms。影響其速度主要有2個(gè)因素:EMIF所使用的ECLOCK和EMIF相關(guān)設(shè)置的寄存器。
在本系統(tǒng)中,ECLOCK采用了DSP的CPU4分頻,使EMIF的CLOCK工作在150 MHz,大大提高了搬移速度。由于SRAM映射在DSP的CE2空間,考慮到讀取數(shù)據(jù)需要建立(setup)、選通(Strobe)和保持(Hold)3個(gè)步驟,故將CE2相關(guān)寄存器的建立時(shí)間和選通時(shí)間選擇為1個(gè)clk,經(jīng)Hold時(shí)間設(shè)置為0。這樣設(shè)置后EMIF總線的數(shù)據(jù)吞吐量為:
本文設(shè)計(jì)的圖像壓縮系統(tǒng)實(shí)現(xiàn)了分辨率為600×480、幀頻率為100幀/s的視頻信號(hào)輸入的圖像采集,并能夠進(jìn)行實(shí)時(shí)的JPEG壓縮。系統(tǒng)采用DSP+FPGA的方案,雖然是一種較常用的組織方式,但在該系統(tǒng)中解決了一些關(guān)鍵的問題,大大提高了圖像壓縮速度及系統(tǒng)的靈活性。本系統(tǒng)已經(jīng)應(yīng)用于航天領(lǐng)域某監(jiān)測系統(tǒng),效果良好,運(yùn)行穩(wěn)定。
以下內(nèi)容含腳本,或可能導(dǎo)致頁面不正常的代碼 |
---|
說明:上面顯示的是代碼內(nèi)容。您可以先檢查過代碼沒問題,或修改之后再運(yùn)行. |
1 引言
在極低譜密度,高頻譜利用率的大容量無線傳輸技術(shù)中,高速實(shí)時(shí)信號(hào)處理成為技術(shù)的 關(guān)鍵。目前市場上,能滿足對高速實(shí)時(shí)信號(hào)處理的需要有具有良好的可編程性的器件主要有 DSP 和FPGA。
TMS320C6000 系列DSP 是TI 公司推出的一種高性能的數(shù)字信號(hào)處理器,包含定點(diǎn)和浮 點(diǎn)兩個(gè)系列,其中定點(diǎn)系列包括TMS320C62xx 和TMS320C64xx,浮點(diǎn)系列包括TMS320C67xx。 C6000 系列DSP 有三種啟動(dòng)方式:
(1) 主機(jī)啟動(dòng)
如果選擇主機(jī)啟動(dòng)模式,在復(fù)位信號(hào)結(jié)束后,DSP 的CPU 被內(nèi)部“阻塞”而其他部分都 被釋放。在此期間,一個(gè)外部的主機(jī)在必要時(shí)可以通過主機(jī)接口初始化CPU 的內(nèi)存空間,包 括配置與啟動(dòng)相關(guān)的內(nèi)部寄存器。一旦主機(jī)完成了所有必須的初始化,它必須將HPIC 寄存 器的DSPINT 位置“1”來完成啟動(dòng)過程。在程序加載完后,CPU 被從“阻塞”中喚醒,然后 從地址0 處執(zhí)行指令。在CPU 被喚醒后,CPU 需要將DSPINT 位清零[1]。
(2) ROM 啟動(dòng)
如果采用ROM 啟動(dòng)模式,則C6000 系列的DSP(C621x/C671x/C64x)復(fù)位后自動(dòng)從CE1 空間的起始處拷貝1K 字節(jié)的代碼到內(nèi)存空間。該拷貝過程由EDMA 完成,使用默認(rèn)的Rom 時(shí)鐘。在此過程中CPU 一直處于“阻塞”狀態(tài),直到拷貝完成后才被被喚醒,然后從地址0 處開始執(zhí)行程序[1]。
(3) 無啟動(dòng)
如果選擇無啟動(dòng)模式,CPU 復(fù)位后直接從地址0 處開始執(zhí)行指令。 C6000 系列DSP 的器件配置情況決定了選擇的啟動(dòng)方式。具體來說就是DSP 的啟動(dòng)模式 管腳(boot mode pins)接上拉還是下拉電阻。以C6416 為例,BEA[19:18]是啟動(dòng)模式管 腳,它們?nèi)〔煌闹担ㄉ侠娮璐怼?”,下拉電阻代表“0”)代表的含義如表1-1 所示:
如果DSP 的程序小于1K 字節(jié),那么上述ROM 啟動(dòng)機(jī)制已經(jīng)可以完成程序的加載。然而 事實(shí)上大部分DSP 的程序會(huì)大于1K 字節(jié),這時(shí)就需要?jiǎng)?chuàng)建一個(gè)特定啟動(dòng)程序來完成更多代 碼的加載。該特定啟動(dòng)程序又被稱作二級(jí)bootloader[2]。
在需要二級(jí)bootloader 的程序中,這段特定啟動(dòng)代碼通常駐留在ROM 存儲(chǔ)器的起始位 置以便在DSP 復(fù)位后能自動(dòng)被加載到內(nèi)存地址0 處。當(dāng)1K 字節(jié)代碼被加載完畢后,CPU 開 始從地址0 處執(zhí)行,也就是執(zhí)行二級(jí)bootloader 的內(nèi)容。二級(jí)bootloader 的功能就是將程 序的剩余部分拷貝到內(nèi)存中。
2 啟動(dòng)方法的設(shè)計(jì)與實(shí)現(xiàn)
采用二級(jí)bootloader 的DSP 啟動(dòng)方法的實(shí)現(xiàn)大體分為四步:配置存儲(chǔ)器;編寫 secondary bootloader 代碼;編譯程序,轉(zhuǎn)換目標(biāo)文件的格式;將程序燒寫進(jìn)FLASH。圖1 為實(shí)施該啟動(dòng)方法的硬件平臺(tái)示意圖,其中DSP 的型號(hào)選擇C6416,F(xiàn)LASH 的型號(hào)選擇 AM29LV800B。
2.1 配置存儲(chǔ)器
2.1.1 定義存儲(chǔ)器分區(qū)
為了實(shí)現(xiàn)使用二級(jí)bootloader 的ROM 啟動(dòng),需要將FLASH 劃分為FLASH_BOOT, FLASH_REST 兩個(gè)區(qū)。這兩個(gè)區(qū)分別存儲(chǔ)由on-chip bootloader 拷貝的程序段和由secondary bootloader 拷貝的程序段。對于BIOS 程序,Memory 段的定義在MEM(Memory Section Manager)對象里。對于非BIOS 程序,Memory 段定義在linker command file 中。一個(gè)C6416 的Memory 段定義的例子如下所示:
]]>
隨著測試技術(shù)的不斷發(fā)展,低功耗、高性能的DSP逐漸取代了通用單片機(jī)在數(shù)據(jù)采集處理系統(tǒng)中的地位;同時(shí),以太網(wǎng)技術(shù)也在數(shù)據(jù)采集、測試測量技術(shù)中發(fā)揮越來越大的作用。本文從軟件、硬件出發(fā),介紹一種基于DSP和以太網(wǎng)的數(shù)據(jù)采集處理系統(tǒng)的設(shè)計(jì)思想及實(shí)現(xiàn)。
1 基于以太網(wǎng)的數(shù)據(jù)采集處理系統(tǒng)
生產(chǎn)和科研領(lǐng)域?qū)y試的要求越來越高,所需測試和處理的數(shù)據(jù)量也越來越巨大,有時(shí)需要多個(gè)測試儀器同時(shí)進(jìn)行測試,各測試儀器之間又需要進(jìn)行數(shù)據(jù)交換;而且測試領(lǐng)域也越來越廣泛,有些現(xiàn)場不適合工作人員親臨,這時(shí)就需要通過網(wǎng)絡(luò)進(jìn)行控制。以太網(wǎng)技術(shù)在數(shù)據(jù)采集處理系統(tǒng)中的應(yīng)用如圖1所示。
與工業(yè)現(xiàn)場應(yīng)用比較多的現(xiàn)場總線比較,以太網(wǎng)最大的特點(diǎn)是開發(fā)性好、成本低。通過把復(fù)雜的TCP/IP協(xié)議封裝而提供各種網(wǎng)絡(luò)測試技術(shù),使網(wǎng)絡(luò)測試的開發(fā)變得不再復(fù)雜。同時(shí),由于網(wǎng)絡(luò)測試帶來巨大效益,使網(wǎng)絡(luò)測試在測試自動(dòng)化領(lǐng)域得到廣泛應(yīng)用。以太網(wǎng)作為分布式測試的一個(gè)網(wǎng)絡(luò)方案,其潛力無疑是巨大的。
圖1 數(shù)據(jù)采集處理系統(tǒng)中的以太網(wǎng)應(yīng)用
以太網(wǎng)接口控制器和DSP微處理器的價(jià)格不斷下降,使得將以太網(wǎng)直接集成到基于DSP等嵌入式系統(tǒng)的測試、采集、工業(yè)I/O設(shè)備中成為越來越明顯的趨勢。基于以太網(wǎng)的I/O設(shè)備是將以太網(wǎng)接口直接嵌入到設(shè)備內(nèi)部,所以使得設(shè)備更簡潔,體積更小,安裝也更靈活。和一些目前應(yīng)用于工業(yè)的其它通信方案比較,以太網(wǎng)方式通常需要功能更強(qiáng)大的微處理器和更大的內(nèi)存。而網(wǎng)絡(luò)和計(jì)算機(jī)技術(shù)的發(fā)展,特別是DSP技術(shù)的應(yīng)用,可以大大降低這方面的成本。
2 數(shù)據(jù)采集處理系統(tǒng)的硬件設(shè)計(jì)
該系統(tǒng)以TI公司的TMS320C6000系列DSP中的TMS320C6211和10/100M自適應(yīng)以太網(wǎng)控制芯片MX98728EC為核心,主要包括ADC數(shù)據(jù)采集、DSP數(shù)據(jù)處理和以太網(wǎng)接口三個(gè)部分。圖2為數(shù)據(jù)采集處理系統(tǒng)框圖。
2.1TMS320C6000DSP
TMS320C6000是美國TI公司于1997年推出的新一代高性能DSP芯片。這種芯片是定點(diǎn)、浮點(diǎn)兼容的DSP。其定點(diǎn)系列是TMS32C62XX,浮點(diǎn)系列是TMS320C67XX。TMS320C6000片內(nèi)有8個(gè)并行的處理單元,分為相同的兩組,芯片的最高時(shí)鐘頻率可以達(dá)到300MHz。當(dāng)芯片仙部8個(gè)處理單元同時(shí)運(yùn)行時(shí),其最大處理能力可以達(dá)到2400MIPs。本數(shù)據(jù)采集處理系統(tǒng)采用TMS320C6211,其主要特別如下:
相±
·每個(gè)周期8條32位指令
·8個(gè)高度獨(dú)立的功能單元,包括6個(gè)32/40位的運(yùn)算器和2個(gè)16位的乘法器(32bit結(jié)果)
·32個(gè)32位通用寄存器
圖2 數(shù)據(jù)采集處理系統(tǒng)框圖
·靈活自由的數(shù)據(jù)/程序定位,L1/L2存儲(chǔ)器結(jié)果:4K字節(jié)L1P程序Cache、4K字節(jié)的L1D數(shù)據(jù)Cache、64K字節(jié)L2通用RAM/Cache
·32位外部存儲(chǔ)器接口(EMIF):對異步存儲(chǔ)器的無縫接口,如SRAM、EPROM;對同步存儲(chǔ)器的無縫接口,如SDRAM、SBSRAM;共512M字節(jié)外部存儲(chǔ)器可尋址空間
·增強(qiáng)的DMA(EDMA控制):16個(gè)獨(dú)立通道
·兩個(gè)32位通用定時(shí)器
·支持JTAG邊界掃描標(biāo)準(zhǔn),調(diào)試時(shí)可以方便可靠地控制DSP上面的所有資源
2.2以太網(wǎng)控制器MX98728EC
MX98728EC是一個(gè)通用的單片10/100M快速以太網(wǎng)控制器,通過它的主機(jī)總線接口,可以實(shí)現(xiàn)各種各樣的應(yīng)用,而不需要或者只需極少的外部控制邏輯。單片機(jī)的解決方案可以減小電路板的尺寸,減少板上芯片的數(shù)量,以降低系統(tǒng)的成本。MX98728EC的特點(diǎn)如下:
·32位通用異步總線結(jié)構(gòu),支持頻率最高達(dá)33MHz
·單片解決方案,集成了10/100MTP收發(fā)器
·可選的外部收發(fā)器MII接口
·完全兼容IEEE802.3u協(xié)議
·支持16/8bit打包緩沖數(shù)據(jù)寬度和32/16bit主機(jī)總線數(shù)據(jù)寬度
·分離的TX和RXFIFO,支持全雙工模式,獨(dú)立的TX和RX通道
·豐富的片上寄存器,支持各種各樣的網(wǎng)絡(luò)管理功能
·支持16/8bit的用于打包緩沖器的SRAM接口、支持片上FIFO的突發(fā)DMA模式
·自動(dòng)設(shè)置網(wǎng)絡(luò)速度和協(xié)議的NWAY功能
·可選的EEPROM設(shè)置,支持1kbit和4kbit的EEPROM接口
·支持軟件EEPROM接口,方便升級(jí)EEPROM的內(nèi)容
圖3 DSP和以太網(wǎng)接口部分硬件設(shè)計(jì)
2.3系統(tǒng)結(jié)構(gòu)
2.3.1ADC數(shù)據(jù)采集部分
CPLD1由DSP提供時(shí)鐘信號(hào),主要作用是提供掃描表SRAM的地址,掃描表SRAM的數(shù)據(jù)由DSP寫入。掃描表輸出的數(shù)據(jù)用來設(shè)定A/D轉(zhuǎn)換的通道和儀表放大器的增益。ADC采用14位的LTC1416。32路模擬信號(hào)通過多路復(fù)用器后,其中一路信號(hào)被選中,進(jìn)入儀表放大器,放大之后進(jìn)入ADC。ADC的轉(zhuǎn)換時(shí)鐘由DSP的定時(shí)器提供。
2.3.2DSP數(shù)據(jù)處理部分
ADC轉(zhuǎn)換后的14位數(shù)據(jù)通過FIFO進(jìn)入DSP進(jìn)行處理,F(xiàn)IFO采用4片CY7C425形成乒乓結(jié)構(gòu),以實(shí)現(xiàn)模擬信號(hào)的不間斷采樣。DSP擴(kuò)展一片F(xiàn)lashMemory作為DSP的程序存儲(chǔ)器,另外還擴(kuò)展了一片SRAM作為程序緩存。脫機(jī)運(yùn)行時(shí),DSP將Flash中的程序?qū)懭隨RAM,再寫入DSP內(nèi)部RAM。CPLD2主要用于控制FIFO的讀寫,并且提供以太網(wǎng)接口部分的控制信號(hào)。DSP系統(tǒng)中的數(shù)字信號(hào)處理算法主要實(shí)現(xiàn)濾波、采樣率變換、非線性修正、溫漂修正等。
2.3.3以太網(wǎng)接口部分
以太網(wǎng)主控芯片MX98728EC通過RJ45接口連接以太網(wǎng),擴(kuò)展一片SRAM作為以太網(wǎng)數(shù)據(jù)收發(fā)存儲(chǔ)器,另外又?jǐn)U展一片EEPROM以存儲(chǔ)以太網(wǎng)卡的MAC地址、IO基地址、中斷線選擇等配置寄存器的初始化數(shù)據(jù)。CPLD3通過DSP高位地址線的譯碼控制以太網(wǎng)芯片的片選并提供以太網(wǎng)接口部分的復(fù)位信號(hào)等。DSP和以太網(wǎng)的接口部分硬件如圖3所示。
3 數(shù)據(jù)采集處理系統(tǒng)的軟件設(shè)計(jì)
軟件編程時(shí)應(yīng)該充分利用硬件資源及開發(fā)工具,使代碼達(dá)到所期望的性能,并且在DSP嵌入式系統(tǒng)的基礎(chǔ)上集成已經(jīng)封裝的TCP/IP協(xié)議棧,增加網(wǎng)絡(luò)連接代碼。由于DSP系統(tǒng)硬件以及以太網(wǎng)協(xié)議的復(fù)雜性,本系統(tǒng)中的軟件編程是一個(gè)難點(diǎn)。
在本系統(tǒng)的軟件設(shè)計(jì)過程中,采用了TI公司的基于C6000系列DSP的實(shí)時(shí)操作系統(tǒng)DSP/BIOS以及DSP/BIOS提供的實(shí)時(shí)數(shù)據(jù)交換功能RTDX(Real-Time-Data-eXchange)。DSP/BIOS針對DSP的應(yīng)用環(huán)境,通過一系列的對象模塊向開發(fā)者提供了一個(gè)實(shí)用優(yōu)秀的實(shí)時(shí)操作系統(tǒng)。它可以壽命用戶提高軟件的模塊化程度、并行性和可維護(hù)性等,有利于降低系統(tǒng)成本和縮短開發(fā)周期,運(yùn)行于該操作系統(tǒng)之上的應(yīng)用程序在開發(fā)時(shí)間、軟件維護(hù)、升級(jí)等方面都有了極大的提高。實(shí)時(shí)數(shù)據(jù)交換功能是DSP/BIOS提供的一個(gè)全新的功能。在很多應(yīng)用中要求DSP不停下來,而需要從主機(jī)中實(shí)時(shí)地讀取數(shù)據(jù)或者向主機(jī)實(shí)時(shí)地輸出數(shù)據(jù)。
因?yàn)楸鞠到y(tǒng)的軟件結(jié)構(gòu)較為復(fù)雜,涉及的算法較多,故應(yīng)采用模塊化、由頂向下、逐步細(xì)化的結(jié)構(gòu)化程序設(shè)計(jì)方法。這一方法可節(jié)省軟件工作量、提高工作效率。圖4為簡化的數(shù)據(jù)采集處理程序流程圖。
實(shí)踐證明,根據(jù)以上方案設(shè)計(jì)基于DSP和以太網(wǎng)的數(shù)據(jù)采集處理系統(tǒng),可以很好地實(shí)現(xiàn)對模擬信號(hào)的采集和處理。在此基礎(chǔ)上,也可以將其作為其于DSP和以太網(wǎng)的網(wǎng)絡(luò)測試平臺(tái)開發(fā)過程中的調(diào)試工具,從而加速把以太網(wǎng)集成到測試、采集和工業(yè)I/O儀器中的開發(fā)進(jìn)程。(T002)
]]>從主機(jī)向DSP下載可執(zhí)行文件的常用方式有:(1)利用仿真器,通過USB總線和JTAG端口,把可執(zhí)行文件從主機(jī)下載進(jìn)DSP。這種方式適用于軟件研制階段。(2)利用燒寫器,把可執(zhí)行文件燒寫進(jìn)硬件電路板上的Flash芯片中。DSP上電復(fù)位之后,將固化在Flash芯片中的代碼讀入DSP的片上RAM或片外RAM映射成的存儲(chǔ)區(qū)域里。這種方式適用于軟件調(diào)試結(jié)束、需要將其固化在電路板上的階段。固化之后,整個(gè)系統(tǒng)可以脫離主機(jī)運(yùn)行。
在軟件無線電系統(tǒng)的實(shí)際應(yīng)用過程中,還需要這樣一種下載方式:從主機(jī)直接向DSP下載可執(zhí)行文件并且啟動(dòng)程序運(yùn)行。這些可執(zhí)行文件是已經(jīng)經(jīng)過調(diào)試、滿足要求的功能模塊。主機(jī)將它們分別實(shí)時(shí)下載并啟動(dòng)運(yùn)行,能夠迅速地切換整個(gè)軟件無線電系統(tǒng)的業(yè)務(wù)模式,使系統(tǒng)迅速地滿足不同場合的要求,從而把系統(tǒng)面向廣大用戶的通用性與面向特定用戶的專用性很好地結(jié)合起來。
1 以DSP為核心的軟件無線電硬件平臺(tái)簡介
圖1是本文實(shí)例的硬件平臺(tái)框圖。A/D的工作方式由FPGA控制,外界模擬信號(hào)通過A/D采樣,進(jìn)入雙口RAM,DSP從雙口RAM里讀取采樣數(shù)據(jù)。DSP芯片采用TI公司推出的TMS320C6000系列中的C6701,它通過EMIF與SDRAM和SBRAM芯片相連。PCI芯片AMCCS5933在主機(jī)和DSP之間起橋梁作用,它使得主機(jī)可以通過PCI總線訪問DSP的所有存儲(chǔ)空間,DSP也可以通過PCI總線向主機(jī)發(fā)送信息。
![]() |
2 從主機(jī)通過PCI總線向DSP下載可執(zhí)行文件
2.1 實(shí)現(xiàn)流程
圖2顯示了下載可執(zhí)行文件的整個(gè)流程。
![]() |
2.2 文件格式轉(zhuǎn)換
開發(fā)運(yùn)行在TMS32C6000系列DSP上的程序時(shí),通常都使用TI公司推出的集成開發(fā)環(huán)境CCS。編譯通過之后,會(huì)生成一個(gè)可執(zhí)行文件*.out。下載到DSP中的就是該*.out文件里的代碼。
以文件loadProgTest.out為例,闡述文件格式的轉(zhuǎn)換過程:
首先把loadProgTest.out文件轉(zhuǎn)換成十六進(jìn)制格式的文件,編寫一個(gè)名為loadProgTest.cmd的文件,內(nèi)容如下:
各條語句的含義如下:
![]() |
第1行是out文件名;第2行表示輸出ASCII的十六進(jìn)制格式;第3行指明轉(zhuǎn)換后的十六進(jìn)制文件為image模式;第4行表示生成名為loadProgTest.mxp的文件,可以從該文件中看到各段所占的存儲(chǔ)單元;第5行和第6行分別指明memory和ROM的寬度;第7行指明little-endian方式(如果需要使用big-endian方式,把L改為M即可)。
可執(zhí)行文件中的代碼從組織形式上分成若干段,從內(nèi)容上則分為程序代碼和數(shù)據(jù)代碼。第10行表示在DSP的存儲(chǔ)區(qū)域中,為程序代碼開辟的空間是從地址0x00000000到0x0000ffff;程序代碼轉(zhuǎn)換成十六進(jìn)制格式之后,將被寫入loadProgTest.hex文件。第11行表示在DSP的存儲(chǔ)區(qū)域中,為數(shù)據(jù)代碼開辟的空間是從地址0x80000000到0x8000ffff;數(shù)據(jù)代碼轉(zhuǎn)換成十六進(jìn)制格式之后,將被寫入loadProgTest.a10文件。
編寫好loadProgTest.cmd文件之后,從CCS安裝目錄下拷貝出一個(gè)名為hex6x.exe的應(yīng)用程序,把它和loadProgTest.out文件以及l(fā)oadProgTest.cmd文件放在同一個(gè)文件夾里。執(zhí)行命令行hex6x loadProgTest.cmd。
執(zhí)行完后,將生成3個(gè)文件:loadProgTest.mxp、loadProgTest.hex和loadProgTest.a10。
其次,把loadProgTest.hex和loadProgTest.a10 2個(gè)文件分別轉(zhuǎn)換為頭文件
編寫一個(gè)C語言應(yīng)用程序,利用C語言中的文件庫函數(shù),新建一個(gè)名叫code.h的頭文件,然后打開loadProgTest.hex,按從前到后的順序逐一讀取其中的字符。每讀取8個(gè)字符,就在這8個(gè)字符中最先讀取的字符前面加上“0x”,然后把它們寫入頭文件code.h。這樣,就把loadProgTest.hex中的程序代碼組織成了一個(gè)數(shù)組,存放進(jìn)code.h頭文件。用同樣的方法,把loadProgTest.a10中的數(shù)據(jù)代碼組織成一個(gè)數(shù)組,存放進(jìn)data.h頭文件里。
經(jīng)過了上述轉(zhuǎn)換之后,就可以把頭文件code.h和data.h中的數(shù)組,即可執(zhí)行文件loadProgTest.out中的代碼下載進(jìn)DSP中了。
2.3 下載代碼
下載代碼之前要做的準(zhǔn)備工作是把DSP的BOOT方式設(shè)置為HPI方式(HPI指DSP的主機(jī)并行端口),并給DSP一個(gè)復(fù)位脈沖,以鎖存HPI的BOOT方式。這時(shí),DSP的內(nèi)核將處于reset狀態(tài)。
設(shè)置并鎖存DSP的BOOT方式之后,就可以向它下載代碼了。下載代碼的過程全部在PCI驅(qū)動(dòng)程序里完成,主機(jī)可以通過HPI訪問DSP的所有存儲(chǔ)空間。本實(shí)例中,下載程序代碼時(shí),首先配置HPI控制寄存器HPIC為0x00010001,其次配置HPI地址寄存器HPIA為0x00000000,這是程序代碼在DSP存儲(chǔ)空間中的起始存儲(chǔ)地址,然后把code.h里的數(shù)組寫進(jìn)自動(dòng)增量模式的HPI數(shù)據(jù)寄存器HPID。下載數(shù)據(jù)代碼的步驟和下載程序代碼一樣,只是要把HPIA配置成0x80000000,這是數(shù)據(jù)代碼在DSP存儲(chǔ)空間中的起始存儲(chǔ)地址。
2.4 啟動(dòng)程序運(yùn)行
成功下載可執(zhí)行文件的代碼之后,主機(jī)向HPIC寄存器中的DSPINT位寫入1。這個(gè)動(dòng)作同樣是在PCI驅(qū)動(dòng)程序里完成。只要DSPINT=1,DSP的內(nèi)核將被喚醒,自動(dòng)從0x00000000處開始執(zhí)行已下載的程序。
圖2是一個(gè)演示實(shí)例,程序功能是向地址0x80007000至0x80007010的DSP存儲(chǔ)區(qū)寫入0x12345678。可以看到下載程序前后DSP存儲(chǔ)區(qū)的內(nèi)容變化。
![]() |
3 結(jié) 論
通過轉(zhuǎn)換可執(zhí)行文件的格式,把DSP設(shè)置成HPI的BOOT方式,復(fù)位DSP,下載可執(zhí)行文件代碼,設(shè)置HPIC寄存器的DSPINT位為1,可以實(shí)現(xiàn)從主機(jī)通過PCI總線在線下載可執(zhí)行文件、并且啟動(dòng)程序運(yùn)行的目的。本文中的實(shí)例DSP采用了TMS320C6701,對于其它型號(hào)的DSP,本文同樣具有指導(dǎo)意義。
]]>TSIZE | A30 | A31 | XBE[3:0] | 0 10 10 10 11 01 00 0 | 0011010 | 0101000 | 0 1 1 11 0 1 11 1 0 11 1 1 00 0 1 11 1 0 00 0 0 0 4.2 自舉配置 MPC860 及擴(kuò)展總線把數(shù)據(jù)總線的上拉和下拉電阻用于硬件復(fù)位的BOOT配置,MPC860和DSP需要不同的上拉電阻配置。方法之一就是用總線開關(guān)(bus switch)。在這個(gè)例子中用SN74CBT16390(2個(gè)16bit和32bit之間FET復(fù)用/解復(fù)用總線開關(guān))在復(fù)位的時(shí)候人離MPC860和 DSP的數(shù)據(jù)總線,允許每一個(gè)設(shè)備有自己不同的復(fù)位配置字。方法之二就是首先硬件復(fù)位(復(fù)位的過程中,XBUS的上拉和下拉電阻用于配置MPC860),而DSP復(fù)位應(yīng)該在MPC860之后。在DSP復(fù)位之后,MPC860有效地驅(qū)動(dòng)數(shù)據(jù)總線上用于配置DSP的數(shù)據(jù)值,從而DSP將被配置。 由于兩個(gè)設(shè)備都可以運(yùn)行在內(nèi)部總線仲裁使能或者禁止方式,所以內(nèi)部擴(kuò)展總線仲裁(TMS320C6000擴(kuò)展總線)處理總線的仲裁。不管內(nèi)部還是外部的仲裁配置都在系統(tǒng)復(fù)位時(shí)設(shè)置。假設(shè)處于外部仲裁,那么在MPC860從數(shù)據(jù)總線上取樣硬件復(fù)位配置字的時(shí)候,MPC860的ERAB位必須設(shè)置為1;而當(dāng) DSP從復(fù)位到內(nèi)部總線仲裁的數(shù)據(jù)總線上取樣硬件復(fù)位配置字的時(shí)候,TMS320C6000的XARB位必須設(shè)置為1。 通過在XD[31:0]上拉和下拉電阻的擴(kuò)展總線自舉配置如下: 字段(field) 定義 BLPOL 當(dāng)DSPs作為擴(kuò)展總線的從屬時(shí),XBLAST信號(hào)的極性BLPOL=1,XBLAST最高有效 RWPOL 擴(kuò)展總線讀/寫信號(hào)的極性,RWPOL=1,為XW/R HMOD 主機(jī)(host)的模式(對應(yīng)于HPIC中的XB狀態(tài)),HMOD=1,外部的主機(jī)接口處于同步的主/從模式 XARB 擴(kuò)展總線仲裁使能(對應(yīng)于XBGC中的狀態(tài)),XARB=1,內(nèi)部擴(kuò)展總線仲裁處于使能狀態(tài) FMOD FIFO模式(對應(yīng)于XBGC中的狀態(tài)) LEND 小端模式,LEND=1,系統(tǒng)運(yùn)行在小端模式 BootMode[4:0] 設(shè)定設(shè)備自舉模式,包括芽機(jī)口自舉、ROM、boot、存儲(chǔ)器映射選擇 為使工作準(zhǔn)確,MPC860的高速緩存必須關(guān)閉使能。數(shù)據(jù)緩存是否使用,只要將相應(yīng)的狀態(tài)寫放DC_CST寄存器。在禁止?fàn)顟B(tài),緩豐了標(biāo)志狀態(tài)位被忽略,訪問將通過總線傳輸。數(shù)據(jù)緩存在復(fù)位后默認(rèn)為禁止。禁止的數(shù)據(jù)緩存不影響數(shù)據(jù)地址的邏輯轉(zhuǎn)換,在MSROR位的控制下繼續(xù)進(jìn)行,任何寫入DC_CST寄存器的操作必須優(yōu)先于一個(gè)同步指令,則確保在數(shù)據(jù)存儲(chǔ)時(shí),數(shù)據(jù)緩存的使能變化。由于總線錯(cuò)誤或者執(zhí)行特定的直接緩存線性控制時(shí),數(shù)據(jù)緩存產(chǎn)生一個(gè)中斷信號(hào),緩存進(jìn)入禁止?fàn)顟B(tài),類似于禁止。每一頁都有不同的存儲(chǔ)控制屬性,MPC860支持緩存禁止(CI)、寫入(WT)和監(jiān)視(G)屬性,但不支持存儲(chǔ)器的一致性。對于要求存儲(chǔ)一致性的頁,必須編程設(shè)置為緩存禁止。G屬性用于映射那些對不確定存儲(chǔ)比較敏感的I/O設(shè)備,有G屬性的頁使存儲(chǔ)強(qiáng)行停止,除非是非敏感性存儲(chǔ)或者被核(core)取消。是否可緩存的區(qū)域必須定義,對于主要存儲(chǔ)區(qū)的寫回(write-back)或?qū)懲ǎ╳rite-through)模式,必須在使數(shù)據(jù)緩存使能之前通過初始化MMU來選擇。 經(jīng)實(shí)驗(yàn)驗(yàn)證,MPC860可以對擴(kuò)展總線進(jìn)行寫操作,也可以讀操作,基本功能已經(jīng)實(shí)現(xiàn)。此方案具有一定的實(shí)用性。
|
1 C6201/C6701新一代DSP處理器
DSP/BIOS 是一個(gè)用戶可剪裁的實(shí)時(shí)操作系統(tǒng),主要由3部分組成:多線程實(shí)時(shí)內(nèi)核;實(shí)時(shí)分析工具;芯片支持庫。利用實(shí)時(shí)操作系統(tǒng)開發(fā)程序,可以方便快速地開發(fā)復(fù)雜的DSP程序。操作系統(tǒng)維護(hù)調(diào)度多線程的運(yùn)行,只需將定制的數(shù)字信號(hào)處理算法作為一個(gè)線程嵌入系統(tǒng)即可;芯片支持庫幫助管理外設(shè)資源,復(fù)雜的外設(shè)寄存器初始化可以利用直接圖形工具配置;實(shí)時(shí)分析工具可以幫助分析算法實(shí)時(shí)運(yùn)行情況。
DSP/BIOS實(shí)時(shí)操作系統(tǒng)的圖形配置界面包括:
(1)全局設(shè)置(system)— 包括內(nèi)存配置、芯片支持庫設(shè)置、endian模式設(shè)置等;
(2)操作系統(tǒng)調(diào)度工具(scheduling)— 包括定時(shí)器、周期器、硬件中斷管理、軟件中斷管理、任務(wù)調(diào)度、系統(tǒng)空載任務(wù)函數(shù)等;
(3)同步機(jī)制(synchronization)一一提供一般操作系統(tǒng)都具有的信號(hào)燈、郵箱、隊(duì)列、鎖4個(gè)工具;
(4)芯片支持庫(chip support library)— 針對不同的DSP芯片幫助配置DSP的外設(shè)資源,最常用的有DMA,MCBSPEMIF,TIMER等的配置;
(5)主機(jī)交互接口(input/output)— 提供DSP實(shí)時(shí)運(yùn)行時(shí)與主機(jī)通過仿真口和CCS(集成開發(fā)系統(tǒng))交互數(shù)據(jù)的機(jī)制;
(6)調(diào)試工具(instrumentation)— 記錄器(LOG)可以提供調(diào)試信息,但是特別針對實(shí)時(shí)操作優(yōu)化;統(tǒng)計(jì)工具(STS)可以統(tǒng)計(jì)調(diào)試過程中的各種事件。
通過使用 DSP/BIOS,我們可以:
(1)使用多線程技術(shù)高效地管理DSP的運(yùn)行,以提高運(yùn)行效率;
(2)使用標(biāo)準(zhǔn)接口的I/O和中斷;
(3)高效地定義和配置系統(tǒng)資源,如系統(tǒng)內(nèi)存和中斷向量表;
(4)通過實(shí)時(shí)分析工具對用戶應(yīng)用程序的運(yùn)行狀況實(shí)時(shí)查看;
(5)向用戶的目標(biāo)應(yīng)用程序添加數(shù)據(jù)結(jié)構(gòu)并圍繞一組相關(guān)線程來加以組織:
(6)幾乎所有的初始化都可以通過圖形化配置來完成,而不必詳細(xì)了解各個(gè)寄存器的每一位所代表的意義;
(7)通過調(diào)用DSP/BIOS或CSL(芯片支持庫)的API庫函數(shù),使代碼效率更高、程序可讀性和可移植性更強(qiáng),從而使得向新的TMS320DSP移植更加容易。例如:開全局中斷可以用HWI_enable(),啟動(dòng)DMA可以用DMA_start(hDMA0),這樣比直接通過寄存器配置來完成具有更強(qiáng)的可讀性和可移植性,而且不會(huì)出錯(cuò),也不必查閱相應(yīng)的寄存器信息。
2 DSP/BIOS的資源優(yōu)化
由于 DSP/BIOS的很多功能只有在調(diào)試時(shí)使用或者根本不用,如果不需要用到的部分都使用默認(rèn)的配置將會(huì)占用較大的內(nèi)存資源,如果用戶程序較大就會(huì)造成DSP內(nèi)存資源緊張或不足。由于DSP/BIOS是一個(gè)可剪裁的操作系統(tǒng),可以很方便地將不需要用到的功能關(guān)閉,以節(jié)省空間。表1列出了減少DSP/BIOS所占資源的幾種措施以及在C62x中可以減少的存儲(chǔ)空間大小。
表中減少的空間大小只作為參考,隨著CCS的版本不一樣可能會(huì)有一定差別。筆者在CCS2.20.18上編寫了一個(gè)簡單的程序,DSP采用的是TMS320C6203,主程序采用C語言編寫。優(yōu)化前的.out文件大小為78.6KB,轉(zhuǎn)化成二進(jìn)制文件為28.3KB;優(yōu)化后的.out文件為29.4KB,轉(zhuǎn)化成二進(jìn)制文件為4.4KB。
3 程序的自舉引導(dǎo)方法
TMS320C6000器件可以設(shè)置成3種自舉方式,其加載過程分別敘述如下:
①不加載 。CPU直接從存儲(chǔ)器的0地址處開始執(zhí)行指令。如果系統(tǒng)中使用的是SDRAM,那么CPU 會(huì)先掛起,直到SDRAM的初始化完成。TMS320C6x1x 不具有這類方式。
②ROM 加載。位于外部存儲(chǔ)空間的ROM中的程序首先通過DMA/EDMA搬入地址。處。盡管加載過程是在芯片外部被復(fù)位信號(hào)釋放以后才開始的,但是當(dāng)芯片仍處于內(nèi)部復(fù)位保持時(shí),就開始了上述的傳輸過程了。用戶可以指定外部ROM 的存儲(chǔ)寬度,EMIF會(huì)自動(dòng)將相鄰的8bit或16bit數(shù)據(jù)合并成32bit。ROM中的程序必須以little endian的格式存儲(chǔ)。用DMA/EDMA進(jìn)行的這一加載過程是一個(gè)單幀的數(shù)據(jù).tk傳輸。傳輸過程完成
之后,CPU退出復(fù)位狀態(tài),開始執(zhí)行地址0處的指令。對于 TMS320C6x0x,DMA使用默認(rèn)的ROM時(shí)序從CEl空間中拷貝64KB數(shù)據(jù)到地址0處。
對于 TMS320C6x1x,EDMA使用默認(rèn)的ROM時(shí)序從CE1空間(C64x從EMIFB CE1空間)拷貝1KB數(shù)據(jù)到地址0處。
③主機(jī) (HPI)引導(dǎo)。CPU停留在保持狀態(tài),其余硬件部分均保持正常狀態(tài)。在這期間,外部主機(jī)通過主機(jī)口或PCI口(如6205或64x)初始化CPU的存儲(chǔ)空間。主機(jī)完成所有的初始化工作后,將主機(jī)口控制寄存器中的DSPINT位設(shè)置為1,結(jié)束引導(dǎo)過程。此時(shí)CPU退出復(fù)位狀態(tài),開始執(zhí)行地址0處的指令。在主機(jī)引導(dǎo)過程中,主機(jī)可以對DSP所有的存儲(chǔ)空間進(jìn)行讀和寫。
其中,用得最多的是ROM加載。為了生成可以從ROM中自舉的代碼,就要注意DSP/BIOS中的存儲(chǔ)器設(shè)置。對于TMS320C6x0x,一般而言,64KB的代碼就足夠了,那樣就只需選擇好各個(gè)代碼段的Load Address和Run Address就可以了。DSP/BIOS將自動(dòng)生成cmd文件,而不需用戶自己編寫。如果64KB不夠,則需自己編寫boot程序。而對于TMS320C6x1x ,1KB的程序一般是不夠用的,所以要自己編寫boot程序。下面以TMS320C6711為例介紹DSP/BIOS中程序空間的配置以及boot程序的編寫方法。
TMS320C6711內(nèi)部含有64KB的RAM,既可以配置為L2Cache,也可以配置成SRAM。一般而言,在系統(tǒng)上電復(fù)位時(shí)配置為SRAM,將1KB的引導(dǎo)程序從ROM中拷貝到SRAM中,而在引導(dǎo)程序中將用戶的程序從ROM中拷貝到SBSRAM中或SDRAM中去執(zhí)行。在主程序的初始化部分將內(nèi)部RAM配置為高速緩存,這樣可以提高程序的運(yùn)行速度。當(dāng)然,也可以把內(nèi)部RAM用作SRAM,把全部的用戶程序都引導(dǎo)到其中來執(zhí)行,
這樣可以不用外接SBSRAM或SDRAM 。
首先在 DSP/BIOS的存儲(chǔ)器段管理器(Memory Section Manager)中指定如下幾段:
FLASH_BOOT:or igin=000000000,le ngth=0x400;(存儲(chǔ)自舉代碼)
FLASH_REST:or igin=0x90000400,le ngth=Ox1fc00;(存儲(chǔ)主程序代碼等)
IRAM :or igin= 000000000,length= 0x10000;(內(nèi)部RAM)
SDRAM 或SBSRAM:origin=Ox80000000(CEO),length與外接存儲(chǔ)器大小有關(guān),如果沒有則可省略。
上電復(fù)位時(shí),F(xiàn)LASHesBOOT中的數(shù)據(jù)被復(fù)制到IRAM 中從地址0開始的一段,然后從地址0開始執(zhí)行程序。因此,在這段代碼中要把其它相應(yīng)的段從加載地址復(fù)制到運(yùn)行地址。在DSP/BIOS程序中,所用到的段及其相應(yīng)的加載地址和運(yùn)行地址建議按表2、表3安排。
在 BOOT 程序中,首先要初始化EMIF的相關(guān)寄存器,特別是有外接存儲(chǔ)器時(shí)(如SDRAM或SBSRAM),一定要先初始化相關(guān)寄存器,主要是EMIF全局控制寄存器和CE空間控制寄存器。然后將加載地址位于ROM中而運(yùn)行地址位于RAM中的段從ROM中復(fù)制到RAM中。具體的加載地址和運(yùn)行地址可以在map文件中查到。最后,將程序指針跳轉(zhuǎn)到主程序入口(c_int00)開始執(zhí)行。BOOT程序如下:
.sect " .myBootCode "
.global myBootCode
.ref _c_int00
;====myBootCode ===
myBootCode :
;***************
;Configure EMIF
;***************
...... ......
;***************
;CopySections
;***************
...... ......
;***************
;StartProgram
;***************
mvkl .S 2 _c_int00, B0
mvkh .S 2 _c_int00, B0
B . S2 B0
; jump to _c_int00
nop 5
編寫完 boot程序后,在cmd文件中加上一句:.my_boot_code: {} load=FLASH_BOOT,run=IRAM
]]>我的經(jīng)歷
錯(cuò)過第一次學(xué)習(xí)機(jī)會(huì)
我2000年進(jìn)入大學(xué),專業(yè)通信工程。入學(xué)的時(shí)候成績不錯(cuò),還拿過一等獎(jiǎng)學(xué)金,自以為自己很聰明。當(dāng)時(shí)我們學(xué)院有個(gè)科技協(xié)會(huì),簡稱科協(xié),那時(shí)的科協(xié)會(huì)長是個(gè)大四的學(xué)兄,給人印象深刻,感覺他很厲害,就入了科協(xié),第一堂課是用555做個(gè)流水燈,科協(xié)已經(jīng)把印制板做好,我只用把器件焊上去就行了,燈是亮了很好玩,于是自己琢磨電路的原理,那時(shí)是個(gè)剛?cè)雽W(xué)的小子,什么也不懂,看那東西根本搞不懂,感覺太難了,后來慢慢就不去參加活動(dòng),再后來放棄了。
現(xiàn)在想想那個(gè)時(shí)候太輕言放棄了,包括后來大學(xué)里自學(xué)51單片機(jī)、學(xué)FPGA都是只淺嘗則止,而沒有持之以恒,以至于后來錯(cuò)過了很多很多機(jī)會(huì)。所以在這里要告訴大家,也告訴我自己,學(xué)技術(shù)一定要堅(jiān)持,不管碰到什么困難,絕不能輕言放棄,堅(jiān)持就會(huì)有進(jìn)步,就像長跑,總有幾個(gè)困難點(diǎn),堅(jiān)持過去就覺得不是那么困難,水平才會(huì)有提升。
第一次使用C51
說起這個(gè),不得不感謝下我的一個(gè)大學(xué)室友,是他帶我入門C51,第一次用protel畫印制板,第一次申請免費(fèi)樣片、第一次編寫調(diào)試程序,第一次使用示波器等等,這些都得歸功于他的指導(dǎo)。
時(shí)間過得很快,一轉(zhuǎn)眼就大四了,想想自己大學(xué)游戲玩了三年,學(xué)業(yè)荒廢,畢業(yè)設(shè)計(jì)這個(gè)機(jī)會(huì)一定要把握住,不然自己沒什么資本找工作啊,于是在選題的時(shí)候選了個(gè)單片機(jī)的題目“基于DDS的信號(hào)發(fā)生器設(shè)計(jì)”。雖然之前接觸過51、protel,不過那都是看看書而已,實(shí)際做起來什么都不會(huì),我確定的方案是用C51去控制AD9853輸出相應(yīng)頻率的波形,當(dāng)然這里離不開鍵盤和LCD顯示,AD9853是從AD公司申請的樣片,那時(shí)我第一次知道還有免費(fèi)午餐,大公司真的不錯(cuò),記得當(dāng)時(shí)TIDSP都可以申請,我就申請了一片6202,不過后來沒那么容易申請了,這次我堅(jiān)持了下來,一步一步地做,最終圓滿完成了畢業(yè)設(shè)計(jì)。
我是幸運(yùn)的,因?yàn)樯磉吘陀袀(gè)很好的老師,初學(xué)者大都沒有這樣的條件,即便如此,初學(xué)者還是應(yīng)充分挖掘身邊的資源,將它們都利用起來,這樣你才能更接近成功。
接觸DSP
2004畢業(yè)后我到一個(gè)研究所工作,我所在的部門是做視頻跟蹤器的,主要用DSP+FPGA,對我來說入魚得水,因?yàn)槲覍@些東西很有興趣。當(dāng)時(shí)我的同事們用的還是TI C50DSP,這個(gè)很多人可能聽都沒聽過,TI的DSP按時(shí)間大概經(jīng)歷了這幾個(gè)系列,C25-C50-V33-2000-5000-6000,C50的功能很有限,只有匯編開發(fā)環(huán)境,因?yàn)楣δ芎唵危詫W(xué)起來也相對容易,加上我有51的基礎(chǔ),很快就上手了,一年半后部門器件換代直接換成了64xx,由于受C50的影響,我們開發(fā)還是習(xí)慣用匯編,2006年5月前后,我率先用C開發(fā)產(chǎn)品,取得了不錯(cuò)的效果。
這當(dāng)中我接觸到了很多,由于我個(gè)人性格的原因,學(xué)什么都想學(xué)精,走了很多彎路。比如PCB剛開始用protel,后來發(fā)現(xiàn)它畫復(fù)雜板子的時(shí)候不方便,于是學(xué)用allegro,后來又學(xué)SI;DSP也是,6000會(huì)用了想學(xué)2000、5000,后來發(fā)現(xiàn)自己很幼稚,其實(shí)一到二門精通了足以,學(xué)什么要注意學(xué)習(xí)理念,工具平臺(tái)這些始終是外家功夫,要勤修內(nèi)功。
總結(jié)及建議
1)選好自己的工具和平臺(tái)學(xué)DSP當(dāng)然首先要選擇一款DSP(這里主要說TI的DSP,AD公司的不熟這里就不說了)。如果是個(gè)人學(xué)習(xí)的話主要看個(gè)人需要和應(yīng)用場合,比如做圖像處理那當(dāng)然首推TI6000了,初學(xué)者不必將DSP分出三六九等,各個(gè)系列沒有明顯的優(yōu)劣,但有明確的應(yīng)用領(lǐng)域,2000偏接口控制,5000偏語音,6000適合做大數(shù)據(jù)量信號(hào)處理,比如圖像、雷達(dá)等等。初學(xué)者最好有個(gè)開發(fā)板,不然無異于紙上談兵,2000、5000的開發(fā)板相對便宜,6000的就比較昂貴。
就上手容易度來說,我個(gè)人覺得6000更易上手,6000的結(jié)構(gòu)較2000、5000明了清晰,硬件上的條條框框比較少,你不需要看很多的硬件結(jié)構(gòu)資料就能著手編程,這個(gè)大概是技術(shù)的進(jìn)步吧。不過還是這句話,應(yīng)用場合決定你的選擇。
2)自己先動(dòng)手
初學(xué)者如果會(huì)C語言語法,在看過一些資料后就可以著手寫自己的第一個(gè)程序,如果寫不出來,看看TI最初級(jí)的例程,完成自己第一個(gè)程序。我給我們單位新同事做6000培訓(xùn)的時(shí)候,給他們的第一個(gè)題目就是寫一個(gè)程序讓LED燈不停閃爍,這個(gè)燈可能接在GPIO上或者通過EMIF譯碼與FPGA配合控制(后者可能更有意義),更進(jìn)一步的程序是控制閃爍的頻率。我比較喜歡讓他們用GPIO和EMIF,它們可能是6000里最簡單和用的最多的外設(shè)了,它們是初學(xué)者最早要攻克的堡壘。
初學(xué)者往往對硬件結(jié)構(gòu)和軟件的配合沒有概念,對片內(nèi)存儲(chǔ)空間、片外存儲(chǔ)空間、片上外設(shè)這些概念沒有實(shí)在的理解,這些概念需要自己的反復(fù)的思考、反復(fù)的實(shí)驗(yàn)、反復(fù)的體會(huì)才能最終搞清楚,這些弄明白了你也就入門了。
初學(xué)者比較忌諱看太多和太復(fù)雜的例程,看得太多你的思緒會(huì)比較亂,看得太復(fù)雜你會(huì)心浮氣躁,復(fù)雜的例程一般它都有相對復(fù)雜的編程結(jié)構(gòu),這個(gè)初學(xué)者是很難體會(huì)到的,所以剛開始不要看,等你寫了20到30個(gè)程序的時(shí)候再試著看相對復(fù)雜的例程。
3)多動(dòng)手
這個(gè)不用多說了,光看不練假把式。
4)片上外設(shè)
這里拿DM642來說,我把常用的外設(shè)由簡單到復(fù)雜排個(gè)序:GPIO-TIMER-EDMA-EMIF-I2C-MCASP-VideoPort-EMAC、MDIO,MCASP我沒用過,不過看過資料感覺不復(fù)雜,我給初學(xué)者的建議是先把前面4個(gè)學(xué)清楚,可以先學(xué)GPIO這個(gè)真的是簡單,剛開始不要急著用CSL,用匯編或是C寫個(gè)程序讓某個(gè)GPIO腳上輸出波形,這樣有助于理解片上外設(shè)以及有關(guān)的概念。前面4個(gè)明白了后面的具體用到再學(xué),這個(gè)時(shí)候你可以看TI相應(yīng)的例程,拿來用就可以。
5)匯編、C和線性匯編
現(xiàn)在開發(fā)6000的標(biāo)準(zhǔn)流程是先用C寫,C的好處很多這里不說了,有太多的文章在論述,不過對于準(zhǔn)備做優(yōu)化的同志們來說,匯編不會(huì)也不行,用匯編相對于C更助于你理解6000的架構(gòu),很多初學(xué)者對C語言中用指針對某個(gè)空間操作不理解,用匯編寫的話相對要好理解的多。
大家不必對匯編心存畏懼,其實(shí)它也很簡單,只不過它比較晦澀,用它開發(fā)整個(gè)系統(tǒng)的時(shí)間上的花費(fèi)太多,不過關(guān)鍵算法的優(yōu)化有時(shí)還是離不開它,TI目前還提供線性匯編,它是匯編和C的折中,兼?zhèn)鋮R編的效率和C的易開發(fā)性。
匯編和C都只是工具,關(guān)鍵還是你對架構(gòu)的理解和編程理念,所以選擇哪個(gè)都有道理,通過工具去探索架構(gòu)而已。我個(gè)人覺得初學(xué)者主要應(yīng)學(xué)習(xí)C,畢竟它是主流,可以用匯編寫4-5個(gè)小程序,熟悉它的語法就行,日后用它做優(yōu)化也不會(huì)什么都不知道,而且也助于對硬件架構(gòu)的理解。
結(jié)束
就寫這么多了,一家之言,里面有很多廢話,希望對初學(xué)者有點(diǎn)幫助,拋磚引玉,也希望高手們多多寫出自已的經(jīng)驗(yàn)。
優(yōu)化一起放過來了~~~
關(guān)于優(yōu)化我的經(jīng)驗(yàn)是這樣的:
一、首先考慮從系統(tǒng)結(jié)構(gòu)上優(yōu)化,比如盡量減少待處理數(shù)據(jù)的無謂搬移,考慮你DSP片內(nèi)存儲(chǔ)量和每次處理數(shù)據(jù)量對系統(tǒng)結(jié)構(gòu)優(yōu)化,這部分的優(yōu)化應(yīng)該最早做;
二、其次從算法層面上著手,看采用的算法有沒有更好更簡單的計(jì)算方法,算法是否有某種對稱性,可否采用更合適的數(shù)據(jù)結(jié)構(gòu)等等,這方面的優(yōu)化比程序上的優(yōu)化更明顯;
三、如果算法層面暫時(shí)無更好的優(yōu)化辦法,看看軟件結(jié)構(gòu)能否優(yōu)化。
比如:
1)多層的循環(huán)結(jié)構(gòu)能否減層。我經(jīng)常看到這樣的程序:
for(i = 0; i++; i< A)
for(j = 0; j++ j< B)
{
E[j] = C[j] - D[j];
}
這個(gè)可以優(yōu)化成:
for(i = 0; i++; i<A*B)
{
E = C - D;
}
2) 關(guān)鍵循環(huán)結(jié)構(gòu)中的條件、跳轉(zhuǎn)指令應(yīng)盡量避免,哪怕會(huì)增加一些循環(huán)次數(shù),循環(huán)中沒有條件指令優(yōu)化器更容易優(yōu)化;
3)關(guān)鍵循環(huán)不要調(diào)用子函數(shù)
其它還有一些,具體可以看看手冊,手冊上講的很清楚
四、結(jié)合DSP系統(tǒng)的硬件結(jié)構(gòu)優(yōu)化
1)看你處理的數(shù)據(jù)是放在片內(nèi)還是片外,如果放在片外的話這個(gè)建議將數(shù)據(jù)分塊分批倒入片內(nèi)處理,類似于流水結(jié)構(gòu);
2)針對外部數(shù)據(jù)可對L2 cache優(yōu)化
五、結(jié)合DSP優(yōu)化器、指令系統(tǒng)等進(jìn)行優(yōu)化
這部分可以詳細(xì)的看TI的手冊,大概有這幾個(gè)方法:
1)優(yōu)化選項(xiàng),-o3 -pm 取消-g 等等這些選項(xiàng),如果你的軟件結(jié)構(gòu)很好,那么它們的優(yōu)化效果很明顯;
2)加一些優(yōu)化指示符指導(dǎo)優(yōu)化,這部分看手冊,包括存儲(chǔ)地址無關(guān)性,SIMD(單指令多數(shù)據(jù)處理)等等;
3)用一些專用指令,比如6000提供飽和加、溢出減指令,可以不必用條件判斷;
4)如果效果還是不好,用線性匯編改寫你的程序,將你的優(yōu)化思想用線性匯編表述出來,一般到地步就可以了;
5)如果線性匯編優(yōu)化未能盡顯你的優(yōu)化思想,那就匯編吧,優(yōu)化器不會(huì)再幫助你優(yōu)化,完全是你自己控制程序了,自己做軟件流水吧;
這部分需要有比較豐富的優(yōu)化經(jīng)驗(yàn)和扎實(shí)的優(yōu)化功底,多多積累,多看資料。
最后要重點(diǎn)說下:
優(yōu)化是沒有止境的,在對程序?qū)?xì)致優(yōu)化前要對程序每個(gè)部分測試下時(shí)間,對非常耗時(shí)的部分做優(yōu)化,一但滿足你的要求就可以,不要為了優(yōu)化而優(yōu)化,我們應(yīng)該有更重要的東西要學(xué),不要陷在優(yōu)化上而不能自拔!!
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/ww303875615/archive/2009/12/10/4977742.aspx
]]>引言
近年來,以高速數(shù)字信號(hào)處理器(DSP)為基礎(chǔ)的實(shí)時(shí)數(shù)字信號(hào)處理技術(shù)飛速發(fā)展,并獲得了廣泛的應(yīng)用。TMS320C6000系列DSP是德州儀器公司(TI)推出的定點(diǎn)、浮點(diǎn)系列DSP,其中定點(diǎn)產(chǎn)品峰值處理能力達(dá)到4800MIPS,浮點(diǎn)產(chǎn)品峰值處理能力達(dá)到1350MFLOPS,是目前國際上性能最高的DSP之一,其卓越的性能使得它在傳統(tǒng)的DSP領(lǐng)域、雷達(dá)、無線電基站等高端領(lǐng)域,以及寬帶媒體、身份識(shí)別等新興領(lǐng)域都有很好的應(yīng)用前景。隨著DSP性能和功能的不斷增強(qiáng),應(yīng)用系統(tǒng)的設(shè)計(jì)越來越復(fù)雜,要將DSP的性能充分釋放出來,合理的板級(jí)設(shè)計(jì)是DSP系統(tǒng)開發(fā)人員面臨的一個(gè)關(guān)鍵性的問題。
BGA封裝的設(shè)計(jì)分析
C6000系列DSP采用的是一種高密度BGA(Ball Grid Array)封裝,采用這種封裝的好處包括可以獲得更好的高頻電氣性能、比引腳封裝具有更長的使用周期、尺寸更小以及制造成本更低等。BGA封裝給芯片制造商以及芯片本身的性能都帶來了好處,但是對于板級(jí)開發(fā)人員來說,卻造成了很多不便之處,布線、焊裝、檢測與調(diào)試都比以前更加困難。
在設(shè)計(jì)密腳距(Fine-Pitch)的BGA封裝時(shí),不同技術(shù)的應(yīng)用會(huì)帶來不同的生產(chǎn)質(zhì)量,PCB上焊盤的合理設(shè)計(jì)能提高生產(chǎn)的可靠性。有兩種焊盤的設(shè)計(jì)方法可以選擇:阻焊定義(SMD,solder mask defined)的焊盤和無阻焊定義的焊盤(NSMD,non-solder mask defined)。圖1是這兩種焊盤的不同的焊裝效果。
圖1 SMD焊盤(a)和NSML焊盤(b)不同的焊裝效果(略)
這兩種焊盤定義都有其優(yōu)缺點(diǎn)。使用SMD焊盤時(shí),焊盤需要的尺寸比期望的尺寸大,而且如圖1所示,焊料與焊盤的接觸面尺寸由阻焊層的空隙大小決定,過大的焊盤使得走線非常困難。這種焊盤定義的優(yōu)點(diǎn)是它能夠精密的控制尺寸,焊盤也能夠更好的附著在PCB板的基底層上。與它相比,NSMD焊盤蝕刻在阻焊層內(nèi)(如圖1),焊盤的尺寸決定于銅層的蝕刻,沒有SMD焊盤尺寸精密,但是NSMD是TI公司推薦使用的焊盤定義,它可以在板上留下較多的布線空間以適應(yīng)密腳距的BGA封裝,可以使器件與PCB板的結(jié)合更加的緊密。圖2是TI公司提供的焊盤的最佳配置。另外,BGA封裝的器件需要采用回流焊設(shè)備進(jìn)行焊裝,為了保證器件封裝與PCB板有良好的連接,板子上的焊盤一般應(yīng)比器件上的管腳焊點(diǎn)(低溫金屬球)的直徑略大。
在密腳距的BGA封裝設(shè)計(jì)時(shí),布線也是需要注意的問題。電路板設(shè)計(jì)時(shí),通常采用0.1mm的最小線寬,0.2mm的間距。以腳間距為0.8mm的TMS320C6415(GLZ-532)為例,由于焊盤間的距離大概只有0.38mm(該距離是假定焊盤直徑為0.41mm時(shí)的最壞情況),在兩腳間最多只能布一條線。另外,焊盤通常通過較寬的銅導(dǎo)線與其他設(shè)備或者金屬化孔(PTH,Plated Through Hole)相連。作為一個(gè)規(guī)則,焊盤必須和PTH分離,將PTH放在焊盤的間隙處,并通過導(dǎo)線與焊盤連接是通用的辦法。
印制電路板的設(shè)計(jì)與分析
C6000系列DSP的板級(jí)設(shè)計(jì)不可避免地涉及到了多層印制電路板的設(shè)計(jì)問題,多層板有很多優(yōu)點(diǎn),但是因其密度和層數(shù)的關(guān)系,在加工制作過程中難度大,測試?yán)щy,可靠性保障程度相對于雙面板而言較低,一旦出現(xiàn)故障,幾乎沒有維修的可能。多層板的質(zhì)量和可靠性以及是否能取得合理的價(jià)格,很大程度上與多層板的設(shè)計(jì)有關(guān),作為設(shè)計(jì)者必須熟悉印制板有關(guān)的設(shè)計(jì)標(biāo)準(zhǔn)和要求。
通過使用高密度布線技術(shù),可以解決在設(shè)計(jì)中遇到的可供信號(hào)線通過的空間過小的難題。在高密度板設(shè)計(jì)中,孔密度(Via Density)是一個(gè)需要注意的因素。孔密度即特定面積的PCB板上的過孔個(gè)數(shù)。使用較小的過孔,可以增加PCB板的布通率,進(jìn)而使用更少的板面積,并能增加孔密度,微孔的使用解決了很多與孔密度相關(guān)的問題。下面想要分析的是兩種高密度的六層板的設(shè)計(jì)方法。
圖2 NSMD焊盤最佳配置(略)
通常在C600系列DSP的板級(jí)設(shè)計(jì)時(shí),BGA封裝外圍的孔密度相對較大,這是因?yàn)楣苣_焊點(diǎn)間布線路徑的有限選擇導(dǎo)致的。為了減少封裝外圍孔密度的問題,設(shè)計(jì)者可以如圖3所示的垂直設(shè)計(jì)方法,在焊盤之間垂直的轉(zhuǎn)一個(gè)0.25mm的孔,穿過內(nèi)層,設(shè)計(jì)者可以選擇適當(dāng)?shù)膶雍筒季的路徑,并使用一種被稱為狗骨形(dog bone)的導(dǎo)線來連接通孔和焊盤。這種方法最多需要為每一個(gè)管腳焊點(diǎn)轉(zhuǎn)一個(gè)通孔。除了這種方法以外,還有一種方法需要使用先進(jìn)的微孔技術(shù),通過使用盲孔和埋孔來連接各層。如圖4所示,盲孔將頂層和底層與中間層連接,埋孔連接中間層。這種方法需要使用激光在焊盤上轉(zhuǎn)0.1mm的微孔并在第二層埋上狗骨形的連接導(dǎo)線。因?yàn)槁窨讻]有暴露出來,可以使用較大的孔徑如0.25mm。如果需要可以在底層放上旁路電容和其他的分立元件。
SMT生產(chǎn)工藝流程中需要注意的問題 元器件貼片
元器件的貼片是SMT生產(chǎn)工藝流程中焊膏印刷后的第二道工序。BGA封裝具有"自對準(zhǔn)"的特性,在元器件貼片這道工序中由于熔化的焊料的表面張力可以使BGA封裝元件自動(dòng)的對準(zhǔn),在一定的偏差范圍內(nèi)使焊點(diǎn)和焊盤更好的結(jié)合。作為慣例,放置BGA封裝元件時(shí)焊盤尺寸50%以內(nèi)的偏差都是允許的。
圖3 通用的PCB板設(shè)計(jì)框圖(略)
圖4 微孔化的PCB板設(shè)計(jì)方法(略)
元器件的貼片通常都是使用能夠根據(jù)BGA金屬球版本來放置BGA封裝器件的設(shè)備完成的。如果金屬球的版本號(hào)對設(shè)備而言無效的話,可以根據(jù)元器件的邊緣來對齊器件,在這種情況下,由于器件的差異性,放置元器件時(shí)可能會(huì)有很大的偏差,推薦使用金屬球的對準(zhǔn)的方式。放置元器件時(shí)注意不要將焊膏濺出,一般200到300克力就可以使得元器件很好地與焊膏接觸了。
回流焊接
回流焊接是BGA裝配過程中最難控制的工序,在回流過程中需要注意檢查PCB板上所有器件回流時(shí)的形態(tài)并確保它們在焊接過程中有充分的回流。當(dāng)使用的回流爐不能使PCB板均勻受熱的情況下,需要在板上不同的位置安裝多重的熱電偶。如果需要的話,還應(yīng)該重新調(diào)節(jié)溫度使元器件有更好的焊接。回流一般經(jīng)過預(yù)熱、浸潤、回流、冷卻幾個(gè)階段。預(yù)熱時(shí)緩慢加熱,較理想的升溫速度為每秒1.5℃到2℃,升溫至120℃到140℃;浸潤階段里,額外的揮發(fā)性物質(zhì)被蒸發(fā)掉,助焊劑也開始揮發(fā)。這個(gè)階段的設(shè)置很大程度上依賴與焊膏的選擇,一般保持120℃到170℃,持續(xù)時(shí)間約120到180秒較好,以確保雜質(zhì)盡可能的揮發(fā)。回流階段應(yīng)該使溫度很快的上升到使焊料熔化成液體的溫度,一般最高的溫度為220℃到235℃,超過180℃的持續(xù)時(shí)間為60到75秒,一旦焊接完畢,進(jìn)入到冷卻的階段,一般降溫的速度控制在2到3℃/秒。
小結(jié)
本文對TI C6000 DSP板級(jí)設(shè)計(jì)時(shí)需要注意的問題進(jìn)行了分析,除了以上提到的這些問題,要想很快設(shè)計(jì)出PCB板,并使BGA封裝可靠的連接,還需要更好的和制板商以及貼片廠家溝通,以了解他們能夠達(dá)到的制造工藝水平,并告知在制作過程中需要他們特別注意問題。
關(guān)鍵詞:C6000;程序優(yōu)化;軟件流水;線性匯編
0 引 言
目前在DSP平臺(tái)上編程多使用匯編語言與C語言,為了追求代碼的高效,過去一般用匯編語言來編制。DSP程序匯編語言簡潔高效,能夠直接操作DSP的內(nèi)部寄存器、存儲(chǔ)空間、外設(shè),但可讀性、可修改性、可移植性較差;隨著DSP應(yīng)用范圍不斷延伸,應(yīng)用的日趨復(fù)雜,匯編語言程序在可讀性、可修改性、可移植性和可重用性的缺點(diǎn)日益突出,軟件需求與軟件生產(chǎn)力之間的矛盾日益嚴(yán)重。引入高級(jí)語言(如C語言,C++,Java),可以解決該矛盾。在高級(jí)語言中,C語言是一種較為高效的高級(jí)語言,在可讀性、可移植性等方面優(yōu)于匯編指令。各個(gè)DSP芯片公司都相繼推出了相應(yīng)的C語言編譯器。
但由于DSF結(jié)構(gòu)的特殊性,使得該平臺(tái)上的C語言編譯器無法充分發(fā)揮DSP器件的性能優(yōu)勢。同樣功能的C語言程序,效率往往只有直接書寫的匯編程序的幾分之一甚至幾十分之一,因此有必要根據(jù)DSP的特性對C語言編寫的程序進(jìn)行進(jìn)一步的優(yōu)化。
l TMS320C6000處理器介紹
TMS320C6000是TMS320系列產(chǎn)品中的新一代高性能DSP芯片,共分為兩大系列。其中定點(diǎn)系列為TMS320C62xx和TMS320C64xx;浮點(diǎn)系列為TMS320C67xx。由于TMS320C6000的開發(fā)主要面向數(shù)據(jù)密集型算法,它有著豐富的內(nèi)部資源和強(qiáng)大的運(yùn)算能力,所以被廣泛地應(yīng)用于數(shù)字通信和圖像處理等領(lǐng)域。
C6000系列CPU中的8個(gè)功能單元可以并行操作,并且其中兩個(gè)功能單元為硬件乘法運(yùn)算單元,大大地提高了乘法速度。DSP采用具有獨(dú)立程序總線和數(shù)據(jù)總線的哈佛總線結(jié)構(gòu),僅片內(nèi)程序總線寬度就可達(dá)到256位,即每周期可并行執(zhí)行8條32位指令;片內(nèi)兩套數(shù)據(jù)總線的寬度分別為32位;此外,DSP還有一套32位DMA專用總線用于傳輸。靈活的總線結(jié)構(gòu)使得數(shù)據(jù)瓶頸對系統(tǒng)性能的限制大大緩解。C6000的通用寄存器組能支持32位和40位定點(diǎn)數(shù)據(jù)操作,另外C67xx和C64xx還分別支持64位雙精度數(shù)據(jù)和64位雙字定點(diǎn)數(shù)據(jù)操作。除了多功能單元外,流水技術(shù)是提高DSP程序執(zhí)行效率的另一主要手段。由于TMS320C6000的特殊結(jié)構(gòu),功能單元同時(shí)執(zhí)行的各種操作可由VLlW長指令分配模塊來同步執(zhí)行,使8條并行指令同時(shí)通過流水線的每個(gè)節(jié)拍,極大地提高了機(jī)器的吞吐量。
2 C6000軟件開發(fā)流程
圖1為C6000的軟件開發(fā)流程圖。圖中陰影部分是開發(fā)C代碼的常規(guī)流程,其他部分用于輔助和加速開發(fā)討程.
C/C++源文件首先經(jīng)過C/C++編譯器(C/C++cornpiler)轉(zhuǎn)換為C6000匯編源代碼。編譯器、優(yōu)化器(optimizer)和交疊工具是C/C++編譯器的組成部分。編譯器使用戶能一步完成編譯、匯編和連接;優(yōu)化器調(diào)整合修改代碼以提高C程序的效率;交疊工具把C/C++語句和對應(yīng)的匯編語句交疊列出。
匯編源代碼再經(jīng)過匯編器(Assembier)翻譯為機(jī)器語言目標(biāo)文件。機(jī)器語言是基于通用目標(biāo)文件格式(Common Object File Format,COFF)的。
連接器(Linker)連接目標(biāo)文件,生成一個(gè)可執(zhí)行文件。它要完成地址的重分配(Relocation)和解析外部引用(Resolve External References)。
得到可執(zhí)行文件之后就可以進(jìn)行調(diào)試。可用軟件仿真器(Simulator)在PC機(jī)上對指令和運(yùn)行時(shí)間進(jìn)行精確仿真;用XDS硬件仿真器(Emulator)在目標(biāo)板上進(jìn)行調(diào)試。
調(diào)試通過后即可下載到目標(biāo)板進(jìn)行獨(dú)立運(yùn)行。
3 程序優(yōu)化流程及方法
3.1 程序優(yōu)化階段
由于DSP應(yīng)用的復(fù)雜度,在用C語言進(jìn)行DSP軟件開發(fā)時(shí),一般先在基于通用微處理器的PC機(jī)或工作站上對算法進(jìn)行仿真,仿真通過后再將C程序移植到DSP平臺(tái)中。
所以,DSP的軟件開發(fā)與優(yōu)化流程主要分為3個(gè)階段:C代碼開發(fā)階段;C代碼優(yōu)化階段;手工匯編代碼重編寫階段。如圖2所示。
在圖2中,第一階段:沒有C6000知識(shí)的用戶能開發(fā)自己的C代碼,然后使用CCS中的代碼剖析工具,確定C代碼中可能存在的低效率段,為進(jìn)一步代碼優(yōu)化做好準(zhǔn)備。第二階段:C代碼優(yōu)化階段。在這個(gè)階段,主要利用intrinsics函數(shù)以及編譯器編譯選項(xiàng)來提高代碼的性能。優(yōu)化后利用軟件模擬器檢查代碼的效率,如仍不能達(dá)到期望的效率,則進(jìn)入第三階段。第三階段:寫線性匯編優(yōu)化。在這個(gè)階段中,用戶把最耗費(fèi)時(shí)間的代碼抽取出來,重新用線性匯編寫,然后使用匯編優(yōu)化器優(yōu)化這些代碼。在第一次寫線性匯編時(shí),可以不考慮流水線和寄存器分配。然后,提高線性匯編代碼性能,往代碼中添加更多的細(xì)節(jié),如分配寄存器等。由于這一階段所需的時(shí)間要比第二階段多,所以整個(gè)代碼的優(yōu)化盡量放在第二階段來完成,而少使用線性匯編代碼優(yōu)化。
3.2 C/C++代碼優(yōu)化方法
為了使C/C++代碼獲得最好的性能,可以使用編譯選項(xiàng)、軟件流水、內(nèi)聯(lián)函數(shù)和循環(huán)展開等方法來對代碼進(jìn)行優(yōu)化,以提高代碼執(zhí)行速度,并減小代碼尺寸。
3.2.1 編譯器選項(xiàng)優(yōu)化
C/C++編譯器可以對代碼進(jìn)行不同級(jí)別的優(yōu)化。高級(jí)優(yōu)化由專門的優(yōu)化器完成,低級(jí)的和目標(biāo)DSP有關(guān)的優(yōu)化由代碼生成器完成。圖3為編譯器、優(yōu)化器和代碼生成器的執(zhí)行圖。
當(dāng)優(yōu)化器被激活時(shí),將完成圖3所示的過程。C/C++語言源代碼首先通過一個(gè)完成預(yù)處理的解析器(Parser),生成一個(gè)中間文件(.if)作為優(yōu)化器(Optimi-zer)的輸入。優(yōu)化器生成一個(gè)優(yōu)化文件(.opt),這個(gè)文件作為完成進(jìn)一步優(yōu)化的代碼生成器(Co
最簡單執(zhí)行優(yōu)化的方法是采用cl6x編譯程序,在命令行設(shè)置一On選項(xiàng)即可。n是優(yōu)化的級(jí)別(n為0,1,2,3),它控制優(yōu)化的類型和程度。
3.2.2 軟件流水優(yōu)化
軟件流水是編排循環(huán)指令,使循環(huán)的多次迭代并行執(zhí)行的技術(shù)。使用一02和一03選項(xiàng)編譯C/C++程序時(shí),編譯器就從程序中收集信息,嘗試對程序循環(huán)做軟件流水。
圖4顯示一個(gè)軟件流水循環(huán)。圖4中A,B,C,D和E表示1次迭代中的各條指令;A1,A2,A3,A4和A5表示一條指令執(zhí)行的各階段。循環(huán)中,一個(gè)周期最多可并行執(zhí)行5條指令,即圖中陰影部分所示的循環(huán)核(Loop Kernel)部分。循環(huán)核前面的部分稱為流水循環(huán)填充(Pipelined Loop Prolog),循環(huán)核后面部分稱為循環(huán)排空(Pipelined Loop Epilog)。
3.2.3 內(nèi)聯(lián)函數(shù)優(yōu)化
通過下面的方法改進(jìn)C語言程序,可使編譯出的代碼性能顯著提高:
(1)使用intrinsics(內(nèi)聯(lián)函數(shù))替代復(fù)雜的C/C++代碼;
(2)使用字(Word)訪問存放在32位寄存器的高16位和低16位字段的數(shù)據(jù);
(3)使用雙字訪問存放在64位寄存器的32位數(shù)據(jù)(僅指C64xx/C67XX)。
C6000編譯器提供了許多內(nèi)聯(lián)函數(shù),它們直接對應(yīng)著C62X/C64X/C67X指令可快速優(yōu)化C代碼。這些內(nèi)聯(lián)函數(shù)不易用C/C++語言實(shí)現(xiàn)其功能。內(nèi)聯(lián)函數(shù)用前下劃線“_”特別標(biāo)示,其使用方法與調(diào)用函數(shù)一樣。例如C語言的飽和加法只能寫為需要多周期的函數(shù):
這段復(fù)雜的代碼可以用_sadd()內(nèi)聯(lián)函數(shù)實(shí)現(xiàn),它是一個(gè)單周期的C6x指令。
result=_sadd(a,b);
要提高C6000數(shù)據(jù)處理率,應(yīng)使一條Load/Store指令能訪問多個(gè)數(shù)據(jù)。C6000有與內(nèi)聯(lián)函數(shù)相關(guān)的指令,例如_add2(),_mpyhl(),_mpylh()等,這些操作數(shù)以16位數(shù)據(jù)形式存儲(chǔ)在32位寄存器的高位部分和低位部分。當(dāng)程序需要對一連串短型數(shù)據(jù)進(jìn)行操作時(shí),可使用字1次訪問2個(gè)短型數(shù)據(jù),然后使用C6000相應(yīng)指令來處理數(shù)據(jù)。相似的在C64x或C67x中,有時(shí)需要執(zhí)行64位的LDDW來訪問兩個(gè)32位數(shù)據(jù),4個(gè)16位數(shù)據(jù),甚至8個(gè)8位數(shù)據(jù)。
3.2.4 循環(huán)展開
循環(huán)展開是改進(jìn)性能的另一種,即把小循環(huán)的迭代展開,以讓循環(huán)的每次迭代出現(xiàn)在代碼中。這種方法可增加并行執(zhí)行的指令數(shù)。當(dāng)每次迭代操作沒有充分利用C6000結(jié)構(gòu)的所有資源時(shí),可使用循環(huán)展開提高性能。
有3種使循環(huán)展開的方法:
(1)編譯器自動(dòng)執(zhí)行循環(huán)展開;
(2)在程序中使用UNROLL偽指令建議編譯器做循環(huán)展開;
(3)用戶自己在C/C++代碼中展開。
3.3 匯編優(yōu)化
在對C/C++代碼使用了所有的C/C++優(yōu)化手段之后,如果仍然不滿意代碼的性能,就可以寫線性匯編程序,然后用匯編優(yōu)化器進(jìn)行優(yōu)化,生成高性能的代碼。
3.3.1 寫線性匯編
使用C6000的剖析工具(Profiling Tools)可以找到代碼中最耗費(fèi)時(shí)間的部分,就是這部分需要用線性匯編重寫。線性匯編代碼與匯編源代碼相似,但是,線性匯編代碼中沒有指令延遲和寄存器使用信息。這樣做的目的是由匯編優(yōu)化器來為自己設(shè)定這些信息。
寫線性匯編代碼時(shí),需要知道:匯編優(yōu)化器偽指令、影響匯編優(yōu)化器行為的選項(xiàng)、TMS320C6000指令、線性匯編源語句語法、指定寄存器或寄存器組、指定功能單元、源代碼注釋等。
3.3.2 匯編優(yōu)化器優(yōu)化
匯編優(yōu)化器的任務(wù)主要有:
(1)編排指令,最大限度的利用C6000的并行能力;
(2)確保指令滿足C6000的延遲要求(Latency Requirements);
(3)為源代碼分配寄存器。
4 結(jié) 語
C6000系列的DSP C/c++代碼優(yōu)化比傳統(tǒng)的代碼優(yōu)化要方便的多,但要真正發(fā)揮其芯片的工作效率還是需要一定的經(jīng)驗(yàn)和技巧。這不僅要求開發(fā)人員熟悉其硬件體系,還要求對編譯器的編譯原理有一定的理解。另外,在C語言層面上要達(dá)到DSP芯片的峰值即8條指令并行是很難的,大多情況下都只能達(dá)到6.7條指令并行。在實(shí)際開發(fā)中,若優(yōu)化結(jié)果已達(dá)到6,7條指令并行卻還離實(shí)時(shí)的要求相差很遠(yuǎn),再花大量的人力去力求達(dá)到8條指令并行是不經(jīng)濟(jì)的,此時(shí)應(yīng)該考慮其他的技術(shù)改進(jìn)或策略上的調(diào)整以求達(dá)到目的。
]]> C6000系列DSP的啟動(dòng)加載方式包括不加載、主機(jī)加載和EMIF加載3種
3種加載方式的比較:不加載方式僅限于存儲(chǔ)器0地址不是必須映射到RAM空間的器件,否則在RAM空間初始化之前CPU會(huì)讀取無效的代碼而導(dǎo)致錯(cuò)誤;主機(jī)加載方式則要求必須有一外部主機(jī)控制DSP的初始化,這將增加系統(tǒng)的成本和復(fù)雜度,在很多實(shí)際場合是難以實(shí)現(xiàn)的;EMIF加載方式的DSP與外部ROM/Flash接口較為自由,但片上Bootloader工具自動(dòng)搬移的代碼量有限(1 KB/64 KB)本文主要討論常用的EMIF加載方式
1 EMIF加載分析
實(shí)際應(yīng)用中,通常采用的是EMIF加載方式,把代碼和數(shù)據(jù)表存放在外部的非易失性存儲(chǔ)器里(常采用Flash器件)
下面以TMS320C6000系列中最新的浮點(diǎn)CPU——TMS320C6713(簡稱“C6713”)為例,詳細(xì)分析其EMIF加載的軟硬件實(shí)現(xiàn)
硬件方面,其與16位寬度的Flash器件的接口如圖1所示
![]() |
對于不同的DSP器件,加載方式的配置引腳稍有不同C6713的配置引腳及其定義如表1所列
![]() |
應(yīng)用程序的大小決定了片上的Bootloadet工具是否足夠把所有的代碼都搬移到內(nèi)部RAM里對于C6713,片上的Bootloader工具只能將1 KB的代碼搬入內(nèi)部RAM
通常情況下,用戶應(yīng)用程序的大小都會(huì)超過這個(gè)限制
所以,需要在外部Flash的前1 KB范圍內(nèi)預(yù)先存放一小段程序,待片上Bootloader工具把此段代碼搬移入內(nèi)部并開始執(zhí)行后,由這段代碼實(shí)現(xiàn)將Flash中剩余的用戶應(yīng)用程序搬移入內(nèi)部RAM中
此段代碼可以被稱作一個(gè)簡單的二級(jí)Bootloader
圖2所示為使用二級(jí)Bootloader時(shí)的CPU運(yùn)行流程
![]() |
使用二級(jí)Bootloader需要考慮以下幾個(gè)事項(xiàng):
·需要燒寫的COFF(公共目標(biāo)文件格式)段的選擇;
·編寫二級(jí)Bootloader;
·將選擇的COFF段燒入Flash
一個(gè)COFF段就是占據(jù)一段連續(xù)存儲(chǔ)空間的程序或數(shù)據(jù)塊COFF段分為3種類型:代碼段、初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段
對于EMIF加載方式,需要加載的鏡像由代碼段(如.vectors和.text等)和初始化數(shù)據(jù)段(如.cinit,.const,.switch,.data等)構(gòu)成另外,可以單獨(dú)定義一個(gè).boot-load段存放二級(jí)Bootloader
此段也需要寫入Flash
所有未初始化的數(shù)據(jù)段(如.bss等)都不需要燒入到Flash中
2 二級(jí)Bootloader的編寫
·由于執(zhí)行二級(jí)Bootloader時(shí)C的運(yùn)行環(huán)境還未建立起來,所以必須用匯編語言編寫二級(jí)Bootloader可參照其他類似文獻(xiàn)及TI相關(guān)文檔
此處不再贅述
·CCS中用戶工程編譯鏈接后產(chǎn)生的.map文件包含了存儲(chǔ)器的詳細(xì)分配信息一個(gè)典型的map文件中包含的存儲(chǔ)器分配信息如表2所列
·與cmd文件不同,map文件不僅包含了各段存儲(chǔ)在哪一段內(nèi)存空間的信息,從map文件中還可以具體知道每個(gè)內(nèi)存區(qū)間中有多少被實(shí)際使用(燒寫Flash時(shí)會(huì)用到這個(gè)參數(shù))內(nèi)存區(qū)間中未被使用部分是不需要寫入Flash內(nèi)容的,實(shí)際被使用的部分才是真正需要寫人到Flash中的內(nèi)容
3 Flash的燒寫
把代碼等寫入Flash的辦法大體上可分為以下幾種:
① 使用通用燒寫器寫入
② 使用CCS中自帶的FlashBurn工具
③ 用戶自己編寫燒寫Flash的程序,由DSP將內(nèi)存映像寫入Flash
其中,使用通用燒寫器燒寫需要將內(nèi)存映像轉(zhuǎn)換為二進(jìn)制或十六進(jìn)制格式的文件,而且要求Flash器件是可插拔封裝的這將導(dǎo)致器件的體積較大,給用戶的設(shè)計(jì)帶來不便
使用TI公司提供的FlashBurn工具的好處在于使用較為直觀FlashBurn工具提供的圖形界面可以方便地對Flash執(zhí)行擦除、編程和查看內(nèi)容等操作
但這種力法的缺點(diǎn)也不少:首先,F(xiàn)lashBurn工具運(yùn)行時(shí)需要下載一個(gè).out鏡像(FBTC,F(xiàn)lashBurn Target Component)到DSP系統(tǒng)中,然后由上位PC機(jī)通過仿真器發(fā)送消息(指令和數(shù)據(jù))給下位DSP,具體對Flash的操作由FBTC執(zhí)行
然而,這個(gè)FBTC一般是針對TI公司提供的DSP專門編寫的,與板上使用的Flash的接口寬度(默認(rèn)是8位)、操作關(guān)鍵字(因生產(chǎn)廠商不同而各異)都有關(guān),所以,對用戶自己制作的硬件不一定適合
例如:如果用戶自己的電路板上使用的是與DSK同品牌的Flash芯片,接口為16位數(shù)據(jù)寬度,那么,使用FlashBur’n工具燒寫將最多只有一半的Flash容量能夠被使用,要想正確實(shí)現(xiàn)]EMIF加載就必須選擇8位加載方式
這就造成了Flash存儲(chǔ)器資源的浪費(fèi),同時(shí)限制了用戶開發(fā)的靈活性
雖然TI公司提供了FBTC的源代碼供有需要的用戶修改,但這樣用戶需要去了解FBTC的運(yùn)行機(jī)制及其與上位機(jī)的通信協(xié)議,并對Flash燒寫函數(shù)進(jìn)行修改用戶可能需要修改的幾個(gè)地方如下:對Flash編程的關(guān)鍵字和地址,BurnFlash函數(shù)中的數(shù)據(jù)指針和EMIF口的配置(針對1.0版本FBTC)
這就給用戶開發(fā)帶來了不便
把開發(fā)時(shí)間浪費(fèi)在了解一個(gè)并不算簡單的Flash燒寫工具上并不是一個(gè)好的選擇
![]() |
其次,F(xiàn)lashBurn工具不能識(shí)別.out文件,只接受..ex的十六進(jìn)制文件,因此,需要將.out文件轉(zhuǎn)換為.hex文件這個(gè)轉(zhuǎn)換的工具就是TI公司提供的Hex6x.exe工具
轉(zhuǎn)換過程的同時(shí),需要一個(gè)cmd文件(即圖3中的Hex.cmd)指定作為輸入的.out文件,輸出的.hex文件的格式,板上Flash芯片的類型和大小,需要寫入Flash中的COFF段名等
![]() |
使用用戶自己編寫的燒寫Flash的程序較為靈活,避免了文件格式轉(zhuǎn)換的繁瑣不過,此方法要求用戶對自己使用的Flash芯片較為熟悉
通常采用的Flash燒寫程序是單獨(dú)建立一個(gè)工程的辦法:先把用戶應(yīng)用程序(包含二級(jí)Bootloader)編譯生成的.out文件裝載到目標(biāo)DSP系統(tǒng)的RAM中,再把燒寫Flash的工程編譯生成的.out文件裝載到目標(biāo)DSP系統(tǒng)RAM的另一地址范圍,執(zhí)行Flash燒寫程序,完成對Flash的燒寫這個(gè)辦法要注意避免兩次裝載可能產(chǎn)生的地址覆蓋,防止第2次裝載修改了應(yīng)該寫入Flash的第1次裝載的內(nèi)容
實(shí)際上,可以將Flash燒寫程序嵌入到用戶主程序代碼中去,比單獨(dú)建立一個(gè)燒寫Flash的工程更為方便Flash芯片的燒寫程序段如下:
![]() |
![]() |
ChipErase函數(shù)和ProgramFlashArray函數(shù)的編寫可參照用戶使用的Flash芯片的Datasheet以及參考文獻(xiàn)[1]
ProgramFlashArray函數(shù)的第1個(gè)參數(shù)是源地址指針(指向內(nèi)部Ram),第2個(gè)參數(shù)是目標(biāo)地址指針(指向外部Flash),第3個(gè)參數(shù)是要寫入的數(shù)據(jù)長度(單位為字)
編寫Flash燒寫函數(shù)時(shí)有3點(diǎn)需要注意:
① 指向Flash地址的指針由于C6713的低兩位地址用于譯碼作字節(jié)選擇,地址總線的最低位是EA2,所以,邏輯地址需要適當(dāng)?shù)囊莆徊拍苷_地指向日標(biāo)
對8位存儲(chǔ)器而言,應(yīng)該左移2位;對16位存儲(chǔ)器而言,應(yīng)該左移1位;對于32位存儲(chǔ)器,則不需要移位例如要從(往)Flash的0x00000003地址讀(寫)一個(gè)字,其邏輯地址應(yīng)該是0x90000000+(0x0003<<1),而非0x90000003
② map文件中各內(nèi)存區(qū)間被實(shí)際占用的尺寸大小是以字節(jié)為單位的,而ProgramFlashArray函數(shù)寫入Flash的數(shù)據(jù)單位為字,所以需要將map文件中得到的尺寸大小的一半作為ProgramFlashArray函數(shù)的參數(shù)
③ 燒寫函數(shù)中使用了flash_burned常量作為判斷是否需要對Flash操作的依據(jù),且將其初始化為1這是為了避免Flash加載之后會(huì)執(zhí)行對Flash的操作
此變量應(yīng)在燒寫Flash時(shí)手動(dòng)修改為0
在仿真加載方式下,可以在CCS里的watchwindow窗口手動(dòng)修改flash_burned常量為0,強(qiáng)迫CPU進(jìn)入對Flash編程的程序段實(shí)驗(yàn)證明,在仿真加載方式下手動(dòng)修改flash_burned并不影響寫入到Flash中的flash_burn-ed的值(仍為1),所以,寫入Flash的flash_burned的值仍然是1
在系統(tǒng)Flash加載之后,CPU就會(huì)跳過此段代碼,實(shí)現(xiàn)正確運(yùn)行
4 結(jié) 論
本Flash加載方案以C6713為例,稍加修改即可適用于TMS320C6000系列的其他DSP器件經(jīng)過在研制的伺服測試平臺(tái)中的應(yīng)用,證明本方法切實(shí)可行且易于實(shí)現(xiàn),避免了目標(biāo)文件格式的轉(zhuǎn)換,比通常采用的FlashBurn工具使用起來更靈活方便,用戶可以通過簡單修改Flash燒寫函數(shù)使之適應(yīng)自己的硬件情況
對于Flash器件接口與TI的DSP不一致的情況,本方案是一個(gè)很好的選擇
TMS320C6000系列DSP(數(shù)字信號(hào)處理器)是TI公司最新推出的一種并行處理的數(shù)字信號(hào)處理器。它是基于TI的VLIW技術(shù)的,其中TMS320C62xx是定點(diǎn)處理器,TMS320C67xx是浮點(diǎn)處理器。本文主要討論TMS320C6201。該處理器的工作頻率最高可以采用50MHz,經(jīng)內(nèi)部4倍頻后升至200MHz,每個(gè)時(shí)鐘周期最多可以并行執(zhí)行8條指令,從而可以實(shí)現(xiàn)1600MIPS的定點(diǎn)運(yùn)算能力,而且完成1024定點(diǎn)FFT的時(shí)間只需70μs。
1.1 TMS320C6000的硬件結(jié)構(gòu)
圖1是TMS320C6000 CPU的結(jié)構(gòu)圖。
TMS320C6000的CPU有兩個(gè)數(shù)據(jù)通道A和B,每個(gè)通道有16個(gè)32位字長的寄存器(A0~A15,B0~B15),四個(gè)功能單元(L,S,M,D),每個(gè)功能單元負(fù)責(zé)完成一定的算術(shù)或者邏輯運(yùn)算。A、B兩通道的寄存器并不是完全共享,只能通過TMS320C6000提供的兩個(gè)交換數(shù)據(jù)通道1X、2X,才能實(shí)現(xiàn)處理單元從不同通道的寄存器堆那里獲取32位字長的操作數(shù)。
TMS320C6000的地址線為32位,存儲(chǔ)器尋址空間是4G。C6201片內(nèi)集成有1Mbit SRAM——512Kbit的程序存儲(chǔ)器(根據(jù)需要可全部配置成Cache)和512Kbit的數(shù)據(jù)存儲(chǔ)器。通過片內(nèi)的程序存儲(chǔ)空間控制器,CPU一次可以取出256bit,即一次最多可以取出8條32位指令。
C6201有32位的外部存儲(chǔ)接口EMIF為CPU訪問外圍設(shè)備提供了無縫接口。外圍設(shè)備可以是同步動(dòng)態(tài)存儲(chǔ)器(SDRAM)、同步突發(fā)靜態(tài)存儲(chǔ)器(SBSRAM)、靜態(tài)存儲(chǔ)器(SRAM)、只讀存儲(chǔ)器(ROM),也可以是FIFO寄存器。
為了便于進(jìn)行多信道數(shù)字信號(hào)處理,TMS320C6000配備了多信道帶緩沖能力的串口McBSP。McBSP的功能非常強(qiáng)大,除具有一般DSP串口功能之外,還可以支持T1/E1、ST-BUS、IOM2、SPI、IIS等不同標(biāo)準(zhǔn)。McBSP最多支持128個(gè)信道;支持多種數(shù)據(jù)格式(8/12/16/20/24/32bit)的傳輸;可自動(dòng)進(jìn)行u律、A律壓擴(kuò)。其工作速率可達(dá)到1/2時(shí)鐘速率。
TMS320C6000提供的16位主機(jī)接口(HPI)使得主機(jī)設(shè)備可以直接訪問DSP的存儲(chǔ)空間。通過內(nèi)部或外部存儲(chǔ)空間,主機(jī)和DSP可以交換信息。主機(jī)也可以利用HPI直接訪問映射進(jìn)存儲(chǔ)空間的外圍設(shè)備。
DSP器件一般都帶有DMA控制器,可以在CPU操作的后臺(tái)進(jìn)行數(shù)據(jù)傳輸。TMS320C6201的DMA控制器有4個(gè)獨(dú)立的可編程通道,可以同時(shí)進(jìn)行四個(gè)不同的DMA操作,每個(gè)通道的優(yōu)先級(jí)可以通過編程設(shè)定。每個(gè)通道可以根據(jù)需要傳輸8/16/32bit的數(shù)據(jù),并且DMA控制器可以訪問全部32位的地址空間。此外,還有一個(gè)輔助通道允許DMA控制器響應(yīng)主機(jī)通過HPI口發(fā)來的請求。
1.2 指令系統(tǒng)
C62xx和C67xx共享同一個(gè)指令集。C67xx可以使用所有的C62xx指令,但因?yàn)镃67xx是浮點(diǎn)芯片,所以C67xx的指令集中有一些指令只能用于浮點(diǎn)運(yùn)算。TMS320C6201CPU的設(shè)計(jì)采用了類似于RISC的結(jié)構(gòu),指令集簡單、運(yùn)算速度快。8個(gè)功能單元負(fù)責(zé)不同功能的運(yùn)算,指令和功能單元之間存在一個(gè)映射關(guān)系。其中,L單元有23條指令,M單元有20條指令,S單元29有條指令,D單元有26條指令。
TMS320C6201的大部分指令都可在單周期內(nèi)完成,都可以直接對8/16/32bit數(shù)據(jù)進(jìn)行操作。同時(shí),TMS320C6201指令集針對數(shù)字信號(hào)處理算法提供了一些特殊指令:為復(fù)雜計(jì)算提供的40bit的特殊操作的加法運(yùn)算;有效的溢出處理和歸一化處理;簡潔的位操作功能等。TMS320C6201中最多可以有8條指令同時(shí)并行執(zhí)行;所有指令均可條件執(zhí)行。以上所有特點(diǎn)提高了指令的執(zhí)行效率、減小了代碼長度、大大減少了因跳轉(zhuǎn)引起的開銷、提高了編碼效率。
流水線操作是DSP實(shí)現(xiàn)高速度、高效率的關(guān)鍵技術(shù)之一。TMS320C6000只有在流水線充分發(fā)揮作用的情況下,才能達(dá)到1600MIPS的速度。C6000的流水線分為三個(gè)階段:取指、解碼、執(zhí)行,總共11級(jí)。和以前的C3x、C54x相比,有非常大的優(yōu)勢,主要表現(xiàn)在:簡化了流水線的控制以消除流水線互鎖;增加流水線的深度以消除傳統(tǒng)流水線結(jié)構(gòu)在取指、數(shù)據(jù)訪問和乘法操作上的瓶頸。其中取指、數(shù)據(jù)訪問分為多個(gè)階段,使得C6000可以高速地訪問存儲(chǔ)空間。
2 優(yōu)化編程的幾個(gè)方法
使用TMS320C6000進(jìn)行程序設(shè)計(jì)時(shí),首先的感覺是匯編指令集太小了。C6000在設(shè)計(jì)時(shí)采用了一種類RISC機(jī)的結(jié)構(gòu),運(yùn)算速度特別快,但是指令集卻非常簡單。象DSP算法中常用的乘加指令、循環(huán)操作指令等,在C54x和C3x中兩條指令就可以完成的功能,而在C6000中卻需要一個(gè)循環(huán)體,所以它的程序設(shè)計(jì)一般比較復(fù)雜。要想充分發(fā)揮C6000的運(yùn)算能力,必須從它的硬件結(jié)構(gòu)出發(fā),最大限度地利用八個(gè)功能單元,使用軟件流水線,盡量讓程序無沖突的并行執(zhí)行。
并行處理的長處在于,在處理彼此之間沒有承接關(guān)系的運(yùn)算時(shí),在CPU資源允許的情況下可以并行完成。但對于前后有承接關(guān)系或者判斷、跳轉(zhuǎn)頻繁的情況,就無法發(fā)揮并行的優(yōu)勢。一般循環(huán)體都滿足并行處理的條件,并且循環(huán)體往往是程序中耗時(shí)最長的地方。因此進(jìn)行C6000應(yīng)用開發(fā)時(shí)應(yīng)將優(yōu)化重點(diǎn)放在循環(huán)體上。為了降低開發(fā)難度,C6000提供了很多在高級(jí)語言(如ANSI C)一級(jí)對程序進(jìn)行優(yōu)化的方法。在應(yīng)用滿足實(shí)時(shí)性處理要求時(shí),應(yīng)盡量采用這種方法。但是這種方法的效率比較低,C語言優(yōu)化最好的例子是點(diǎn)乘,這種循環(huán)使用C語言進(jìn)行優(yōu)化可以百分之百地的利用CPU資源,程序的并行性達(dá)到最好。但是我們在做20點(diǎn)的點(diǎn)乘時(shí)發(fā)現(xiàn)它的耗時(shí)是匯編語言程序的3倍。所以如果系統(tǒng)的實(shí)時(shí)性要求比較高,就不能使用這種優(yōu)化方法了。
這時(shí)可以考慮使用線性匯編語言進(jìn)行開發(fā)。線性匯編語言是TMS320C6000中獨(dú)有的一種編程語言,介于高級(jí)語言和低級(jí)語言之間。因?yàn)樵谟檬謱憛R編語言進(jìn)行應(yīng)用開發(fā)時(shí),開發(fā)者除了要精通C6000的指令系統(tǒng)之外,還必須為指令分配功能單元、考慮指令的延遲和功能單元之間的配合以及合理分配使用32個(gè)寄存器,才能寫出高效的并行指令,發(fā)揮C6000的威力。上面任何一個(gè)方面出現(xiàn)問題,都會(huì)嚴(yán)重影響算法的效率。
線性匯編語言的指令系統(tǒng)和匯編語言的指令系統(tǒng)完全相同,但是它有自己的匯編優(yōu)化器指令系統(tǒng),用于和匯編優(yōu)化器配合使用。與匯編語言的最大區(qū)別在于,編寫線性匯編語言時(shí)不需要考慮指令的延時(shí)、寄存器的使用和功能單元的分配,完全可以按照高級(jí)語言的方式進(jìn)行編寫。當(dāng)然由于它不是高級(jí)語言,有許多編程的限制。例如,在優(yōu)化循環(huán)體時(shí),不能使用跳轉(zhuǎn)到循環(huán)體之外的跳轉(zhuǎn)指令;另外計(jì)數(shù)器只能使用減計(jì)數(shù),如果使用加計(jì)數(shù),優(yōu)化器將不能工作等等。但總的說來,它的代碼效率遠(yuǎn)遠(yuǎn)高于高級(jí)語言,而且開發(fā)難度和開發(fā)周期比匯編語言要小得多。
在實(shí)際開發(fā)過程中需要具體情況具體分析,選擇一種高效、快捷的開發(fā)方法。以下結(jié)合應(yīng)用開發(fā)中的幾個(gè)模塊來簡述我們使用的優(yōu)化方法。
2.1 使用匯編語言
使用匯編語言進(jìn)行并行編程難度比較大。但在有些情況下,程序中數(shù)據(jù)有非常強(qiáng)的承接關(guān)系,并且該程序體邏輯關(guān)系清楚,使用的寄存器不超過32個(gè),這時(shí)直接使用匯編語言實(shí)現(xiàn),效率會(huì)更高。另外,有些使用C語言比較難實(shí)現(xiàn)的運(yùn)算函數(shù),在C6000的匯編指令集中可能有專用DSP指令,這時(shí)就可以直接使用匯編語言實(shí)現(xiàn)。
使用匯編語言進(jìn)行編程時(shí)特別需要注意的是C6000指令的延遲情況,有些指令并不是立刻就能得到結(jié)果。C6000指令集中有延遲的指令如表1所示。
例1 32位歸一化函數(shù)norm_l()
short norm_l(long L_var1)
{short var_out;
if (L_var1 == 0L) {
var_out = (short)0;
}
else {
if (L_var1 == (long)0xffffffffL) {
var_out = (short)31;
}
else {
if (L_var1 < 0L) {
L_var1 = *L_var1;
}
for(var_out=(short)0;L_var1<(long)0x40000000L;
var_out++) {
L_var1 <<= 1L;
}}}
return(var_out);
}
使用匯編語言進(jìn)行優(yōu)化:
.global _norm_l
_norm_l:
B B3
CMPEQ 0,A4,B0
[!B0] NORM A4,A4
NOP 3
消耗時(shí)間(時(shí)鐘周期):C語言norm_l()為723;匯編語言為11。
2.2 使用線性匯編語言重寫整個(gè)函數(shù)
對于某些以循環(huán)體為主的函數(shù)可以使用線性匯編語言重寫整個(gè)函數(shù)。使用匯編優(yōu)化器進(jìn)行優(yōu)化之后,效率是非常高的。
]]>
隨著近年來數(shù)字信號(hào)處理器(DSP)技術(shù)的迅猛發(fā)展,其越來越廣泛地應(yīng)用于國民經(jīng)濟(jì)的各個(gè)領(lǐng)域中。其中,TI公司推出的TMS320C6000系列DSP器件更是在許多需要進(jìn)行大量數(shù)字信號(hào)處理運(yùn)算并兼顧高實(shí)時(shí)性要求的場合得以應(yīng)用。TMS320C6000系列DSP的系統(tǒng)設(shè)計(jì)過程中,DSP器件的啟動(dòng)加載設(shè)計(jì)是較難解決的問題之一。
C6000系列DSP的啟動(dòng)加載方式包括不加載、主機(jī)加載和EMIF加載3種。
3種加載方式的比較:不加載方式僅限于存儲(chǔ)器0地址不是必須映射到RAM空間的器件,否則在RAM空間初始化之前CPU會(huì)讀取無效的代碼而導(dǎo)致錯(cuò)誤;主機(jī)加載方式則要求必須有一外部主機(jī)控制DSP的初始化,這將增加系統(tǒng)的成本和復(fù)雜度,在很多實(shí)際場合是難以實(shí)現(xiàn)的;EMIF加載方式的DSP與外部ROM/Flash接口較為自由,但片上Bootloader工具自動(dòng)搬移的代碼量有限(1 KB/64 KB)。本文主要討論常用的EMIF加載方式。
1 EMIF加載分析
實(shí)際應(yīng)用中,通常采用的是EMIF加載方式,把代碼和數(shù)據(jù)表存放在外部的非易失性存儲(chǔ)器里(常采用Flash器件)。
下面以TMS320C6000系列中最新的浮點(diǎn)CPU——TMS320C6713(簡稱“C6713”)為例,詳細(xì)分析其EMIF加載的軟硬件實(shí)現(xiàn)。
硬件方面,其與16位寬度的Flash器件的接口如圖1所示。
對于不同的DSP器件,加載方式的配置引腳稍有不同。C6713的配置引腳及其定義如表1所列。
應(yīng)用程序的大小決定了片上的Bootloadet工具是否足夠把所有的代碼都搬移到內(nèi)部RAM里。對于C6713,片上的Bootloader工具只能將1 KB的代碼搬入內(nèi)部RAM。通常情況下,用戶應(yīng)用程序的大小都會(huì)超過這個(gè)限制。所以,需要在外部Flash的前1 KB范圍內(nèi)預(yù)先存放一小段程序,待片上Bootloader工具把此段代碼搬移入內(nèi)部并開始執(zhí)行后,由這段代碼實(shí)現(xiàn)將Flash中剩余的用戶應(yīng)用程序搬移入內(nèi)部RAM中。此段代碼可以被稱作一個(gè)簡單的二級(jí)Bootloader。
圖2所示為使用二級(jí)Bootloader時(shí)的CPU運(yùn)行流程。
使用二級(jí)Bootloader需要考慮以下幾個(gè)事項(xiàng):
◇需要燒寫的COFF(公共目標(biāo)文件格式)段的選擇;
◇編寫二級(jí)Bootloader;
◇將選擇的COFF段燒入Flash。
一個(gè)COFF段就是占據(jù)一段連續(xù)存儲(chǔ)空間的程序或數(shù)據(jù)塊。COFF段分為3種類型:代碼段、初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段。
對于EMIF加載方式,需要加載的鏡像由代碼段(如.vectors和.text等)和初始化數(shù)據(jù)段(如.cinit,.const,.switch,.data等)構(gòu)成。另外,可以單獨(dú)定義一個(gè).boot-load段存放二級(jí)Bootloader。此段也需要寫入Flash。
所有未初始化的數(shù)據(jù)段(如.bss等)都不需要燒入到Flash中。
2 二級(jí)Bootloader的編寫
由于執(zhí)行二級(jí)Bootloader時(shí)C的運(yùn)行環(huán)境還未建立起來,所以必須用匯編語言編寫。二級(jí)Bootloader可參照其他類似文獻(xiàn)及TI相關(guān)文檔。此處不再贅述。
CCS中用戶工程編譯鏈接后產(chǎn)生的.map文件包含了存儲(chǔ)器的詳細(xì)分配信息。一個(gè)典型的map文件中包含的存儲(chǔ)器分配信息如表2所列。
與cmd文件不同,map文件不僅包含了各段存儲(chǔ)在哪一段內(nèi)存空間的信息,從map文件中還可以具體知道每個(gè)內(nèi)存區(qū)間中有多少被實(shí)際使用(燒寫Flash時(shí)會(huì)用到這個(gè)參數(shù))。內(nèi)存區(qū)間中未被使用部分是不需要寫入Flash內(nèi)容的,實(shí)際被使用的部分才是真正需要寫人到Flash中的內(nèi)容。
3 Flash的燒寫
把代碼等寫入Flash的辦法大體上可分為以下幾種:
① 使用通用燒寫器寫入。
② 使用CCS中自帶的FlashBurn工具。
③ 用戶自己編寫燒寫Flash的程序,由DSP將內(nèi)存映像寫入Flash。
其中,使用通用燒寫器燒寫需要將內(nèi)存映像轉(zhuǎn)換為二進(jìn)制或十六進(jìn)制格式的文件,而且要求Flash器件是可插拔封裝的。這將導(dǎo)致器件的體積較大,給用戶的設(shè)計(jì)帶來不便。
使用TI公司提供的FlashBurn工具的好處在于使用較為直觀。FlashBurn工具提供的圖形界面可以方便地對Flash執(zhí)行擦除、編程和查看內(nèi)容等操作。但這種力法的缺點(diǎn)也不少:首先,FlashBurn工具運(yùn)行時(shí)需要下載一個(gè).out鏡像(FBTC,FlashBurn Target Component)到DSP系統(tǒng)中,然后由上位PC機(jī)通過仿真器發(fā)送消息(指令和數(shù)據(jù))給下位DSP,具體對Flash的操作由FBTC執(zhí)行。然而,這個(gè)FBTC一般是針對TI公司提供的DSP專門編寫的,與板上使用的Flash的接口寬度(默認(rèn)是8位)、操作關(guān)鍵字(因生產(chǎn)廠商不同而各異)都有關(guān),所以,對用戶自己制作的硬件不一定適合。例如:如果用戶自己的電路板上使用的是與DSK同品牌的Flash芯片,接口為16位數(shù)據(jù)寬度,那么,使用FlashBur’n工具燒寫將最多只有一半的Flash容量能夠被使用,要想正確實(shí)現(xiàn)]EMIF加載就必須選擇8位加載方式。這就造成了Flash存儲(chǔ)器資源的浪費(fèi),同時(shí)限制了用戶開發(fā)的靈活性。
雖然TI公司提供了FBTC的源代碼供有需要的用戶修改,但這樣用戶需要去了解FBTC的運(yùn)行機(jī)制及其與上位機(jī)的通信協(xié)議,并對Flash燒寫函數(shù)進(jìn)行修改。用戶可能需要修改的幾個(gè)地方如下:對Flash編程的關(guān)鍵字和地址,BurnFlash函數(shù)中的數(shù)據(jù)指針和EMIF口的配置(針對1.0版本FBTC)。這就給用戶開發(fā)帶來了不便。把開發(fā)時(shí)間浪費(fèi)在了解一個(gè)并不算簡單的Flash燒寫工具上并不是一個(gè)好的選擇。
其次,FlashBurn工具不能識(shí)別.out文件,只接受..ex的十六進(jìn)制文件,因此,需要將.out文件轉(zhuǎn)換為.hex文件。這個(gè)轉(zhuǎn)換的工具就是TI公司提供的Hex6x.exe工具。轉(zhuǎn)換過程的同時(shí),需要一個(gè)cmd文件(即圖3中的Hex.cmd)指定作為輸入的.out文件,輸出的.hex文件的格式,板上Flash芯片的類型和大小,需要寫入Flash中的COFF段名等。
使用用戶自己編寫的燒寫Flash的程序較為靈活,避免了文件格式轉(zhuǎn)換的繁瑣。不過,此方法要求用戶對自己使用的Flash芯片較為熟悉。
通常采用的Flash燒寫程序是單獨(dú)建立一個(gè)工程的辦法:先把用戶應(yīng)用程序(包含二級(jí)Bootloader)編譯生成的.out文件裝載到目標(biāo)DSP系統(tǒng)的RAM中,再把燒寫Flash的工程編譯生成的.out文件裝載到目標(biāo)DSP系統(tǒng)RAM的另一地址范圍,執(zhí)行Flash燒寫程序,完成對Flash的燒寫。這個(gè)辦法要注意避免兩次裝載可能產(chǎn)生的地址覆蓋,防止第2次裝載修改了應(yīng)該寫入Flash的第1次裝載的內(nèi)容。
實(shí)際上,可以將Flash燒寫程序嵌入到用戶主程序代碼中去,比單獨(dú)建立一個(gè)燒寫Flash的工程更為方便。Flash芯片的燒寫程序段如下:
ChipErase函數(shù)和ProgramFlashArray函數(shù)的編寫可參照用戶使用的Flash芯片的Datasheet以及參考文獻(xiàn)[1]。
ProgramFlashArray函數(shù)的第1個(gè)參數(shù)是源地址指針(指向內(nèi)部Ram),第2個(gè)參數(shù)是目標(biāo)地址指針(指向外部Flash),第3個(gè)參數(shù)是要寫入的數(shù)據(jù)長度(單位為字)。
編寫Flash燒寫函數(shù)時(shí)有3點(diǎn)需要注意:
① 指向Flash地址的指針。由于C6713的低兩位地址用于譯碼作字節(jié)選擇,地址總線的最低位是EA2,所以,邏輯地址需要適當(dāng)?shù)囊莆徊拍苷_地指向日標(biāo)。
對8位存儲(chǔ)器而言,應(yīng)該左移2位;對16位存儲(chǔ)器而言,應(yīng)該左移1位;對于32位存儲(chǔ)器,則不需要移位。例如要從(往)Flash的0x00000003地址讀(寫)一個(gè)字,其邏輯地址應(yīng)該是0x90000000+(0x0003<<1),而非0x90000003。
② map文件中各內(nèi)存區(qū)間被實(shí)際占用的尺寸大小是以字節(jié)為單位的,而ProgramFlashArray函數(shù)寫入Flash的數(shù)據(jù)單位為字,所以需要將map文件中得到的尺寸大小的一半作為ProgramFlashArray函數(shù)的參數(shù)。
③ 燒寫函數(shù)中使用了flash_burned常量作為判斷是否需要對Flash操作的依據(jù),且將其初始化為1。這是為了避免Flash加載之后會(huì)執(zhí)行對Flash的操作。此變量應(yīng)在燒寫Flash時(shí)手動(dòng)修改為0。
在仿真加載方式下,可以在CCS里的watchwindow窗口手動(dòng)修改flash_burned常量為0,強(qiáng)迫CPU進(jìn)入對Flash編程的程序段。實(shí)驗(yàn)證明,在仿真加載方式下手動(dòng)修改flash_burned并不影響寫入到Flash中的flash_burn-ed的值(仍為1),所以,寫入Flash的flash_burned的值仍然是1。在系統(tǒng)Flash加載之后,CPU就會(huì)跳過此段代碼,實(shí)現(xiàn)正確運(yùn)行。
4 結(jié) 論
本Flash加載方案以C6713為例,稍加修改即可適用于TMS320C6000系列的其他DSP器件。經(jīng)過在研制的伺服測試平臺(tái)中的應(yīng)用,證明本方法切實(shí)可行且易于實(shí)現(xiàn),避免了目標(biāo)文件格式的轉(zhuǎn)換,比通常采用的FlashBurn工具使用起來更靈活方便,用戶可以通過簡單修改Flash燒寫函數(shù)使之適應(yīng)自己的硬件情況。對于Flash器件接口與TI的DSP不一致的情況,本方案是一個(gè)很好的選擇。
Matlab是一個(gè)強(qiáng)大的分析、計(jì)算和可視化工具,且編程非常方便。Simulink是Matlab產(chǎn)品中用來建模、分析和仿真各種動(dòng)態(tài)系統(tǒng)的圖形化工具。通過豐富的功能模塊,可以迅速地創(chuàng)建動(dòng)態(tài)系統(tǒng)模型。同時(shí)Simulink也是Real-Time Workshop(以下簡稱RTW)的支持平臺(tái)。通過RTW可以自動(dòng)生成面向不同目標(biāo)的代碼。
Matlab輔助DSP進(jìn)行混合編程,很多學(xué)者作了許多研究和嘗試。文獻(xiàn)[1]提出了由Matlab向DSP傳送原始數(shù)據(jù)以及DSP反饋處理后數(shù)據(jù)的方法,充分利用了Matlab優(yōu)秀的可視化功能。但仍然要在DSP開發(fā)環(huán)境中編寫復(fù)雜的代碼。文獻(xiàn)[2,3]利用工具包——Matlab Link for CCS Development Tools(以下簡稱CCSLink),實(shí)現(xiàn)了在Matlab、TI開發(fā)環(huán)境和DSP硬件間的雙向連接,極大地降低了開發(fā)人員調(diào)試DSP代碼的難度和工作量。但CCSLink只用于DSP程序的調(diào)試、數(shù)據(jù)傳遞和驗(yàn)證等過程,同樣需要編寫復(fù)雜的DSP代碼。而另一工具包——ETTIC6000,利用RTW直接從Simulink模型生成面向TI C6000 DSP的高效代碼,不再需要傳統(tǒng)的DSP編程過程。本文在此基礎(chǔ)上進(jìn)行研究,設(shè)計(jì)并自動(dòng)生成FIR低通濾波器的DSP代碼。
2 ETTIC6000的功能、特點(diǎn)及開發(fā)DSP代碼過程
ETTIC6000是Math Works公司和TI公司聯(lián)合開發(fā)的工具包。利用RTW直接從Simulink模型生成面向TI的C6701 EVM和C6711 DSK目標(biāo)板的可執(zhí)行文件或CCS工程。在DSP代碼自動(dòng)生成過程中,ETTIC6000必須與Simulink,RTW,CCS和TI目標(biāo)板等軟硬件相結(jié)合才能充分顯現(xiàn)其功能。它們之間的關(guān)系如圖1所示。
應(yīng)用ETTIC6000開發(fā)DSP代碼的過程一般經(jīng)過如下幾步:
(1)概念構(gòu)思和DSP處理算法設(shè)計(jì)。
(2)在Simulink環(huán)境下,利用Matlab基本模塊,Simulink基本模塊,數(shù)字信號(hào)處理工具箱,以及專門面向TI C6000的模塊組等模塊,構(gòu)建算法模型并運(yùn)行仿真。并非所有模塊都可以轉(zhuǎn)化為DSP代碼并順利編譯。例如一些面向Win32的程序模塊在轉(zhuǎn)化為DSP代碼或在CCS中進(jìn)行編譯時(shí)就會(huì)出現(xiàn)無法兼容或找不到相關(guān)頭文件等錯(cuò)誤提示。
(3)對仿真結(jié)果進(jìn)行評(píng)價(jià),若仿真結(jié)果滿意,即可在模型中加入C6701 EVM或C6711 DSK目標(biāo)板的輸入輸出模塊。否則,重新進(jìn)行算法設(shè)計(jì)、建模、仿真。
(4)在設(shè)計(jì)好的面向具體目標(biāo)板的模型中,設(shè)置Simulation選項(xiàng),包括RTW中的編譯連接等選項(xiàng)。
(5)執(zhí)行代碼自動(dòng)生成、編譯、調(diào)試并裝載到目標(biāo)板上運(yùn)行。
從整個(gè)設(shè)計(jì)過程來看,DSP開發(fā)人員只需在Matlab中進(jìn)行Simulink模型設(shè)計(jì)、構(gòu)建與仿真。省去了編寫、調(diào)試復(fù)雜DSP代碼的過程。下面以實(shí)現(xiàn)FIR低通濾波器為例,詳細(xì)闡述應(yīng)用ETTIC6000開發(fā)DSP代碼的全部過程。
![]() |
3 FIR低通濾波器實(shí)現(xiàn)過程
此系統(tǒng)要求對頻率分別為200 Hz,600 Hz和1 000 Hz,幅度為1的混合正弦信號(hào)進(jìn)行低通濾波,保留200 Hz的正弦信號(hào)。采用Simulink環(huán)境下的FDATool工具設(shè)計(jì)FIR低通濾波器。在以下軟硬件環(huán)境中設(shè)計(jì)并通過測試,以下軟件均采用默認(rèn)安裝路徑,若軟硬件環(huán)境不同,相應(yīng)的參數(shù)設(shè)置將有很大差別。
硬件環(huán)境:TMS320C6711 DSK開發(fā)板、PC聲卡、雙頭音頻線等。
軟件環(huán)境:Matlab 7.4(R2007a),CCStudio 3.1,Simulink 6.6,Real-Time Workshop 6.6,Target forTI C6000(tm)3.2,Link for Code ComposerStudio 3.0。
Matlab附帶軟件可以在命令窗口通過ver命令查看,附帶軟件的使用可以充分利用help命令。
3.1 Simulink環(huán)境下構(gòu)建算法模型并仿真
依據(jù)設(shè)計(jì)思想,在Simulink環(huán)境下,通過Simulink基本模塊庫和數(shù)字信號(hào)處理工具箱構(gòu)建如圖2所示系統(tǒng)模型。三個(gè)輸入信號(hào)模塊關(guān)鍵參數(shù)設(shè)置:頻率分別設(shè)置為200 Hz,600 Hz和1 000 Hz;幅度為1;采樣頻率為1 600 Hz。FDA Tool關(guān)鍵參數(shù)設(shè)置:濾波類型選擇低通;階數(shù)為80;采樣頻率為1 600 Hz;起始頻率為100 Hz;截至頻率為500 Hz。
![]() |
對圖2所示模型運(yùn)行仿真,仿真結(jié)果如圖3所示。從濾波后的波形看,此濾波器的參數(shù)設(shè)置比較合理。
![]() |
3.2 構(gòu)建面向C6711 DSK目標(biāo)模型
(1)依據(jù)仿真模型利用ETTIC6000中C6711 DSK輸入輸出模塊構(gòu)建如圖4所示面向C6711 DSK目標(biāo)模型。C6711 DSK ADC與C6711 DSK DAC參數(shù)采用默認(rèn)設(shè)置。FDA Tool參數(shù)與仿真模型中參數(shù)保持一致,設(shè)置完成后將模型保存在Matlab默認(rèn)目錄下,命名為myfilter.mdl。
![]() |
(2)依據(jù)圖4構(gòu)建如圖5所示的硬件平臺(tái)。TMS320C6711 DSK與PC通過并口線連接;信號(hào)源由PC聲卡輸出,經(jīng)C6711 DSK A/D轉(zhuǎn)換后進(jìn)行FIR低通濾波,由Line OUT將濾波后信號(hào)輸出至PC聲卡,最后采集聲卡信號(hào),顯示濾波后波形。
3.3 DSP代碼自動(dòng)生成
進(jìn)行DSP代碼自動(dòng)生成前,首先要安裝、配置相應(yīng)的軟硬件環(huán)境。正確安裝、配置是此系統(tǒng)能夠成功運(yùn)行的關(guān)鍵。具體配置有如下幾個(gè)方面:
(1)依據(jù)圖5實(shí)現(xiàn)硬件連接。在BIOS中將并口傳輸模式改為EPP模式;在DOS模式下,運(yùn)行C:\CCS-tudio v3.1\C6000\DSK6X11\conftest\dsk6xtst.exe文件,可以檢測目標(biāo)板是否連接正常;最后檢查PC聲卡輸入輸出是否正常。
(2)正確配置CCS。點(diǎn)擊Setup CCStudio V3.1,選擇C6711 DSK Port 378 EPP Mode模塊,點(diǎn)擊Add,設(shè)置并口地址為0x378;保存設(shè)置后退出。
(3)打開myfilter.mdl模型,展開simulation>Configuration Paraineters面板,面板中相應(yīng)選項(xiàng)設(shè)置如下:
![]() |
其他選項(xiàng)設(shè)置為默認(rèn)模式。
(4)點(diǎn)擊RTW面板Generate code按鈕,執(zhí)行代碼自動(dòng)生成過程,此時(shí)Matlab命令窗口將顯示如下信息:
![]() |
(5)CCStudio 3.1將自動(dòng)運(yùn)行,窗口中自動(dòng)生成myfilter.pit的工程文件。
3.4 FIR低通濾渡器實(shí)現(xiàn)
(1)對myfiher.pit的工程文件在CCS中進(jìn)行編譯、連接、裝載、運(yùn)行。
(2)利用Matlab中的daqfcengen函數(shù),可以實(shí)現(xiàn)向PC聲卡輸出端輸出波形。在Matlab命令窗口輸入daqfcengen命令,將顯示波形發(fā)生器窗口,將頻率設(shè)置為200 Hz,幅度設(shè)置為1,如圖6所示。點(diǎn)擊Start按鈕。在Matlab命令窗口繼續(xù)輸入daqfcengen命令,相繼實(shí)現(xiàn)頻率為600 Hz,1 000 Hz的波形輸出。這樣PC聲卡就輸出了三個(gè)不同頻率波形的疊加。
![]() |
(3)利用Matlab中的daqscope函數(shù),可以實(shí)現(xiàn)顯示PC聲卡輸入端的波形。在Matlab命令窗口輸入daqscope命令,將顯示波形顯示器窗口,如圖7所示,即為濾波后的輸出波形。
![]() |
4 結(jié) 語
從整個(gè)FIR低通濾波器實(shí)現(xiàn)過程看,沒有編寫一行DSP代碼,全部采用圖形化的編程模式,生成的CCS工程文件既可供初學(xué)者學(xué)習(xí)、借鑒。又可供具有一定編程經(jīng)驗(yàn)的程序開發(fā)者對代碼進(jìn)一步修改或優(yōu)化,提高代碼執(zhí)行效率。
從實(shí)驗(yàn)結(jié)果看,設(shè)計(jì)的FIR低通濾波器濾波效果明顯。充分說明利用DSP代碼自動(dòng)生成技術(shù)實(shí)現(xiàn)FIR低通濾波器的方法是可行的、高效的。Matlab輔助DSP在語音處理、圖像處理、通信、雷達(dá)等領(lǐng)域還有許多值得研究的地方。采用多語言工具進(jìn)行程序開發(fā)也是今后發(fā)展的趨勢.
]]>C6000系列DSP的啟動(dòng)加載方式包括不加載、主機(jī)加載和EMIF加載3種。
3種加載方式的比較:不加載方式僅限于存儲(chǔ)器0地址不是必須映射到RAM空間的器件,否則在RAM空間初始化之前CPU會(huì)讀取無效的代碼而導(dǎo)致錯(cuò)誤;主機(jī)加載方式則要求必須有一外部主機(jī)控制DSP的初始化,這將增加系統(tǒng)的成本和復(fù)雜度,在很多實(shí)際場合是難以實(shí)現(xiàn)的;EMIF加載方式的DSP與外部ROM/Flash接口較為自由,但片上Bootloader工具自動(dòng)搬移的代碼量有限(1KB/64KB)。本文主要討論常用的EMIF加載方式。
1 EMIF加載分析
實(shí)際應(yīng)用中,通常采用的是EMIF加載方式,把代碼和數(shù)據(jù)表存放在外部的非易失性存儲(chǔ)器里(常采用Flash器件)。
下面以TMS320C6000系列中最新的浮點(diǎn)CPUTMS320C6713(簡稱“C6713”)為例,詳細(xì)分析其EMIF加載的軟硬件實(shí)現(xiàn)。
硬件方面,其與16位寬度的Flash器件的接口如圖1所示。
對于不同的DSP器件,加載方式的配置引腳稍有不同。C6713的配置引腳及其定義如表l所列。
應(yīng)用程序的大小決定了片上的Bootloader工具是否足夠把所有的代碼都搬移到內(nèi)部RAM里。對于C6713,片上的Bootloader工具只能將1 KB的代碼搬入內(nèi)部RAM。通常情況下,用戶應(yīng)用程序的大小都會(huì)超過這個(gè)限制。所以,需要在外部Flash的前l(fā) KB范圍內(nèi)預(yù)先存放一小段程序,待片上Bootloader工具把此段代碼搬移入內(nèi)部并開始執(zhí)行后,由這段代碼實(shí)現(xiàn)將Flash中剩余的用戶應(yīng)用程序搬移入內(nèi)部RAM中。此段代碼可以被稱作一個(gè)簡單的二級(jí)Bootloader。
圖2所示為使用二級(jí)Bootloader時(shí)的CPU運(yùn)行流程。
使用二級(jí)Bootloader需要考慮以下幾個(gè)事項(xiàng):
◇需要燒寫的COFF(公共目標(biāo)文件格式)段的選擇;
◇編寫二級(jí)Bootloader;
◇將選擇的COFF段燒入Flash。
一個(gè)COFF段就是占據(jù)一段連續(xù)存儲(chǔ)空間的程序或數(shù)據(jù)塊。COFF段分為3種類型:代碼段、初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段。
對干EMIF加載方式,需要加載的鏡像由代碼段(如.vectors和.text等)和初始化數(shù)據(jù)段(如.cinit,.const,.switch,.data等)構(gòu)成。另外,可以單獨(dú)定義一個(gè).bootload段存放二級(jí)Bootloader。此段也需要寫入Flash。
所有未初始化的數(shù)據(jù)段(如.bss等)都不需要燒入到Flash中。
2 二級(jí)Bootloader的編寫
由于執(zhí)行二級(jí)Bootloader時(shí)C的運(yùn)行環(huán)境還未建立起來,所以必須用匯編語言編寫。二級(jí)Bootloader可參照其他類似文獻(xiàn)及TI相關(guān)文檔。此處不再贅述。
CCS中用戶工程編譯鏈接后產(chǎn)生的.map文件包含了存儲(chǔ)器的詳細(xì)分配信息。一個(gè)典型的map文件中包含的存儲(chǔ)器分配信息如表2所列
]]>C6000系列DSP的啟動(dòng)加載方式包括不加載、主機(jī)加載和EMIF加載3種。
3種加載方式的比較:不加載方式僅限于存儲(chǔ)器0地址不是必須映射到RAM空間的器件,否則在RAM空間初始化之前CPU會(huì)讀取無效的代碼而導(dǎo)致錯(cuò)誤;主機(jī)加載方式則要求必須有一外部主機(jī)控制DSP的初始化,這將增加系統(tǒng)的成本和復(fù)雜度,在很多實(shí)際場合是難以實(shí)現(xiàn)的;EMIF加載方式的DSP與外部ROM/Flash接口較為自由,但片上Bootloader工具自動(dòng)搬移的代碼量有限(1 KB/64 KB)。本文主要討論常用的EMIF加載方式。
1 EMIF加載分析
實(shí)際應(yīng)用中,通常采用的是EMIF加載方式,把代碼和數(shù)據(jù)表存放在外部的非易失性存儲(chǔ)器里(常采用Flash器件)。
下面以TMS320C6000系列中最新的浮點(diǎn)CPU——TMS320C6713(簡稱“C6713”)為例,詳細(xì)分析其EMIF加載的軟硬件實(shí)現(xiàn)。
硬件方面,其與16位寬度的Flash器件的接口如圖1所示。
對于不同的DSP器件,加載方式的配置引腳稍有不同。C6713的配置引腳及其定義如表1所列。
應(yīng)用程序的大小決定了片上的Bootloadet工具是否足夠把所有的代碼都搬移到內(nèi)部RAM里。對于C6713,片上的Bootloader工具只能將1 KB的代碼搬入內(nèi)部RAM。通常情況下,用戶應(yīng)用程序的大小都會(huì)超過這個(gè)限制。所以,需要在外部Flash的前1 KB范圍內(nèi)預(yù)先存放一小段程序,待片上Bootloader工具把此段代碼搬移入內(nèi)部并開始執(zhí)行后,由這段代碼實(shí)現(xiàn)將Flash中剩余的用戶應(yīng)用程序搬移入內(nèi)部RAM中。此段代碼可以被稱作一個(gè)簡單的二級(jí)Bootloader。
圖2所示為使用二級(jí)Bootloader時(shí)的CPU運(yùn)行流程。
使用二級(jí)Bootloader需要考慮以下幾個(gè)事項(xiàng):
◇需要燒寫的COFF(公共目標(biāo)文件格式)段的選擇;
◇編寫二級(jí)Bootloader;
◇將選擇的COFF段燒入Flash。
一個(gè)COFF段就是占據(jù)一段連續(xù)存儲(chǔ)空間的程序或數(shù)據(jù)塊。COFF段分為3種類型:代碼段、初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段。
對于EMIF加載方式,需要加載的鏡像由代碼段(如.vectors和.text等)和初始化數(shù)據(jù)段(如.cinit,.const,.switch,.data等)構(gòu)成。另外,可以單獨(dú)定義一個(gè).boot-load段存放二級(jí)Bootloader。此段也需要寫入Flash。
所有未初始化的數(shù)據(jù)段(如.bss等)都不需要燒入到Flash中。
2 二級(jí)Bootloader的編寫
由于執(zhí)行二級(jí)Bootloader時(shí)C的運(yùn)行環(huán)境還未建立起來,所以必須用匯編語言編寫。二級(jí)Bootloader可參照其他類似文獻(xiàn)及TI相關(guān)文檔。此處不再贅述。
CCS中用戶工程編譯鏈接后產(chǎn)生的.map文件包含了存儲(chǔ)器的詳細(xì)分配信息。一個(gè)典型的map文件中包含的存儲(chǔ)器分配信息如表2所列。
與cmd文件不同,map文件不僅包含了各段存儲(chǔ)在哪一段內(nèi)存空間的信息,從map文件中還可以具體知道每個(gè)內(nèi)存區(qū)間中有多少被實(shí)際使用(燒寫Flash時(shí)會(huì)用到這個(gè)參數(shù))。內(nèi)存區(qū)間中未被使用部分是不需要寫入Flash內(nèi)容的,實(shí)際被使用的部分才是真正需要寫人到Flash中的內(nèi)容。
3 Flash的燒寫
把代碼等寫入Flash的辦法大體上可分為以下幾種:
① 使用通用燒寫器寫入。
② 使用CCS中自帶的FlashBurn工具。
③ 用戶自己編寫燒寫Flash的程序,由DSP將內(nèi)存映像寫入Flash。
其中,使用通用燒寫器燒寫需要將內(nèi)存映像轉(zhuǎn)換為二進(jìn)制或十六進(jìn)制格式的文件,而且要求Flash器件是可插拔封裝的。這將導(dǎo)致器件的體積較大,給用戶的設(shè)計(jì)帶來不便。
]]>