作者:胡敏露;徐刚锋;李飚
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 while(!RTDX-write(&ochan,mwdat+count*datanum,datanum*sizeof(int)));
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 for(intj:0¨ lpTemlmage¨*m_nWidth+¨:ImageT
[(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不但可以用在软件调试过程中,而且可用于医疗监测、工业控制等领域。
责任编辑:gt
全部0条评论
快来发表一下你的评论吧 !