歡迎您光臨本站 登入註冊首頁

概述

   網路技術在飛速的發展,網路介面的性能也在不斷提高。由於乙太網介面成本低,速度快,性能好,開發方便,越來越多的數據採集系統採用乙太網介面作為最終的數據輸出及控制埠。而……

    網路技術在飛速的發展,網路介面的性能也在不斷提高。由於乙太網介面成本低,速度快,性能好,開發方便,越來越多的數據採集系統採用乙太網介面作為最終的數據輸出及控制埠。而在相應的嵌入式系統領域,越來越多的晶元,從單片機到DSP,也都逐漸開始支持乙太網介面。TCP/IP協議是被廣泛支持的乙太網協議,在嵌入式系統中實現了TCP/IP協議,就可以方便地與計算機主機相連,將採集到的數據傳輸到主機進行保存和處理。
    針對高速信號採集和處理系統,數據從採集-信號處理-網路傳輸,整個過程中一方面要保證信號處理的速度,即採集到的信號能夠在限定的時間內得到處理,另一方面則要保證整條數據流通路不能有瓶頸。一般說來,網路介面由單獨的晶元負責,才能保證其傳輸的實時性和高效率,而信號採集和處理則是另外的晶元負責。無論是AD與DSP之間還是DSP相互之間,都存在高速通信的問題。經過論證和實踐,我們認為使用FIFO是很好的選擇。
    本文以TI(Texas Instruments)公司TMS320C6000系列晶元為基礎,實現了一套高速信號處理—— 網路傳輸系統,如圖1所示。高速A/D採集的數據通過FIFO(IDT72V273)傳入TMS320C6713 DSP之中,該DSP晶元同步實時採集多路A/D數據並進行信號處理,由於感測器數目較多,我們採用了兩片C6713同步處理的方式。兩片C6713的處理結果通過各自後端的FIFO(IDT72V273)傳入TMS320DM642 DSP。該DSP專用於數據的打包和網路發送。網路物理層由網路收發晶元LXT971ALC實現,最後數據通過網路進入計算機進行顯示、保存和進一步處理。該系統實現了完整的感測器信號的高速信號處理、傳輸通路。技術上的難點除了信號處理演算法之外,最主要的就是基於FIFO和網路的高速數據傳輸。本文根據在開發實踐中積累的一些經驗,對FIFO一網路數據傳輸的一些問題進行了探討。
 
圖1 信號處理-網路傳輸系統

1 硬體設計
    在TI的C6000系列DSP中,C67x系列屬於浮點DSP晶元,其中以C6713的運算能力最強,在300 MHz主頻下,可達到2400 MIPs(百萬指令每秒)和1800 Mfloot/s(百萬浮點運算每秒)的運算速度,適合於大數據量和較複雜的浮點信號處理。而DM642作為定點DSP晶元,其主要優勢不僅在於其速度快、性能好,還在於它自身攜帶了網路介面,硬體設計較為方便。
    所謂FIFO,即“First In First Out”,是一種“先進先出”的存儲器。FIFO存儲器就像數據管道一樣,數據從管道的一頭流入、從另一頭流出,先進入的數據先流出。以本文所採用的IDT72V273 FIFO晶元為例,其容量為16k×18或32k×9,主頻達到133 MHz,僅6 ns讀寫周期,具有讀指針和寫指針,可以在FIFO出口讀數據的同時在入口寫入數據,能夠滿足實時系統的要求。本系統中在兩處都用到了FIFO:A/D與C6713的數據介面及C6713和DM642的數據通道,FIFO基本介面如圖2所示。
 
圖2 FIFO 介面電路
    DM642自身帶網路控制器EMAC,省去了購買或開發網路子卡的麻煩,在硬體上只需連接一個網路收發晶元Intel LXT971ALC 即可,如圖3所示。
 
圖3 DM642網路介面電路

2 軟體設計
    軟體開發在TI的集成開發環境CCS(Code Composer Studio)中進行,TI給C60000系列DSP提供了穩定高效的DSP/BIOS操作系統,為了方便網路開發,還提供了網路開發套件NDK(Network Developer's Kit)。所有的這些,保證了用戶可以使用標準的C語言(程序中對速度要求較高的部分也可以用彙編語言)完成整個應用程序的開發,對硬體的操作只需調用相應API函數即可。
2.1 軟體流程
    無論是C6713還是DM642,都需要對FIFO進行操作。C6713需要讀取FIFO傳過來的A/D信號,進行處理后將結果寫入後端的FIFO。而DM642則讀取C6713發來的FIFO數據,進行網路打包發送。FIFO數據的讀取部分,對於兩者都是一樣的,C6713給後端FIFO存數據,也只需對相應地址寫入即可,所以C6713的程序,演算法以外的部分跟DM642有相似之處,且相對簡單。本文著重討論DM642的程序流程。
    DM642與C6713讀取FIFO數據時,都是以EDMA的方式進行的。EDMA控制器可以獨立於CPU工作,從而可方便地實現片內存儲器、片內外設以及外部存儲空間之間的數據轉移。由外部中斷自動觸發EDMA傳輸,可以大大提高傳輸速率和CPU的工作效率。數據源源不斷推入FIFO,FIFO數據存滿則自動將滿標誌置位,再通過INT8觸發DM642的自動EDMA數據傳輸,這樣可以在不佔用CPU資源的情況下將FIFO數據傳人DM642的內存(或外存)中指定的位置。數據積累到一定程度后,通過SEM標誌通知網路發送程序,將該數據取走並進行網路發送。這種數據傳輸方法經過試驗是可行的。因此整個程序按照功能大體分為3部分:初始化程序對硬體中斷和網路進行了初始化和設置;EDMA中斷程序中通知網路發送程序,該數據已經準備好;在網路發送程序中對數據進行打包發送,圖4是各個部分的流程圖。
 
圖4 網路程序流程圖
    需要說明的是,在我們的設計之中,兩個C6713 DSP是在DM642的指令下同時工作的,數據的發送也同步進行操作。DM642前端的兩片FIFO並聯構成了64位的數據寬度,每次EDMA讀取的是64位數據,讀人數據后再進行拆分、提取和打包發送。

2.2 開發中的一些問題
    C6000系列屬於高端DSP晶元,開發起來有一定的難度。在開發過程中難免遇到很多的困難和問題,下面就其中一些問題及解決辦法加以討論。
2.2.1 程序初始化問題
    C6000 DSP程序的開發最好在TI提供的例子程序基礎上進行相應的修改,這樣不僅方便快捷,也可以避免很多意想不到的問題。我們的DM642用戶程序就以NDK的“client”例子為基礎修改而得。其中程序的初始化主要在DM642的初始化程序dm642init.c中和主程序client.c的開頭部分。在dm642init.c中,對緩存、網路物理地址等進行了初始化;而在client.c中,則是對中斷、EDMA等進行初始化。
    在dm642init.c中主要的初始化為以下幾行語句:
CSL_init(); //初始化晶元函數庫
CACHE_clean(CACHE_L2ALL,0,0);//清緩存
CACHE setL2Mode(CACHE_128KCACHE);//將L2緩存設為128K
CACHE_enableCaching(CACHE_EMIFA_CE00);//允許外存CEOO作為緩存
CACHE_enableCaching(CACHE_EMIFA_CE01);//允許外存CE01作為緩存
//Init the EVM
//EVMDM642_init();
//EVMDM642_LED_init();
    L2緩存即為DM642的內部RAM,大小共256k,既可以設為緩存也可以設為內存。網路收發數據需要至少開闢64k的緩存,緩存越大性能越好。由於程序還要使用一部分內存,因此以設128k緩存為宜。
    CACHE_enableCaching (CACHE_EMIFA_CE00)和CACHE_enableCaching(CACHE_EMIFA_CE01)的作用是開闢外存空間作為緩存,CE00對應外部RAM 的0x80000000~0x80FFFFFF空間,而CE01對應外部RAM 的0x81000000~0x81FFFFFF空間。在我們的開發板上的實踐證明,這兩個函數是必須的,如果不用,網路的性能要受到很大影響。實測數據如圖5所示。
 
圖5 CE00和CE01是否緩存對網路速度的影響
    最後兩個函數EVMDM642_LED_init()和EVMDM642_init()只適用於DM642EVM板,與板上的FPGA有關,而該FPGA的內部邏輯沒有公開,所以在我們的開發板上這兩個函數不能夠正確運行。實踐證明,在開發板上去掉這兩個函數對程序性能影響不大。
    在主程序client.c中,主要對中斷、EDMA的通道等進行初始化。
EMIFA_config(&emifaCfg0); //設置EMW
IRQ_reset(IRQ_EVT_EDMAINT);//複位IRQ
IER=0x303; //設置中斷寄存器
EDMA_config(hEdmaCha5,&edmaCfg0);//設置EDMA
IRQ_enable(IRQ_EVT_EDMAINT);//允許IRQ
HWI_enable(); //開硬體中斷
EDMA_intEnable(2); //允許EDMA中斷
EDMA_enableChannel(hEdmaCha5);//允許EDMA通道5
    值得特別注意的是,DM642的網路發送之後,需要重新將緩存初始化,否則下一次接收時就會有個別數據出錯。具體原因有待研究。即將以下語句寫入到網路發送程序之後:
CACHE_clean(CACHE_L2ALL,0,0);
CACHE_setL2Mode(CACHE_128KCACHE);
CACHE_enableCaching(CACHE_EMIFA_CE00);
CACHE_enableCaching(CACHE_EMIFA_CE01);
2.2.2 硬體中斷對網路程序的影響
    乙太網協議屬於非實時網路協議,其內部實現機制也比較複雜。TI的NDK開發包中提供了符合berkeley socket標準的網路函數,如socket(),listen(),accept(),send(),recv()等等,但其內部源代碼是不公開的。在實踐中,我們遇到的一個較為突出的問題是,在數據量較大的情況下,FIFO的中斷次數如果太頻繁,會影響到DM642的網路發送。具體表現為程序運行並非十分平穩,中斷較為頻繁的時候,網路發送函數send()有時就會報錯,返回(-1),導致該幀數據發送失敗。
    如果數據量較大且對數據信號處理實時性要求較高,那麼該問題就會比較棘手,目前我們還未能夠完全解決。但根據目前我們的需要,可以將網路發送的間隔時間延長。每次FIFO數據存滿后,通過EDMA傳輸到外存中,但卻不是每次存滿都進行網路發送。而是將數據累積起來,多次的傳輸數據一起發送。這樣的網路發送出錯率會小得多。在軟體編程上,也可以考慮雙buffer甚至3個buffer的方式。一個buffer滿后,進行發送,而此時的FIFO數據導入另外的buffer中,如此循環。另外軟體上還需考慮容錯機制,一次數據發送失敗后,需要將該數據包重新發送,從而保證不丟失數據。事實上,乙太網的速度是很快的,如圖5所示,目前的DM642的網路介面我們實測的速度可以達到10-11 Mbyte/S(百兆網即100 Mbit/s,換算成位元組大約11~12Mbyte/s)。需要指出的是,同樣的數據流量條件下,大量的數據集合到一起一次發送,相比與分多次發送少量數據,要穩定得多。目前我們可以做到3 S發送一次,每次發送約5M 數據的較為穩定地程序運行,相信經過改進,還有較大的提高空間。
2.2.3 其它常見問題
    參考文獻[1]P44上提供了常見問題的列表,比如調用fdOpenSession()和fdCloseSession()的問題,PRD函數中設置100 ms周期的問題,內存溢出問題(設置“SO_LINGER”選項)等等,以及其他文獻[5]上提到的“dispatcher選項”問題,上述問題筆者在實踐中均遇到了,因此仔細閱讀文獻資料可以少走彎路。

3 結論
    C6000系列DSP速度快,性能好,穩定性高,可以滿足很多大規模信號處理系統的要求,但開發的難度也相對較大。我們完成的這一套信號處理-網路傳輸系統,FIFO和網路的數據傳輸是開發過程中遇到困難較多的一部分,其中一些問題仍需要深入探討。目前,信號出口採用乙太網,已經成為很多嵌入式系統的選擇,形成一種趨勢。隨著網路技術和計算機集群技術的不斷發展,從嵌入式網路介面輸出的數據,可以通過網路接入到計算機集群中,進行更大規模的信號處理,這將是本文後續將要進行的工作。

參考文獻:
[1] Texas Instruments TMS320C6000 TCP/IP Network Developer's Kit User's Guide.Texas Instruments,12-jun-2003.
[2] TMS320DM642 Video/Imaging Fixed-Point Digital Signal Processor Data Manual.Texas Instruments,August-2004.
[3] IDT 3.3 VOLT HIGH-DENSITY SUPERSYNC II NARROW BUS FIFO. IDT (Integrated Device Technology,Inc.Septemher-2003.
[4] Texas Instruments TMS320C6000 TCP/IP Network Developers Kit Programmers Reference Guide.Texas Instruments,12-Jun-2003.
[5] 李方慧等.TMS320C6000系列DSPs原理與應用(第二版) [M].電子工業出版社,2003


[admin via 研發互助社區 ] 基於TMS320C6000 DSP的FIFO-網路數據傳輸已經有3163次圍觀

http://cocdig.com/docs/show-post-42142.html