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<OxlO;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<m_nHeidlt;i++)
for(intj:0¨<m_nWidth;j++)
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不但可以用在软件调试过程
中,而且可用于医疗监测、工业控制等领域。