TI C6000DSP上TCP/IP协议栈的实现
摘要:針對(duì)TIC6000系列DSP網(wǎng)絡(luò)開發(fā)工具NDK進(jìn)行研究,結(jié)合TMS320DM642芯片詳細(xì)描述了NDK的結(jié)構(gòu),講述了利用NDK開發(fā)DSP網(wǎng)絡(luò)應(yīng)用程序的一般過(guò)程和實(shí)際應(yīng)用中要注意的問(wèn)題,并給出了NDK網(wǎng)絡(luò)性能的測(cè)試分析,對(duì)于開發(fā)基于DSP的網(wǎng)絡(luò)程序具有一定的指導(dǎo)作用。
關(guān)鍵詞:DSP;TMS320DM642;NDK;TCP/IP
中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2007)03-10688-02
1 引言
隨著互聯(lián)網(wǎng)不斷發(fā)展,在嵌入式設(shè)備上進(jìn)行網(wǎng)絡(luò)通信成為熱門研究對(duì)象。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é)議棧程序庫(kù)。其中主要包含的庫(kù)有:支持TCP/IP網(wǎng)絡(luò)工具的庫(kù),支持TCP/IP協(xié)議棧與DSP/BIOS平臺(tái)的庫(kù),網(wǎng)絡(luò)控制以及線程調(diào)度的庫(kù)。(2)示范程序。其中主要包括DHCP/Telnet客戶端,HTTP數(shù)據(jù)服務(wù)器示范。(3)支持文檔。包括用戶手冊(cè)、程序員手冊(cè)和平臺(tái)適應(yīng)手冊(cè)。NDK采用緊湊的設(shè)計(jì)方法,實(shí)現(xiàn)了用較少的資源耗費(fèi)來(lái)支持TCP/IP。從實(shí)用效果來(lái)看,NDK僅用200-250K程序空間和95K數(shù)據(jù)空間即可支持常規(guī)的TCP/IP服務(wù)。
使用NDK相對(duì)于操作系統(tǒng)和底層硬件是透明的,這主要是由OS.LIB提供與操作系統(tǒng)DSP/BIOS的接口和HAL.LIB提供對(duì)硬件的支持來(lái)完成的。在NDK的TCP/IP協(xié)議棧中STACK.LIB包括了頂層套接字到底層鏈路層的所有功能,NETCTRL.LIB 在整個(gè)協(xié)議棧中起關(guān)鍵作用,協(xié)調(diào)操作系統(tǒng)和底層硬件驅(qū)動(dòng),管理所有網(wǎng)絡(luò)事件,NETTOOL.LIB提供配置網(wǎng)絡(luò)的各種服務(wù)。
3 NDK在DSP/BIOS下的使用
DSP/BIOS是TI開發(fā)的實(shí)時(shí)微型操作系統(tǒng),支持實(shí)時(shí)分析、線程管理、調(diào)度軟件中斷、周期函數(shù)以及外部硬件中斷與各種外設(shè)的管理。使用DSP/BIOS所有與硬件有關(guān)的操作都必須借助操作系統(tǒng)本身提供的函數(shù)完成,應(yīng)避免直接控制硬件資源?;贒SP/BIOS的程序與傳統(tǒng)開發(fā)過(guò)程是不同的,用戶編寫的程序由DSP/BIOS調(diào)度,不再按標(biāo)寫的次序順序執(zhí)行。同樣開發(fā)基于DSP/BIOS的網(wǎng)絡(luò)應(yīng)用程序也必須要遵循一些原則。
在DSP/BIOS下使用NDK必須注意以下幾點(diǎn): (1)必須在CDB文件中為HAL創(chuàng)建一個(gè)周期為100ms的PRD函數(shù),用來(lái)驅(qū)動(dòng)llTimerTick()系統(tǒng)函數(shù);(2)OS需要鉤子函數(shù)為TCP/IP堆棧加載和保存私人變量指針,所以必須在CDB文件中創(chuàng)建兩個(gè)鉤子函數(shù)NDK_hookInit()和NDK_hookCreate();(3)必須把工程項(xiàng)目的Include Searching Path指向NDK安裝目錄下的inc文件夾;(4)為了保證使用NDK的工程項(xiàng)目能正確編譯,在CCS的Link Order要按一定的順序添加庫(kù)文件,推薦的順序是:NETCTRL.LIB、HAL_xxxLIB、STACK.LIB、OS.LIB;(5)在使用NDK的過(guò)程當(dāng)中,OS和HAL會(huì)創(chuàng)建三個(gè)內(nèi)存段,分別是PACKETMEM、MMBUFFER、OBJMEM,必須在CMD文件中為這三個(gè)段在內(nèi)存中分配存儲(chǔ)空間;(6)至少要使用32K的cache,否則應(yīng)用程序會(huì)產(chǎn)生不可預(yù)料的錯(cuò)誤。
4 TCP/IP堆棧的初始化和配置
在任何SOCKET應(yīng)用程序建立之前,TCP/IP堆棧必須被正確的配置然后初始化。通??梢詣?dòng)態(tài)創(chuàng)建或者在DSP/BIOS中靜態(tài)創(chuàng)建一個(gè)堆棧初始化任務(wù),不管應(yīng)用程序當(dāng)中建立了多少SOCKET,在整個(gè)系統(tǒng)中只能有一個(gè)堆棧初始化任務(wù),并且該任務(wù)會(huì)成為整個(gè)網(wǎng)絡(luò)任務(wù)的唯一調(diào)度者,因此該任務(wù)在應(yīng)用程序結(jié)束前不會(huì)返回。
堆棧初始化過(guò)程:(1)使用NC_SystemOpen()。該函數(shù)為所有網(wǎng)絡(luò)應(yīng)用程序建立堆棧和內(nèi)存環(huán)境;(2)使用CfgNew()。該函數(shù)會(huì)創(chuàng)建一個(gè)配置句柄,利用該句柄使用CfgAddEntry()函數(shù)可以添加DHCP、DNS、HTTP等服務(wù)和配置SOCKET緩沖區(qū)大小與ARP超時(shí)參數(shù);(3)使用NC_NetStart()。該函數(shù)根據(jù)前面的配置參數(shù)啟動(dòng)網(wǎng)絡(luò),并創(chuàng)建三個(gè)回調(diào)函數(shù),分別是網(wǎng)絡(luò)啟動(dòng)時(shí)只運(yùn)行一次的函數(shù)、網(wǎng)絡(luò)被關(guān)閉時(shí)只運(yùn)行一次的函數(shù)、當(dāng)IP地址改變時(shí)運(yùn)行的函數(shù)。通常會(huì)在啟動(dòng)函數(shù)里面創(chuàng)建自己的應(yīng)用程序線程,在關(guān)閉函數(shù)里面刪除創(chuàng)建的應(yīng)用程序線程。
5 網(wǎng)絡(luò)應(yīng)用程序的開發(fā)
如果編程人員熟悉Windows平臺(tái)的SOCKET的使用,那么在DSP平臺(tái)上一樣可以很容易的開發(fā)網(wǎng)絡(luò)應(yīng)用程序,甚至可以完全不需要了解硬件結(jié)構(gòu),因?yàn)镹DK的API和Windows SOCKET API函數(shù)名和功能都是十分相近的。下面的程序采用DHCP協(xié)議動(dòng)態(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é)議動(dòng)態(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);
//啟動(dòng)網(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ā)送過(guò)快,任務(wù)暫停8ms
TaskSleep(8);
……
根據(jù)實(shí)驗(yàn)每次向PC機(jī)傳送碼流最好不要超過(guò)1500字節(jié),這是由網(wǎng)絡(luò)最大傳輸單元決定的,對(duì)于1500字節(jié)以上的碼流可以采取分割的方法分批傳送,并且在每次傳送之后調(diào)用任務(wù)暫停函數(shù)TaskSleep()可以有效防止丟幀。在DSP發(fā)送和接收數(shù)據(jù)的時(shí)候不要用printf()語(yǔ)句,該語(yǔ)句耗費(fèi)太多的CPU時(shí)鐘周期,容易引起系統(tǒng)死機(jī)的發(fā)生,可以用LOG_printf()代替。
6 NDK性能測(cè)試
測(cè)試NDK性能既有客觀性又有主觀性??陀^性是因?yàn)槭褂脴?biāo)準(zhǔn)的工具,并且結(jié)果可重現(xiàn)。主觀性適應(yīng)為實(shí)際測(cè)試要受到很多環(huán)境因素的影響,所以只能是性能的估計(jì)性測(cè)試。
影響NDK性能的主要因素有:
socket API:NDK既支持基于緩沖區(qū)的典型socket,也支持非拷貝的數(shù)據(jù)包socket,甚至非拷貝的直接接收的TCP數(shù)據(jù)流。性能隨著所采用的策略而變化。
socket緩沖區(qū):socket 緩沖區(qū)影響TCP發(fā)送和接收的窗口大小,并且決定每次發(fā)送數(shù)據(jù)流大小,這對(duì)網(wǎng)絡(luò)性能有很大的影響。
CPU速度:在cache大小一定的情況下,網(wǎng)絡(luò)性能隨著CPU速度增加而線性提高。
CPU cache:cache的大小對(duì)網(wǎng)絡(luò)性能有巨大的影響。
網(wǎng)絡(luò)硬件設(shè)備:以太網(wǎng)硬件設(shè)計(jì)的好換直接影響DSP和網(wǎng)絡(luò)接口的速度。
外部存儲(chǔ)器(EMIF)接口:對(duì)于和DSP外部存儲(chǔ)器接口相連的以太網(wǎng)設(shè)備,EMIF的速度對(duì)外部解碼邏輯有額外的影響。
下面的測(cè)試由TI提供,測(cè)試既兼顧最佳的性能又考慮到應(yīng)用的實(shí)際情況,比如socket緩沖區(qū)大小為8K,而不是32K或64K,因?yàn)檫@在嵌入式設(shè)備中是不切實(shí)際的。測(cè)試的過(guò)程是DSP執(zhí)行低優(yōu)先級(jí)的網(wǎng)絡(luò)任務(wù),PC機(jī)執(zhí)行客戶基準(zhǔn)測(cè)試程序,然后與DSP不執(zhí)行網(wǎng)絡(luò)任務(wù)時(shí)CPU的負(fù)載情況做對(duì)比。
圖2 DM642與Macronix和SMSC的網(wǎng)絡(luò)性能對(duì)比
不同的cache大小對(duì)DM642網(wǎng)絡(luò)性能有一定影響,實(shí)驗(yàn)中隨著cache的減少,多余的片上RAM并沒(méi)有被利用,socket緩沖大小是8760字節(jié)。
圖3 不同cache下DM642接收和發(fā)送數(shù)據(jù)網(wǎng)絡(luò)性能對(duì)比
7 結(jié)束語(yǔ)
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)容請(qǐng)以PDF格式閱讀原文。
總結(jié)
以上是生活随笔為你收集整理的TI C6000DSP上TCP/IP协议栈的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TI的TCP/IP协议栈---NDK
- 下一篇: DSP程序中段的定义和作用