1 引言 在數字信號處理系統開發過程中,通常要對算法的正確性進行驗證,也就是程序調試。而傳統的主機調試器必須通過在目標應用程序中插入斷點,在中斷目標應用程序運行時觀測目標機上各寄存器或內存變量的值。但是,由于處理系統是實時的,因此,這種經典的方法不能實時地跟蹤數據的變化,有時顯示的數據根本就是錯誤的。這種方法的不足在筆者的圖像處理系統中表現得更為突出。且不說它不能實時反映數據處理的結果,即使可以實時反映,在用memoryView方法來觀測圖像處理的結果時也只是各內存單元的值,因而非常不直觀,為故障診斷和系統性能測評等帶來許多不便,所以,必須尋找一種方法來實時跟蹤數據變化,而且數據還應以非常直觀的形式顯示在主機屏幕上。 TI的Real-Time Data Ex-change(RTDX)技術就是利用DSPs的內部仿真邏輯和JTAG接口來實現主機與目標機之間的數據交換,它不占用DSPs的系統總線和串口等I/0資源,數據傳送完全可以在應用程序的后臺運行,對應用程序影響很小,它完全可以在不中斷目標應用程序的前提下,向主機實時發送目標機上各寄存器或內存變量的值。而主機上的可視化應用程序也可以通過嵌入COM的APl函數來獲得這些數據,并以適當的格式把數據顯示出來(如表格、波形圖或二維圖像等形式)。這樣,就可以實時觀測和分析應用程序的運行情況,使得編程人員查找和修改應用程序的錯誤更加方便,從而縮短系統的設計開發周期。 筆者在設計圖像目標識別系統時,把攝像頭信號通過視頻采集卡進行采樣和量化,并存放在處理機系統的外部存儲器中。為了獲得目標在圖像中的位置,設計時必須對采樣的數據進行識別算法處理。因為筆者處理的是連續圖像幀序列,因而不能在中斷程序運行的情況下觀測處理結果,而且無法通過只看相應memo~的值來判斷跟蹤窗是否能跟上運動的目標,所以,筆者采用了RTDX技術。 2 RTDX的原理 RTDX是一種可以在不影響目標應用程序運行的情況下讓主機和目標機進行實時數據傳輸的技術。RTDX支持雙向數據流,即目標機到主機的數據流和主機到目標機的數據流。RTDX數據流示意圖如圖1所示。 2.1目標機到主機的數據傳送 目標機為了向主機發送數據,必須設定一個輸出通道oehanData。通過用戶接口可將數據送到輸出通道以使這些數據隨即保存到RTDX目標機的緩存(由RTDX目標函數庫定義)中,然后再將這些數據通過JTAG接口發送到主機。RTDX主機函數庫將接收到的數據保存在log文件中或主機的緩存中(具體由RTDX模式來決定)。 保存在log文件中或主機緩存中的數據可以通過COM Automation Client重新獲取析。下面是幾種典型的COM Automation Client: Visual Basic applications; Visual C++ applications; Lab View; Microsoft Excel。 2.2主機到目標機的數據傳送 目標機要從主機中獲得數據,首先必須設定一個輸入通道ichanCmd,來接受主機發出的命令,從而實現數據傳輸的同步。運行中,系統可通過用戶接口發送一個讀取數據的請求,并將這個請求保存在RTDX目標機的緩存中,然后通過JTAG接口發送到主機。同時應由COM automation client通過COM接口把要發送的數據先寫入到RTDX主;帆函數庫中的緩存,以等待目標機讀取數據的請求。當RTDX主機函數庫收到從目標機發出的讀取數據請求時,保存在RTDX主機函數庫中的數據便可通過JTAG接口將數據發送到目標機,從而使該數據可以實時寫入目標機指定的存儲區域。操作完成后,主機會通知RTDX目標機函數庫。 2.3 RTDX目標機函數庫的用戶接口和COM接口 利用RTDX目標機函數庫的用戶接口可實現在目標機DSP應用程序和主機之間進行安全可靠的數據交換。同時可利用它完成應用程序向RTDX主機庫發送數據、應用程序向RTDX主機庫發送數據請求以及在目標機上提供數據緩存等功能。另外,數據發送前應先將數據拷貝到目標機緩存中,以減少對應用程序實時性的影響。 RTDX主機庫中的COM接口可用來確定COM automation client與RTDX主機函數庫的通信方式。而通過COM automation client可訪問保存在RTDX lox文件或BTDX主機函數庫緩存中的數據。同時COM automation client也可通過RTDX主機函數庫向應用程序發送數據。 2.4 RTDX模式 RTDX主機函數庫提供了兩種接受目標機數據的模式:第一種是非連續模式,在這種模式中,數據通常存到主機的log文件中。該模式一般應用于非實時處理情況下,可在事后分析保存在log文件中的數據。第二種是連續模式,在這種模式中,數據不寫入log文件,而是由RTDX主機函數庫緩存,它一般應用在實時情況下。 3 基-ZRTDX的視頻數據傳輸 在程序調試時,筆者利用RTDX技術在主機上顯示采集圖像處理后的結果以驗證算法的性能,并通過設定主機與目標機的握手信號來在主機上實現動態的視頻顯示。 考慮到數據傳輸都由JTAG接口完成而且圖像數據量很大,調試中往往采用將512X512圖像每4個相鄰像素取一個點的方法來將分辨率降為128X128,因為減少數據量可提高顯示幀頻。當數據通過RTDX通道傳到主機時,128X128的圖像數據可通過每個像素擴展成4個相鄰的像素來恢復圖像。最后通過VC的位圖顯示函數來顯示圖像結果。圖2所示是其視頻數據流示意圖。 為了使主機與目標機之間能正確地傳送和接受數據,主機應用程序和目標機應用程序都要嵌入支持RTDX的APl函數。下面詳細介紹兩者之間的操作流程。 3.1在DSP應用程序中使用RTDX 在DSP應用程序中通過APl函數調用RTDX目標機函數庫時,必須將相應的API函數嵌入應用程序中。其步驟如下: (1)設定相應的RTDX通道為全局對象 RTDX通道為單向傳輸。設定RTDX輸出通道ochanData可使目標機向主機傳輸數據;而設定RT-DX輸入通道ichanCmd則可使主機向目標機傳輸命令數據,同時,可用輸入通道來同步主機與目標機。 其程序如下: RTDX_CreatOutputChannel(ochanData); RTDX_CreatlnputChannel(ichanCmd); Void Task ch() RTDX_enableOutput(&ochanData); RTDX_enablelnput(&ichanCmd) //START為主機向目標機發送 的傳輸開始控制命令(用戶自定義) Retumcode二RTDX_read(&ichanCmd, received,4); )while(received[0]!:START); (2)設定RTDX_Poll()的調用方式 RTDX目標機函數庫是通過調用函數RTDXPon()來實現主機與目標機間的通信的。RTDX_Poll()的調用有兩種方式:一種是在應用程序中調用,另一種是利用中斷服務程序調用。程序如下 while(RTDX_writing!二NUIL) #ifRTDX_POIIJNG RTDX_Poll(); #endif ) 若將宏RTDX_POII,ING_IMPLEMENTATION定義為1,則表示在應用程序中調用RTDX_Poll(),而如果將其定義為0,則表示在中斷服務程序中調用 RTDX_Poll()。 (3)目標機向主機發送視頻數據 若采集數據空間的一幀圖像(512X 512),可通過調用函數RTDX_write()發送到主機,并可將一幀圖像分成若干塊傳輸,每一塊數據為1k。程序如下: fOr(cond:0;cond<0x10;cond++) rawdat_temp'baseadd+cond*0x4000; rawdat二(unsignedint*)mwdat_temp; /*圖像在目標機上的地址*/ fOr(count:0;count 3.2在VC編程環境下使用RTDX 在VC環境下獲取RTDX主機函數庫緩存中的數據并顯示的步驟如下: (1)在VC中實現與RTDX主機函數庫的握手 (Handshanking)程序如下: ::Colnitialize(NULL); //initializeCOM ::Variantlnit(&sa); //initializeVARIANTsa h二ndx.Createlnstance(uuidof(RTDXINTLib::Rtdx- Exp)); //instantiate出eRTDX//COMObiect 訂(FAILED(血)){ MessageBox(//Error:Instantiationfailed!//); return-1; ) status二rtdx->Open("ochan'',"R"); //opepachannel(ochan)fOrreading 訂(status!二Success){ MessageBox("-Error fdled!"); return-1; 1 (2)在VC中重新獲得由目標機傳送來的數據 rtck->ReadSAl4(&sa); //read a 32-ht integermessage switch(status) { //teststatus returnedfrom ReadSAl4 case Success: for(i:0;i<(signed)sa.parray-> rgsabound[0].cElements;i++) {hr二::SafeArrayGetElement(sa.parray, &i,(10ng*)&data); datatemp:(unsignedint)data; fOr(intitochar:0;itochar<4;itochar十+) ImageT[count+itochar];(char)(datatemp >>itochar-k9)&隊000000ff); count+:4;1//counter為傳輸像素計數器 break; case Failure: MessageBox(-Error:ReadSAl4 returnedfmlure!\n"); case return-1; EnoDataAvailsble: MessageBox("NODataiscurrendy available!"); return-1; case EendOfl_ogFile: MessageBox("DataProcessingComplete!") 1 while(status!二EEndOfLogFile) (3)在VC中顯示數據的程序如下: if(count二:16384) //128*128: count二0; br(inti:0;i [(m_nHei少t-i-1)*m_nWidth+¨ m_rawdat:RawToDib(hlmage); Draw(m_rawdat,dc,1eft,top); /*調用函數Draw()畫圖* 4 結束語 RTDX是一種非常優秀的實時數據傳輸技術,為軟件調試提供了一種全新的方法。該項技術所設計的調試軟件具有占用系統資源少、速度快和COM Automatic Client選擇靈活等特點,為DSP編程人員發現程序錯誤和監測系統運行狀況提供了實時的、直觀的表示形式。其實,RTDX不但可以用在軟件調試過程中,而且可用于醫療監測、工業控制等領域。 |