《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > AET原創(chuàng) > TMS320C6678開發(fā)十大關(guān)鍵技巧問答

TMS320C6678開發(fā)十大關(guān)鍵技巧問答

2016-12-10
作者:朱長(zhǎng)江
來源:電子技術(shù)應(yīng)用
關(guān)鍵詞: TMS320C6678 DSP

TMS320C6678 是基于TI最新 DSP 系列器件 TMS320C66x 之上,采用 8 個(gè) 1.25GHz DSP 內(nèi)核構(gòu)建而成,并在單個(gè)器件上完美集成了 320 GMAC 與 160 GFLOP 定點(diǎn)及浮點(diǎn)性能,從而使用戶不僅能整合多個(gè) DSP 以縮小板級(jí)空間并降低成本,同時(shí)還能減少整體的功耗要求,充分滿足移動(dòng)網(wǎng)絡(luò)領(lǐng)域?qū)νǖ烂芏燃案哔|(zhì)量媒體服務(wù)日益增長(zhǎng)的需求。自2011年德州儀器推出多核DSP TMS320C6678后,以該芯片為核心的DSP開放板層出不窮,學(xué)習(xí)這款芯片的人日益增多。下面小編把工程師朋友在開發(fā)這款芯片的過程中遇到的問題和解決方法以問答的形式進(jìn)行了整理,希望對(duì)初學(xué)者能有所幫助!

圖片1.png

一.TMS320C6678 網(wǎng)絡(luò)問題

1問:用自己開發(fā)的板子,采用的雙網(wǎng)口設(shè)計(jì),網(wǎng)口0和網(wǎng)口1。用TI官方給的例子只能網(wǎng)口1通信,在例子上修改了sgmii初始化了sgmii0和sgmii1但是還是只能網(wǎng)口1通信。

答:要修改網(wǎng)絡(luò)接口管理單元的庫,nimu。在EMACInit_Core函數(shù)中有設(shè)置發(fā)送接口配置的信息。這個(gè)函數(shù)是隱形的被NDK調(diào)用。所以剛開始比較難找到相應(yīng)的位置。

2問:c6678的兩個(gè)網(wǎng)口是如何同時(shí)使用的, 能不能多個(gè)cpu core 同時(shí)使用同一個(gè)網(wǎng)口, 請(qǐng)賜教。

答:C6678的EMAC是cppi器件,即通過Navigator進(jìn)行包的管理,所以收發(fā)的數(shù)據(jù)包都是Queue來管理,可以同時(shí)使用;需要注意的是可以配置每個(gè)發(fā)送的包由指定的port發(fā)出,或者向兩個(gè)port廣播。

二.TMS320C6678 關(guān)于多核編程問題

1問:目前的C++程序的段,都放到了DDR3里,這樣的話,我要是三個(gè)核同時(shí)運(yùn)行,豈不是對(duì)其中相同的堆棧進(jìn)行訪問嗎?嗯,對(duì)于所有段都放到DDR3的情況,怎樣進(jìn)行多核編程呢?

答:在6678里面有MPAX MMU的,可以在DDR3上給每個(gè)核都開辟一個(gè)私有的空間,在物理地址上是連續(xù)的,但對(duì)每個(gè)核讀/寫來說地址都是相同的。不同core的system stack及task stack必須不一樣。

三.TMS320C6678主頻設(shè)置問題

1問:datasheet里面講TMS320C6678的主頻為1G,1.25G,1.4G可選,請(qǐng)問,如何設(shè)置TMS320C6678的主頻參數(shù)呢?是在boot的時(shí)候作設(shè)置嗎?與cmd文件有沒有關(guān)系呢?

答:首先要確定你的芯片是不是支持1.2G和1.4G,不是所有的C6678都支持。其次,主頻你是在MAINPLL里面配置的,根據(jù)你的輸入時(shí)鐘頻率,配置MAINPLL得到一個(gè)主頻。你可以通過boot做配置,也可以通過boot后軟件配置。與cmd文件沒有關(guān)聯(lián)。

四.tms320c6678 的中斷響應(yīng)

1問:在中斷響應(yīng)的過程中,1024個(gè)系統(tǒng)事件先是通過ch_map映射到channel ,channel再映射到主機(jī)中斷輸出,host interrupt output 是需要映射到INTC的system events然后才能掛接到dsp可以識(shí)別的12中斷上,這里host interrupt output是256個(gè),INTC的system events是128個(gè),這里host interrupt output 和system events是有什么映射關(guān)系嗎?有的話是如何映射的?

答:chip interrupt controller的輸入稱作host interrupt event,這些事件經(jīng)過映射可以與任意的chip INTC channel進(jìn)行映射輸出;chip INTC channel的某些輸出事件是直接與corepac INTC的對(duì)應(yīng)輸入事件一一連接,具體的對(duì)應(yīng)關(guān)系參考6678 data manual interrupt表格。chip intc只有特定的輸出才會(huì)core intc與的某些輸入一一對(duì)應(yīng),所以只有將Chip INTC的輸入256個(gè)事件與這些特定的輸出映射起來,才可以最終路由到core內(nèi)部12個(gè)中斷矢量表。

參考中斷分享:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/25518.aspx

五.TMS320C6678多核程序的運(yùn)行

1問:最近剛剛接觸多核DSP,我想問下,在準(zhǔn)備運(yùn)行多核程序時(shí),是需要將程序在每個(gè)核里面進(jìn)行l(wèi)oad吧?TI提供的多核運(yùn)行例程有哪些,具體在MSDK下的哪個(gè)位置?另外對(duì)于API函數(shù),在對(duì)其進(jìn)行直接調(diào)用時(shí),能否在不用SYS/BIOS的情況下,使用中斷實(shí)現(xiàn)調(diào)用,例如uart通信,直接調(diào)用API函數(shù)實(shí)現(xiàn)查詢式通信,能否添加中斷函數(shù),調(diào)用uart的API函數(shù)實(shí)現(xiàn)中斷式通信?

答:程序用到哪個(gè)核就需要load到哪個(gè)核里邊,在MCSDK的以下位置有多核運(yùn)行的例程:demos\image_processing\ipc,不使用SYS/BIOS也可以使用API函數(shù)。

六.TMS320C6678系統(tǒng)設(shè)計(jì)中PCIECLK問題

1問:請(qǐng)問在設(shè)計(jì)基于TMS320C6678系統(tǒng)板時(shí),如果不用PCIE模塊,是不是可以懸空PCIECLKP和PCIECLKN引腳,還是是分別接高電平和低電平。

答:請(qǐng)參考Keystone硬件設(shè)計(jì)手冊(cè),PCIE不用時(shí),PCIECLKP端接CVDD,N端接地,不可懸空。

七.TMS320C6678的定點(diǎn)運(yùn)算與浮點(diǎn)運(yùn)算

1問:看介紹,TMS320C6678是定點(diǎn)與浮點(diǎn)運(yùn)算都支持的DSP芯片?,F(xiàn)在自己編寫的程序中,所使用的數(shù)據(jù)除了整型之外都是浮點(diǎn)數(shù)。想問一下,在運(yùn)算浮點(diǎn)數(shù)的時(shí)候,DSP是否會(huì)將浮點(diǎn)數(shù)轉(zhuǎn)為定點(diǎn)數(shù),再進(jìn)行運(yùn)算,然后再轉(zhuǎn)為浮點(diǎn)數(shù)?

答:1. 編譯器會(huì)根據(jù)客戶定義的數(shù)據(jù)類型來調(diào)用相關(guān)的匯編指令來進(jìn)行運(yùn)算,如果直接定義的是浮點(diǎn)數(shù),那么編譯器就調(diào)用浮點(diǎn)數(shù)進(jìn)行運(yùn)算。

2. 對(duì)于浮點(diǎn)和定點(diǎn)的選擇,如果算法是從matlab或vc繼承過來的,那么前期直接用浮點(diǎn)數(shù)進(jìn)行運(yùn)算可以很容易的將算法在DSP上實(shí)現(xiàn),如果后期算法成熟了,可以進(jìn)行定點(diǎn)化,提高運(yùn)行效率。

2問:c6678的兩個(gè)網(wǎng)口是如何同時(shí)使用的, 能不能多個(gè)cpu core 同時(shí)使用同一個(gè)網(wǎng)口, 請(qǐng)賜教。

答:C6678的EMAC是cppi器件,即通過Navigator進(jìn)行包的管理,所以收發(fā)的數(shù)據(jù)包都是Queue來管理,可以同時(shí)使用;需要注意的是可以配置每個(gè)發(fā)送的包由指定的port發(fā)出,或者向兩個(gè)port廣播。

八.TMS320C6678 系統(tǒng)如何獲得CPU

1問:我們目前在使用DSP做一個(gè)算法處理服務(wù)器,客戶端通過TCP網(wǎng)絡(luò),按照網(wǎng)絡(luò)協(xié)議將需要處理的數(shù)據(jù)發(fā)送給DSP服務(wù)器,DSP接到數(shù)據(jù)后進(jìn)行運(yùn)算,運(yùn)算結(jié)束后將運(yùn)算結(jié)果,再發(fā)送給客戶端。

現(xiàn)在的現(xiàn)象是,當(dāng)客戶端連續(xù)發(fā)送多個(gè)數(shù)據(jù)請(qǐng)求時(shí),發(fā)送到中間某一個(gè)時(shí)網(wǎng)絡(luò)會(huì)中斷,當(dāng)前算法特點(diǎn)是,由于運(yùn)算最較大,運(yùn)算時(shí)間比較長(zhǎng),暫未進(jìn)行優(yōu)化,比如30s,50s,我們現(xiàn)在就是希望能讓程序正常運(yùn)行,完成我們的算法要求,下一步工作再進(jìn)行優(yōu)化,但是現(xiàn)在這個(gè)中斷的問題讓我們比較頭疼,請(qǐng)專家指教。

經(jīng)過多次試驗(yàn),最后我將我們的算法注掉,換成了下面代碼,網(wǎng)絡(luò)是正常的,不會(huì)中斷。

void Test(指定時(shí)間間隔)

{

    獲取系統(tǒng)當(dāng)前時(shí)間1

    while(1)

    {

         獲取系統(tǒng)當(dāng)前時(shí)間2

         if(時(shí)間2-時(shí)間1 >= 指定時(shí)間間隔)

             return;

    }

}

我又將我們的算法換成了下面代碼,網(wǎng)絡(luò)很快就會(huì)中斷。

void Test()

{

     while(...)

    {

         for(...)

        {

             純算法,加減剩除,專門用來耗時(shí)。

         }

    }

}

從上面的現(xiàn)象看,我們猜測(cè),是由于算法占用CPU時(shí)間過長(zhǎng),系統(tǒng)無法獲得CPU,沒有時(shí)間處理網(wǎng)絡(luò)相關(guān)信息,造成的,各位大俠有什么好辦法,請(qǐng)多多回復(fù)。

答:因?yàn)槟阍贒SP上沒有跑RTOS操作系統(tǒng),而你的代碼是一段無限的死循環(huán),因此CPU的Cycle都消耗在你的算法代碼里了(即PC指針一直在里面,沒有出來)。

在跑RTOS操作系統(tǒng)的情況下,任務(wù)按照優(yōu)先級(jí)來進(jìn)行運(yùn)行,如果網(wǎng)絡(luò)屬于更高優(yōu)先級(jí)任務(wù),那么即使算法在持續(xù)運(yùn)行,調(diào)度器也會(huì)切換到網(wǎng)絡(luò)任務(wù),并優(yōu)先運(yùn)行,網(wǎng)絡(luò)也就不會(huì)斷了。

我們Enea是TI的白金合作伙伴,在6678上提供整套的商用平臺(tái)軟件解決方案,可以解決您的問題,有后續(xù)問題歡迎聯(lián)系我 william.dong@enea.com

我們可以在C6678上提供全套的平臺(tái)軟件,包括操作系統(tǒng)、BSP驅(qū)動(dòng)、中間件和開發(fā)工具。

OSEck RTOS 軟件平臺(tái)包括:
       OSEck RTOS內(nèi)核:
       1 穩(wěn)定可靠,支持所有DSP,有20+年歷史。
       2 專門針對(duì)C66x優(yōu)化。沒有內(nèi)存碎片的內(nèi)存管理。
       3 內(nèi)存自動(dòng)裁剪,統(tǒng)一的出錯(cuò)處理機(jī)制。
       4 BSP(驅(qū)動(dòng))源代碼:優(yōu)化高效的驅(qū)動(dòng),如RapidIO,Ethernet等。
       5LINX IPC: 支持分布式系統(tǒng)的IPC.
       6使多核、多DSP、多板卡的編程好像單核編程一樣。
       7支持任何物理介質(zhì),如C66x多核之間(EDMA),多DSP之間(RapidIO),多板卡之間(RapidIO, Ethernet)。
       8TCP/IP協(xié)議
       9Package Flow 軟件加速包
       10Optima開發(fā)優(yōu)化工具:CPU,內(nèi)存等性能優(yōu)化工具。

Enea在DSP RTOS領(lǐng)域有近20年的開發(fā)、現(xiàn)場(chǎng)使用經(jīng)驗(yàn),針對(duì)復(fù)雜的C6678,從2010年起專門投入30多人的專家團(tuán)隊(duì)來支持優(yōu)化6678軟件平臺(tái),包括:
 內(nèi)核、重寫高性能驅(qū)動(dòng)、分布式支持、網(wǎng)絡(luò)加速、優(yōu)化工具等,現(xiàn)在以及有30多個(gè)客戶使用Enea針對(duì)6678的軟件平臺(tái):
1. 成熟、穩(wěn)定、可靠、現(xiàn)場(chǎng)驗(yàn)證的,專門針對(duì)6678 DSP特別優(yōu)化的OSEck RTOS。
2. 成熟穩(wěn)定的針對(duì)C6678的驅(qū)動(dòng)程序,支持包括SRIO、以太網(wǎng)、PA、Multicore Navigator、MPAX、中斷管理等。
3. 跨核、跨DSP、跨板卡系統(tǒng)的透明傳輸模塊LINX。

Best Regards

William

William.dong@enea.com

九.tms320c6678電源問題

1問:在評(píng)估板上,固定1V的電流值是5A,c6678_power_consumption_summary_rev3-2表格中固定1V所需電流值僅需1A左右,修改后也達(dá)不到2A,這是為什么?

答:修改表格使能所有模塊后,在1GHz, 85度下,CVDD對(duì)應(yīng)的電流大概在6A,CVDD1的電流在2A左右。你的5A可能測(cè)的是CVDD對(duì)應(yīng)的值。

十.TMS320C6678降低功耗

1問:在C6678中有PDCCMD寄存器可以選擇是否關(guān)閉C66x CorePac來降低功耗,寄存器的地址是0x18000000,但是怎么選擇具體關(guān)閉哪個(gè)CorePac呢?難道在PDCCMD寄存器中設(shè)置關(guān)閉內(nèi)核就都關(guān)閉了嗎?可是在提供的功耗估計(jì)表里,8個(gè)內(nèi)核可以選擇具體使能哪個(gè)呀。那其他核的PDCCMD寄存器是什么地址呢?

答:PDCCMD是每個(gè)core獨(dú)立的寄存器,每個(gè)core的寄存器的地址是一樣的,只能由本核訪問。具體的corepac power down flow在corepac user guide有說明。在power spreadsheet中可以分corepac設(shè)置其enable/diable status,設(shè)置為disable status即將該core power down。


如需購(gòu)買,請(qǐng)直接點(diǎn)擊,官方大促75折


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