新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用RTDX實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)雙向傳輸

用RTDX實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)雙向傳輸

作者:電子集團(tuán)公司第十研究所 劉景元 時(shí)間:2005-01-05 來(lái)源: 收藏

2004年8月A版

摘   要:講述實(shí)時(shí)數(shù)據(jù)傳輸()的使用,描述一個(gè)用雙向傳遞大量多媒體數(shù)據(jù)的實(shí)現(xiàn)方法。該方法可以方便的應(yīng)用于其他TI DSP的系統(tǒng)設(shè)計(jì)中。

關(guān)鍵詞:TI DSP;

引言

  TI DSP在數(shù)字電路中作為信號(hào)處理、電路控制的核心設(shè)備,廣泛應(yīng)用于各個(gè)行業(yè)。在TI DSP系統(tǒng)設(shè)計(jì)階段,實(shí)時(shí)數(shù)據(jù)交換(RTDX)提供了一種目標(biāo)板和主機(jī)之間的雙向?qū)崟r(shí)數(shù)據(jù)傳輸?shù)姆椒?。它可以?yīng)用于大量數(shù)據(jù)的雙向傳輸,例如應(yīng)用在多媒體數(shù)據(jù)進(jìn)行仿真處理中。但是由于它的實(shí)現(xiàn)難度較大以及不處于系統(tǒng)設(shè)計(jì)的核心位置,所以沒(méi)有得到廣泛使用。本文的目的是向讀者描述一種RTDX的具體實(shí)現(xiàn)。

RTDX的使用方法

  RTDX提供了目標(biāo)板與主機(jī)之間的實(shí)時(shí)數(shù)據(jù)通信。當(dāng)系統(tǒng)使用該功能時(shí),DSP上駐留一個(gè)小的RTDX片上軟件庫(kù),片上程序通過(guò)調(diào)用這個(gè)軟件庫(kù)的API實(shí)現(xiàn)JTAG與主機(jī)之間的數(shù)據(jù)傳輸。與DSP目標(biāo)板相連的主機(jī)上也存在一個(gè)相應(yīng)的RTDX主機(jī)端軟件庫(kù),客戶編寫(xiě)的主機(jī)端程序通過(guò)對(duì)象嵌入,實(shí)現(xiàn)DSP目標(biāo)板的實(shí)時(shí)數(shù)據(jù)分析,以及向目標(biāo)板提供新的數(shù)據(jù)。

  在編寫(xiě)DSP的軟件上,RTDX的使用方式和C語(yǔ)言文件的IO操作非常相似,如圖1、2所示,在實(shí)現(xiàn)數(shù)據(jù)由DSP到主機(jī)的過(guò)程中,首先聲明一個(gè)RTDX輸出通道,然后對(duì)該通道進(jìn)行操作,最后查詢狀態(tài),看數(shù)據(jù)是否被發(fā)送出去;而從主機(jī)端到DSP端的數(shù)據(jù)傳輸過(guò)程中,則聲明一個(gè)RTDX輸入通道,然后讀取該通道上的數(shù)據(jù)。

  在主機(jī)端,TI 提供的RTDX庫(kù)使用了微軟公司的COM技術(shù),數(shù)據(jù)的傳輸過(guò)程分別如圖3、圖4所示。

用RTDX實(shí)現(xiàn)多媒體數(shù)據(jù)的

雙向傳輸

  多媒體數(shù)據(jù)原始信息往往擁有極大的數(shù)據(jù)量,DSP在多媒體數(shù)據(jù)處理中的應(yīng)用主要是壓縮和解壓縮,但由于DSP自身的限制,它沒(méi)有大量的空間存儲(chǔ)多媒體數(shù)據(jù),即便這些數(shù)據(jù)是已經(jīng)被壓縮過(guò)的。在系統(tǒng)的調(diào)試階段,如何單獨(dú)測(cè)試DSP的編碼效率呢?一種可行的解決辦法就是借用DSP目標(biāo)板相連的主機(jī)空間,用RTDX把原始數(shù)據(jù)傳遞給DSP,DSP對(duì)數(shù)據(jù)處理后再通過(guò)RTDX傳回主機(jī)。

系統(tǒng)的整體構(gòu)架

  由于DSP片上存儲(chǔ)空間有限, TI對(duì)RTDX一次在主機(jī)和目標(biāo)DSP之間傳輸?shù)臄?shù)據(jù)長(zhǎng)度做了限制,此值不應(yīng)該超過(guò)253個(gè)字長(zhǎng)為16bit的數(shù)據(jù),如果一次傳輸?shù)臄?shù)據(jù)量超過(guò)253,則要對(duì)數(shù)據(jù)分片傳遞。本應(yīng)用中每次傳遞的數(shù)據(jù)遠(yuǎn)遠(yuǎn)大于253,所以主機(jī)端和目標(biāo)板都定義了分片長(zhǎng)度RTDXBLOCK,RTDXBLOCK=200。傳輸時(shí)兩邊同時(shí)進(jìn)行相反的工作,目標(biāo)板寫(xiě)數(shù)據(jù)的時(shí)候主機(jī)等著讀數(shù)據(jù),主機(jī)寫(xiě)數(shù)據(jù)的時(shí)候目標(biāo)板進(jìn)行相反的操作。每傳輸RTDXBLOCK大小的數(shù)據(jù),兩者的工作進(jìn)行交換。分段傳遞數(shù)據(jù)還帶來(lái)了很多好處,它可以方便主機(jī)與目標(biāo)板之間的同步,每次數(shù)據(jù)的發(fā)出也是對(duì)上一次收到數(shù)據(jù)的應(yīng)答;RTDX的特性是讀一個(gè)字節(jié),寫(xiě)一個(gè)字節(jié),讀寫(xiě)采用相同大小段節(jié)省了將近一半的時(shí)間;inbuffer與outbuffer可以指向相同的地址,又節(jié)省了一些內(nèi)存。

  采用相同大小的段傳輸數(shù)據(jù)還有一些細(xì)節(jié)問(wèn)題要考慮,目標(biāo)板的第一次操作是否應(yīng)該先是寫(xiě)出?以便空出地方來(lái)接收下一次被處理的數(shù)據(jù)。由于每次傳輸數(shù)據(jù)總量的不對(duì)稱性,大部分情況下是輸入的數(shù)據(jù)比輸出的數(shù)據(jù)多,目標(biāo)板先寫(xiě)出數(shù)據(jù)會(huì)多占用一次傳輸?shù)臅r(shí)間。另一個(gè)問(wèn)題就是數(shù)據(jù)總量的不對(duì)稱性,總是主機(jī)或目標(biāo)板先寫(xiě)完數(shù)據(jù),只剩下某一種操作,這部分時(shí)間沒(méi)有辦法節(jié)省。

  對(duì)于數(shù)據(jù)傳遞過(guò)程中可能傳送的一些命令字如,跳過(guò)當(dāng)前幀、程序終止等。做了這樣的考慮,由主機(jī)和目標(biāo)板主程序來(lái)填寫(xiě)和解釋這些命令字,命令字不單獨(dú)傳輸,本應(yīng)用中放在inbufferoutbuffer的第0個(gè)位置,與下一塊數(shù)據(jù)同時(shí)傳送。另外,本應(yīng)用中inbuffer與outbuffer的第1個(gè)位置存放的是數(shù)據(jù)段的實(shí)際長(zhǎng)度,常用于向主機(jī)端指示壓縮后數(shù)據(jù)的實(shí)際長(zhǎng)度,以便用于不定長(zhǎng)壓縮方式的數(shù)據(jù)輸出。inbuffer/outbuffer的實(shí)際數(shù)據(jù)的起始位置是可以根據(jù)應(yīng)用自定義的。傳輸程序不負(fù)責(zé)這些問(wèn)題,只管從buffer的第一個(gè)字節(jié)開(kāi)始傳輸數(shù)據(jù)。

軟件設(shè)計(jì)

  DSP片上實(shí)現(xiàn)了一次數(shù)據(jù)輸入輸出的函數(shù)dataIO,它采用C語(yǔ)言編寫(xiě),返回值1表示運(yùn)行過(guò)程均正常。有4個(gè)參數(shù),分別是輸出Buffer起始位置,輸出Buffer的大小,輸入Buffer的起始位置,輸入Buffer的大小。使用時(shí),在主函數(shù)中使用兩個(gè)RTDX宏聲明:RTDX_CreateOutput Channel(ochan),RTDX_CreateInput Channel(ichan),然后可以直接調(diào)用dataIO進(jìn)行數(shù)據(jù)傳輸,dataIO會(huì)在第一次運(yùn)行中自動(dòng)初始化環(huán)境。如圖7所示。dataIO函數(shù)經(jīng)過(guò)簡(jiǎn)單的修改甚至不修改即可以適用于不同的環(huán)境。

  主機(jī)端的RTDX過(guò)程使用C++實(shí)現(xiàn),因?yàn)槌绦虻闹饕康木褪窍蚰繕?biāo)板傳遞數(shù)據(jù)和取得數(shù)據(jù),所以直接在主程序中作了一個(gè)大的循環(huán),同目標(biāo)板一樣用了4個(gè)參數(shù):inbuffer,outbuffer,inbufferlength,outbufferleng。執(zhí)行時(shí),主程序首先被阻塞,不停的試圖從目標(biāo)板讀取經(jīng)過(guò)壓縮的數(shù)據(jù),直到目標(biāo)板DSP把壓縮好的數(shù)據(jù)放到輸出通道上。得到數(shù)據(jù)后,主程序把這些數(shù)據(jù)存放在本地文件中,然后把要壓縮的數(shù)據(jù)寫(xiě)到輸入通道上傳遞給DSP。這樣反復(fù)執(zhí)行直到傳輸雙方中的一方表示傳輸終止。

執(zhí)行過(guò)程

  首先把程序?qū)懭肽繕?biāo)板DSP中,然后在DSP集成開(kāi)發(fā)環(huán)境CCS的tools菜單中選擇RTDX,啟用輸入通道和輸出通道。先后運(yùn)行DSP程序和主機(jī)端程序即可實(shí)現(xiàn)數(shù)據(jù)的雙向傳輸。因?yàn)閮蛇叾际褂昧俗枞麢C(jī)制,所以程序運(yùn)行的先后順序無(wú)所謂。

結(jié)語(yǔ)

  本應(yīng)用實(shí)現(xiàn)了如下功能:主機(jī)端把44.1KHz,16bit采樣的音頻數(shù)據(jù)傳遞到DSP內(nèi)存中,每次傳遞1152個(gè)數(shù)據(jù)。DSP對(duì)這些數(shù)據(jù)進(jìn)行Mp3格式的壓縮,壓縮后的數(shù)據(jù)長(zhǎng)度不確定,最后DSP把這些數(shù)據(jù)傳回主機(jī)端,然后等待下一次傳輸開(kāi)始。實(shí)現(xiàn)基于DSK5416,用CCS2.0作為DSP綜合開(kāi)發(fā)環(huán)境。主機(jī)端程序用MS VC6.0編譯。

  這種RTDX的實(shí)現(xiàn)方法用于2003年德州儀器公司數(shù)字信號(hào)處理大學(xué)挑戰(zhàn)賽決賽項(xiàng)目“使用TMS320C547X實(shí)現(xiàn)多媒體數(shù)據(jù)在TCP/IP網(wǎng)絡(luò)傳輸”的設(shè)計(jì)中,該項(xiàng)目最終獲得大賽三等獎(jiǎng)。

 

參考文獻(xiàn):

1. 彭啟琮,‘TMS320C54x 實(shí)用教程’ ,電子科技大學(xué)出版社,1999

2. 張雄偉、陳亮、徐光輝,‘DSP集成開(kāi)發(fā)與應(yīng)用實(shí)例’,電子工業(yè)出版社,2002

 

RTDX_CreateOutputChannel( ochan );              //創(chuàng)建一個(gè)輸出通道,該操作為宏操作

...   

TARGET_INITIALIZE();

RTDX_enableOutput( &ochan );                //初始化目標(biāo)板以及通道使能

...

status = RTDX_write( &ochan, outp , RTDXBLOCK );  

//發(fā)送outp指針?biāo)笖?shù)據(jù)到輸出通道,數(shù)據(jù)長(zhǎng)度由RTDXBLOCK指定,返回實(shí)際發(fā)送的數(shù)據(jù)長(zhǎng)度*

*:數(shù)據(jù)長(zhǎng)度指類型為發(fā)送數(shù)據(jù)類型轉(zhuǎn)換為16位無(wú)符號(hào)所占長(zhǎng)度,outp的數(shù)據(jù)類型也應(yīng)為16位無(wú)符號(hào)數(shù)。

圖1  目標(biāo)板向主機(jī)輸出數(shù)據(jù)

 

RTDX_CreateInputChannel( ochan );           //創(chuàng)建一個(gè)輸入通道,該操作為宏操作

...   

TARGET_INITIALIZE();

RTDX_enableInput( &ochan );                     //初始化目標(biāo)板以及通道使能

...

status = RTDX_read( &ichan, inp, RTDXBLOCK )

//發(fā)送inp指針?biāo)笖?shù)據(jù)到輸出通道,數(shù)據(jù)長(zhǎng)度由RTDXBLOCK指定,返回實(shí)際接收的數(shù)據(jù)長(zhǎng)度*

*:數(shù)據(jù)長(zhǎng)度指類型為發(fā)送數(shù)據(jù)類型轉(zhuǎn)換為16位無(wú)符號(hào)所占長(zhǎng)度,inp的數(shù)據(jù)類型也應(yīng)為16位無(wú)符號(hào)數(shù)。

圖2   目標(biāo)板從主機(jī)端獲取數(shù)據(jù)


hr = rtdx_in.CreateInstance( __uuidof(RTDXINTLib::RtdxExp) ); //創(chuàng)建rtdx實(shí)例

status = rtdx_in->Open( "ichan", "W" );              //創(chuàng)建ichan ,以便向目標(biāo)板輸入數(shù)據(jù)*

status = rtdx_in->Write( sa, &bufferstate);       //把安全數(shù)組sa**中的數(shù)據(jù)寫(xiě)入目標(biāo)板

status = rtdx_in->Close();    //關(guān)閉輸入通道

*:讀寫(xiě)狀態(tài)標(biāo)志"W"應(yīng)該大寫(xiě),否則會(huì)帶來(lái)不可預(yù)知的錯(cuò)誤。

**:在寫(xiě)入數(shù)據(jù)時(shí),應(yīng)該把要寫(xiě)入的數(shù)據(jù)放在一個(gè)安全數(shù)組中。然后調(diào)用Write。

圖3  主機(jī)端向目標(biāo)板傳輸數(shù)據(jù)


hr = rtdx_out.CreateInstance( __uuidof(RTDXINTLib::RtdxExp) ); //創(chuàng)建rtdx實(shí)例

status = rtdx_out->Open( "ochan", "R" );       //創(chuàng)建ochan ,以便從目標(biāo)板獲取數(shù)據(jù)

status = rtdx_out->ReadSAI2( &sb );              //把目標(biāo)板上的數(shù)據(jù)寫(xiě)入安全數(shù)組sb*,**

status = rtdx_out->Close();  //關(guān)閉輸出通道

*:從目標(biāo)板讀取的數(shù)據(jù)首先被放在安全數(shù)組中,然后由使用者讀出。

**:可以根據(jù)目標(biāo)板的數(shù)據(jù)格式,通過(guò)調(diào)用ReadSAI1,ReadSAI2,ReadSAI4,讀取所占字節(jié)數(shù)不同的數(shù)據(jù)。例如讀取占用4個(gè)8位字節(jié)的word類型數(shù)據(jù),應(yīng)該使用ReadSAI4。

圖4  主機(jī)端從目標(biāo)板獲取數(shù)據(jù)

圖5  輸入輸出Buffer的數(shù)據(jù)格式

圖6  主機(jī)端與目標(biāo)板的數(shù)據(jù)傳輸過(guò)程圖


int dataIO(unsigned int * inbuffer,

                 unsigned int * outbuffer,

                 int inbuffer_length,

                 int outbuffer_length);

int main()

{     unsigned int inbuffer[FLUSH+2];

       unsigned int outbuffer[FRAME+2];

       while(1)

       {

              if (dataIO(inbuffer,outbuffer,FLUSH+2,FRAME+2)!=1)

return;

              encode();/*進(jìn)行數(shù)據(jù)處理*/

       }

}

圖7  經(jīng)過(guò)封裝的RTDX函數(shù)



關(guān)鍵詞: RTDX 嵌入式

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉