TI C6000DSP上TCP/IP协议栈的实现
摘要:針對TIC6000系列DSP網(wǎng)絡(luò)開發(fā)工具NDK進(jìn)行研究,結(jié)合TMS320DM642芯片詳細(xì)描述了NDK的結(jié)構(gòu),講述了利用NDK開發(fā)DSP網(wǎng)絡(luò)應(yīng)用程序的一般過程和實際應(yīng)用中要注意的問題,并給出了NDK網(wǎng)絡(luò)性能的測試分析,對于開發(fā)基于DSP的網(wǎng)絡(luò)程序具有一定的指導(dǎo)作用。
關(guān)鍵詞:DSP;TMS320DM642;NDK;TCP/IP
中圖分類號:TP393文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2007)03-10688-02
1 引言
隨著互聯(lián)網(wǎng)不斷發(fā)展,在嵌入式設(shè)備上進(jìn)行網(wǎng)絡(luò)通信成為熱門研究對象。TI的C6000系列芯片是面向多媒體數(shù)據(jù)處理的高端芯片,在視頻圖像處理領(lǐng)域應(yīng)用廣泛,尤其是TMS320DM642處理器,主頻高達(dá)600MHz,片上集成以太網(wǎng)接口,不僅在硬件上將嵌入式產(chǎn)品的網(wǎng)絡(luò)應(yīng)用成本減少50%,而且結(jié)合其推出的NDK網(wǎng)絡(luò)開發(fā)工具在軟件上可以快速地開發(fā)出網(wǎng)絡(luò)應(yīng)用程序,縮短產(chǎn)品開發(fā)周期,而且其性能不比一般的網(wǎng)絡(luò)芯片遜色。
2 NDK的結(jié)構(gòu)
TI公司結(jié)合C6000芯片推出了TCP/IP NDK(Network Developer's Kit)開發(fā)套件,其主要組件包括:(1)支持TCP/IP協(xié)議棧程序庫。其中主要包含的庫有:支持TCP/IP網(wǎng)絡(luò)工具的庫,支持TCP/IP協(xié)議棧與DSP/BIOS平臺的庫,網(wǎng)絡(luò)控制以及線程調(diào)度的庫。(2)示范程序。其中主要包括DHCP/Telnet客戶端,HTTP數(shù)據(jù)服務(wù)器示范。(3)支持文檔。包括用戶手冊、程序員手冊和平臺適應(yīng)手冊。NDK采用緊湊的設(shè)計方法,實現(xiàn)了用較少的資源耗費來支持TCP/IP。從實用效果來看,NDK僅用200-250K程序空間和95K數(shù)據(jù)空間即可支持常規(guī)的TCP/IP服務(wù)。
使用NDK相對于操作系統(tǒng)和底層硬件是透明的,這主要是由OS.LIB提供與操作系統(tǒng)DSP/BIOS的接口和HAL.LIB提供對硬件的支持來完成的。在NDK的TCP/IP協(xié)議棧中STACK.LIB包括了頂層套接字到底層鏈路層的所有功能,NETCTRL.LIB 在整個協(xié)議棧中起關(guān)鍵作用,協(xié)調(diào)操作系統(tǒng)和底層硬件驅(qū)動,管理所有網(wǎng)絡(luò)事件,NETTOOL.LIB提供配置網(wǎng)絡(luò)的各種服務(wù)。
3 NDK在DSP/BIOS下的使用
DSP/BIOS是TI開發(fā)的實時微型操作系統(tǒng),支持實時分析、線程管理、調(diào)度軟件中斷、周期函數(shù)以及外部硬件中斷與各種外設(shè)的管理。使用DSP/BIOS所有與硬件有關(guān)的操作都必須借助操作系統(tǒng)本身提供的函數(shù)完成,應(yīng)避免直接控制硬件資源。基于DSP/BIOS的程序與傳統(tǒng)開發(fā)過程是不同的,用戶編寫的程序由DSP/BIOS調(diào)度,不再按標(biāo)寫的次序順序執(zhí)行。同樣開發(fā)基于DSP/BIOS的網(wǎng)絡(luò)應(yīng)用程序也必須要遵循一些原則。
在DSP/BIOS下使用NDK必須注意以下幾點: (1)必須在CDB文件中為HAL創(chuàng)建一個周期為100ms的PRD函數(shù),用來驅(qū)動llTimerTick()系統(tǒng)函數(shù);(2)OS需要鉤子函數(shù)為TCP/IP堆棧加載和保存私人變量指針,所以必須在CDB文件中創(chuàng)建兩個鉤子函數(shù)NDK_hookInit()和NDK_hookCreate();(3)必須把工程項目的Include Searching Path指向NDK安裝目錄下的inc文件夾;(4)為了保證使用NDK的工程項目能正確編譯,在CCS的Link Order要按一定的順序添加庫文件,推薦的順序是:NETCTRL.LIB、HAL_xxxLIB、STACK.LIB、OS.LIB;(5)在使用NDK的過程當(dāng)中,OS和HAL會創(chuàng)建三個內(nèi)存段,分別是PACKETMEM、MMBUFFER、OBJMEM,必須在CMD文件中為這三個段在內(nèi)存中分配存儲空間;(6)至少要使用32K的cache,否則應(yīng)用程序會產(chǎn)生不可預(yù)料的錯誤。
4 TCP/IP堆棧的初始化和配置
在任何SOCKET應(yīng)用程序建立之前,TCP/IP堆棧必須被正確的配置然后初始化。通常可以動態(tài)創(chuàng)建或者在DSP/BIOS中靜態(tài)創(chuàng)建一個堆棧初始化任務(wù),不管應(yīng)用程序當(dāng)中建立了多少SOCKET,在整個系統(tǒng)中只能有一個堆棧初始化任務(wù),并且該任務(wù)會成為整個網(wǎng)絡(luò)任務(wù)的唯一調(diào)度者,因此該任務(wù)在應(yīng)用程序結(jié)束前不會返回。
堆棧初始化過程:(1)使用NC_SystemOpen()。該函數(shù)為所有網(wǎng)絡(luò)應(yīng)用程序建立堆棧和內(nèi)存環(huán)境;(2)使用CfgNew()。該函數(shù)會創(chuàng)建一個配置句柄,利用該句柄使用CfgAddEntry()函數(shù)可以添加DHCP、DNS、HTTP等服務(wù)和配置SOCKET緩沖區(qū)大小與ARP超時參數(shù);(3)使用NC_NetStart()。該函數(shù)根據(jù)前面的配置參數(shù)啟動網(wǎng)絡(luò),并創(chuàng)建三個回調(diào)函數(shù),分別是網(wǎng)絡(luò)啟動時只運行一次的函數(shù)、網(wǎng)絡(luò)被關(guān)閉時只運行一次的函數(shù)、當(dāng)IP地址改變時運行的函數(shù)。通常會在啟動函數(shù)里面創(chuàng)建自己的應(yīng)用程序線程,在關(guān)閉函數(shù)里面刪除創(chuàng)建的應(yīng)用程序線程。
5 網(wǎng)絡(luò)應(yīng)用程序的開發(fā)
如果編程人員熟悉Windows平臺的SOCKET的使用,那么在DSP平臺上一樣可以很容易的開發(fā)網(wǎng)絡(luò)應(yīng)用程序,甚至可以完全不需要了解硬件結(jié)構(gòu),因為NDK的API和Windows SOCKET API函數(shù)名和功能都是十分相近的。下面的程序采用DHCP協(xié)議動態(tài)獲得IP,UDP協(xié)議傳輸數(shù)據(jù),如下:
//網(wǎng)絡(luò)初始化
NC_SystemOpen();
hCfg = CfgNew();
CfgAddEntry( hCfg,CFGTAG_SYSINFO,CFGITEM_DHCP_HOS
TNAME,0,strlen(HostName),(UINT8 *)HostName,0);
……
//配置DHCP協(xié)議動態(tài)獲得IP
CI_SERVICE_DHCPC dhcpc;
bzero(&dhcpc, sizeof(dhcpc));
dhcpc.cisargs.Mode = CIS_FLG_IFIDXVALID;
dhcpc.cisargs.IfIdx = 1;
dhcpc.cisargs.pCbSrv = &ServiceReport;
CfgAddEntry(hCfg,CFGTAG_SERVICE,CFGITEM_SERVICE_D
HCPCLIENT,0,sizeof(dhcpc),(UINT8 *)&dhcpc,0);
……
//配置SOCKET緩沖區(qū)大小
rc = 8704;
CfgAddEntry(hCfg,CFGTAG_IP,CFGITEM_IP_SOCKBUFMAX,
CFG_ADDMODE_UNIQUE,sizeof(uint),(UINT8 *)&rc,0);
//啟動網(wǎng)絡(luò)服務(wù)
do
{rc = NC_NetStart(hCfg,NetworkOpen,NetworkClose,NetworkIPA
ddr);
} while(rc > 0);
……
//配置應(yīng)用層協(xié)議,本程序采用UDP
SOCKET s;
struct sockaddr_in sin1;
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(bind(s,(PSA) &sin1, sizeof(sin1)) < 0)
本文原文
{ConPrintf("failed bind (%d)/n",fdError());
goto leave;}
……
//向PC機(jī)傳送碼流
sendto(s,pBuf,test,0,&sin1,sizeof(sin1))
//防止發(fā)送過快,任務(wù)暫停8ms
TaskSleep(8);
……
根據(jù)實驗每次向PC機(jī)傳送碼流最好不要超過1500字節(jié),這是由網(wǎng)絡(luò)最大傳輸單元決定的,對于1500字節(jié)以上的碼流可以采取分割的方法分批傳送,并且在每次傳送之后調(diào)用任務(wù)暫停函數(shù)TaskSleep()可以有效防止丟幀。在DSP發(fā)送和接收數(shù)據(jù)的時候不要用printf()語句,該語句耗費太多的CPU時鐘周期,容易引起系統(tǒng)死機(jī)的發(fā)生,可以用LOG_printf()代替。
6 NDK性能測試
測試NDK性能既有客觀性又有主觀性。客觀性是因為使用標(biāo)準(zhǔn)的工具,并且結(jié)果可重現(xiàn)。主觀性適應(yīng)為實際測試要受到很多環(huán)境因素的影響,所以只能是性能的估計性測試。
影響NDK性能的主要因素有:
socket API:NDK既支持基于緩沖區(qū)的典型socket,也支持非拷貝的數(shù)據(jù)包socket,甚至非拷貝的直接接收的TCP數(shù)據(jù)流。性能隨著所采用的策略而變化。
socket緩沖區(qū):socket 緩沖區(qū)影響TCP發(fā)送和接收的窗口大小,并且決定每次發(fā)送數(shù)據(jù)流大小,這對網(wǎng)絡(luò)性能有很大的影響。
CPU速度:在cache大小一定的情況下,網(wǎng)絡(luò)性能隨著CPU速度增加而線性提高。
CPU cache:cache的大小對網(wǎng)絡(luò)性能有巨大的影響。
網(wǎng)絡(luò)硬件設(shè)備:以太網(wǎng)硬件設(shè)計的好換直接影響DSP和網(wǎng)絡(luò)接口的速度。
外部存儲器(EMIF)接口:對于和DSP外部存儲器接口相連的以太網(wǎng)設(shè)備,EMIF的速度對外部解碼邏輯有額外的影響。
下面的測試由TI提供,測試既兼顧最佳的性能又考慮到應(yīng)用的實際情況,比如socket緩沖區(qū)大小為8K,而不是32K或64K,因為這在嵌入式設(shè)備中是不切實際的。測試的過程是DSP執(zhí)行低優(yōu)先級的網(wǎng)絡(luò)任務(wù),PC機(jī)執(zhí)行客戶基準(zhǔn)測試程序,然后與DSP不執(zhí)行網(wǎng)絡(luò)任務(wù)時CPU的負(fù)載情況做對比。
圖2 DM642與Macronix和SMSC的網(wǎng)絡(luò)性能對比
不同的cache大小對DM642網(wǎng)絡(luò)性能有一定影響,實驗中隨著cache的減少,多余的片上RAM并沒有被利用,socket緩沖大小是8760字節(jié)。
圖3 不同cache下DM642接收和發(fā)送數(shù)據(jù)網(wǎng)絡(luò)性能對比
7 結(jié)束語
TI推出的NDK網(wǎng)絡(luò)開發(fā)工具不僅可以使技術(shù)人員快速開發(fā)基于DSP的網(wǎng)絡(luò)應(yīng)用程序,而且具有十分可靠的性能,這使得C6000系列芯片完全可以勝任大數(shù)據(jù)量的視頻網(wǎng)絡(luò)傳輸?shù)囊?#xff0c;是開發(fā)嵌入式網(wǎng)絡(luò)視頻設(shè)備的首選。
參考文獻(xiàn):
[1]Texas Instrument. TMS320C6000 Programmer's Guide (Rev. I).
[2]Texas Instrument. TMS320C6000 TCP/IP Network Developer's Kit.
[3]Texas Instrument. TMS320C6000 Platform Porting Guide.
[4]彭啟琮, 管慶. DSP集成開發(fā)環(huán)境——CCS及DSP/BIOS的原理與應(yīng)用[M]. 北京:電子工業(yè)出版社,2004.
本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。
總結(jié)
以上是生活随笔為你收集整理的TI C6000DSP上TCP/IP协议栈的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TI的TCP/IP协议栈---NDK
- 下一篇: DSP程序中段的定义和作用