rtdx

0

本周最热门”中出现,认为够“牛”就投上一票吧!" AutoHide="false">
RTDX烧写DSP5402的FLASH程序芯片贴图留念
hotpower 发表于 2008-6-13 18:18 德州仪器(TI) ←返回版面

楼主: RTDX烧写DSP5402的FLASH程序芯片贴图留念

因为今天和明天都是好日子~~~

rtdx_第1张图片


rtdx_第2张图片

系统分类: DSP
用户分类: DSP/RTDX
标签: 无标签
来源: 原创
发表评论 阅读全文(162) | 回复(0)

1

本周最热门”中出现,认为够“牛”就投上一票吧!" AutoHide="false">
从注册表里取rtdxint.dll文件路径的方法
hotpower 发表于 2008-6-13 02:49 德州仪器(TI) ←返回版面

3楼: 从注册表里取rtdxint.dll文件路径的方法

int DllFileNameSize;
char DllFileName[300];// = "d://ti//cc//bin//rtdxint";

RegReadString (REGKEY_HKCR, "CLSID//{2FE56670-3E4E-11D2-A964-006097A6A260}//InprocServer32", "", DllFileName, sizeof(DllFileName), &DllFileNameSize);  
hotpower 发表于 2008-6-13 02:55 德州仪器(TI) ←返回版面

4楼: 重新注册RTDX的COM接口

        if (status != S_OK)//建立IclassFactory接口失败自动注册
        {
            hinstLib = LoadLibrary(DllFileName);

               // If the handle is valid, try to get the function address.
            if (hinstLib != NULL)
            {
                //HRESULT CA_ServerDllRegisterServer (HINSTANCE server_hInstance);
                FunctionDLLRegisterServer = (DLLRegisterServer) GetProcAddress(hinstLib, (LPCSTR)"DllRegisterServer");
                if (FunctionDLLRegisterServer != NULL)
                {
                    if (SUCCEEDED(FunctionDLLRegisterServer ()))
                    {
                        status = CoCreateInstance(&GUID_CLSID_RTDXEXINTERFACE,//COM class id
                                                  NULL,//outer unknown
                                                  CLSCTX_INPROC_SERVER,//server INFO = 从In-Proc Server 建立COM对象   
                                                  &IID_IDispatch,//IDispatch id
                                                  (LPVOID FAR*)&pIDispatch);//pointer to pIDispatch
                    }
                }
                FreeLibrary(hinstLib);
            }
        }
系统分类: 软件开发
用户分类: DSP/RTDX
标签: 无标签
来源: 原创
发表评论 阅读全文(297) | 回复(0)

0

本周最热门”中出现,认为够“牛”就投上一票吧!" AutoHide="false">
C6000实时在线仿真系统设计实例(转帖)

http://blog.eccn.com/u/107250/archives/2007/474.htm

C6000实时在线仿真系统设计实例

本章通过实例向读者介绍TI公司的实时在线仿真系统在C6000系列DSP中的应用。首先介绍RTDX配置和RTDX的开发步骤;然后分别介绍RTDX主机与目标机相关的函数;最后介绍了RTDX的两个案例。

1  实时在线仿真系统概述

实时在线仿真系统的英文全称为Real-Time Data Exchange,简称RTDX(TI公司已经将它注册为商标)。TI公司提出这个概念主要是为了实现计算机和DSP芯片之间的实时数据交换。读者可以将RTDX理解为一个时分复用的全双工数据通道管道,在这个过程中,计算机被称为主机,DSP芯片被称为目标机。读者可以通过RTDX在程序运行过程中,而不必终止程序来将所需要的信息在主机和目标机之问来回传送。

图7-1是RDTX的逻辑模型图。从图中可以看出,目标机和主机之间的通信实际上是通过JTAG口完成的。目标机中的RTDX目标库和位于CCS(code Composer studio)中的RTDX主机库之间实时交换数据。RTDX目标库向目标应用程序提供用户接口,目标应用程序可以通过此接口发送和接受数据。RTDX主机库提供COM接口,主机客户程序通过COM接口发送和接受数据。RTDX主机库还可以将数据保存在日志文件中,供非实时数据分析使用。    从逻辑上看,可以把此数据管道分成若干个虚拟管道,每个虚拟管道称为一个通道(Channel)。每种类型的数据通过各自的通道传送,这样能够将具有不同意义的数据从逻辑上分开。每个通道只能够单向传送数据,当然不同的通道可能具有不同的方向。可以异步地向通道写入数据,也就是说,可以在任意时刻写入数据。

 


目标应用程序通过调用RTDX目标库中的函数发送数据。这些数据实际上只是放在目标库的缓冲区中,然后函数屯即返回。RTDX目标库在处理器空闲时将本地缓冲区中的数据发送出去,这样不干扰主应用程序的正常运行。根据设定的主机记录模式,主机将数据放到缓冲区中或者记录到日志文件中。RTDX主机库对外提供C0M接口,可以认为是COM服务器,主机客户程序通过COM接口获获数据,并根据需要分析和显示数据。

同样,当主机应用程序向客户应用程序发送数据时,数据被放在RTDX主机库的缓冲区中。当RTDX主机库接收到目标应用程序要求数据的请求时,如果缓冲区中有足够的数据满足要求,数据就会发送到目标应用程序。数据被写入指定的存储器,不干扰目标应用程序的运行,同时主机会通知RTDX目标库操作已经完成。

2  RTDX配置

在进行RTDX配置之前,必须首先启动和设置好CCS,读者将CCS安装完成后,单击Setup CCS 2(C6000),进入图7-2所示的界面。

 


选择TOOLS菜单下的RTDX 子菜单,它有3个选项,分别为:Diagnostics Control,Configuration Control,Channel ViewerControl。单击Configuration Control选项,会弹出如图7-4所示的窗口。它主要完成3个功能:

 


·显示当前RTDX的设置情况

     图7-4中Current Settings下显示的就是当前RTDX的设置情况。

·使能,禁止RTDX

     在窗口的左下角有一个Enable rtdx选钮。选中则使能RTDX,否则为禁止RTDX。

·进入RTDX发置菜单

    单击右小角的Configure菜单。则会进入如图7-5所示的RTDX Configuration Control对
话框。

 


RTDX Configuration Control对话框用来配置RTDX目标库的行为,完成特定的功能。可以在右下角的Host Buffer栏中配置RTDX主机库的内部缓冲区。默认情况下缓冲区的大小为1024个字节,共4个缓冲区,用户也可以改变这些设置。Mode栏设置RTDX主机库的工作模式,有两种工作模式可以选择:

    ·Non-Continuous Mode,非连续模式。在此模式下,从RTDX目录库传送过来的数据被记录存日志文件中,日志文件的扩展名为rd。

·Continuous Mode,连续模式。在此模式下,从RTDX目标库传送过来的数据被记录    在内部的循环缓冲区中。

当需要捕获有限的数据并保存数据时,可以使用非连续模式。当需要从目标应用程序连续地获取和显示数据而小需要保存数据时,可以使用连续模式。

Data Source栏用于设置RTDX主机库通过COM接口向主机客户程序提供数据时,可以有以下两种数据来源:

·Live:Data(from target):从目标系统传送过来的实时数据;

·Playback(from log file):回放,从日志文件中得到以前记录的数据。

读者可以在“Log Filename”文本框中选择日志文件的位置。当使用Live Data,且工作在非连续模式下,此日志文件是用于记录数据的日志文件。当使用Playback时,此日志文件是用于读取以前记录的数据的文件。

在一些非实时分析的情况下,绎常先用非连续模式,记录大量目标应用程序发送的数据(此时主机客户程序可能没有运行)到日志文件,然后利用Playback方法,由主机客户程序从COM接口获取记录的数据分析显示(此时目标应用程序可能没有运行),此时就需要现在的Playback作为数据来源。

当选择Tools菜单下的RTDX子菜单下的Channel Viewer Control选项时,系统会弹出如图7-6所示的窗口。

 


 Channel Viewer Control用来白动探测系统通道并把它们显示出来,同时它还可以完成两
个功能:

   ·增加和删减通道;

   ·使能/禁止通道;

Channel Viewer Control窗口上有两个选项:Output Channel,Input Channel分别显示输出和输入通道号。当显示OutputChannel窗口时,系统将会显示以下信息:

   Adress  通道十六进制地址

   XFRCout。  传送信息的数目

   ByteCout  等待读取的字节数目

   MsgCount  等待读取的信息数目

   MsgLen    当前信息长度

   MsgNum    当前信息的序列号

   当显示Input Channel窗口时,系统将会显示以下信息:

Adress

XFRCout

RReqCout

ABvteCount

通道十六进制地址

传送信息的数目

目标机等待读取的数目

能够被发送给目标机的字节数目

RByteCount目标机应用程序已经申请的字节数目

不干扰目标机上程序正常运行的情况下,实现主机与目标图7-7所示的菜单。单击DeleteChannel将删除该通道,单击Add Channel将出现如图7-8所示的对话框。


用户在Channel Name里输入通道名,在Channel Type中选择通道类型即可以增加所需要的通道号。

当选择TOOLS菜单下的RTDX子菜单下的Diagnostics Control选项时,系统会弹出如图7-9所示的窗口。

 


Diagnostics Control控件用来探测RTDX是否正常工作,它有3种探测方式:

●Internal Test

这个测试仿真从目标应用程序接受数据,用来测试ccs是否工作正常,它和实际的目标程序没有关系。

● Target-To-Host Test

这个测试使目标能够发送数据给HOST,HOST能够接受目标板的数据。

●Host-To-Target Test

这个测试使目标能够接受HOST发送的数据,HOST能够发送数据给目标板。

3程序设计流程

    RTDX可以在不干扰目标机上程序正常运行的情况下,实现主机与目标机之间的数据交
换(双方土要是交换数据)。对于目标机向主机传送数据来说,不但可以传送数据,还可以
传送标志事件运行状态的数据,这些数据常常被称为事件数据,用户在传送事件数据时要定
义这个事什才行。主机向目标机则主要是传送各种类型的普通数据。

    无论是目标机向主机传送数据,还是主机发送数据到目标机,都可以分为以下几步来完
成:

·第1步:编制目标机程序用来发送或接受数据。这一步是在CCS下完成的。这一步    必须先行,因为在这一步中需要定义用于主机访问的RTDX数据通道并向这些通道写入或读取数据,RTDX编程有无必要,关键在于看这一步有无必要。

·第2步:编写主机程序用于接受或发送数据。这一步是在PC机各种软件下完成的。    这一步需要使用第一步中定义的RTDX数据通道,并通过这些通道读取或写入数据。以上两步的程序设计格式对于同一系列的DSP芯片来讲是固定的,对于不同系列的DSP,其格式稍有不同。

    ·第3步:将目标程序写入到目标机上。特别注意,因为RTDX是通过JTAG完成数据    交换的,在编译连接和写入程序时,一定不要肩动RTDX,否则程序运行是没有结果的。

·第4步:启动RTDX。

·第5步:运行目标机程序。

·第6步:运行主机程序。

·第7步:在主机上对目标机传送来的数据进行分析。

通过以上几步,读者就可以利用RTDX在程序运行时将自己所需要的数据在主机和目标机之间来回传送。

4  RTDX函数

在7.3节中介绍了要设计RTDX程序流程,要分别编制目标机程序和主机程序,对应这两种程序T1分别提供了两种函数给用户调用。

4.1  主机函数

TI公司提供的RTDX主机接口函数可以完成通道的操作、配置、诊断、查询等功能。这些函数大致可以分为以下几类:

    1.配置函数

    ·long ConfigureRtdx(short Mode,long MainBufferSize,long NumOfMainBuffers);

参数:  Mode  连续或非连续模式,1.连续模式,0。非连续模式

            MainBufferSize  缓冲区大小,默认为1024

            NumOfMainBuffers  缓冲区数目  默认为4

返回值:0-成功,非0-失败

函数描述:ConfigureRtdx函数用来设置RTDX模式和缓冲区的大小和数目。

●long ConfigureLogFilefBSTR FileName,long FileSize,shott FileFullMode,short    FileOpenMode);

参数:FileName    LOG文件名

          FileSize    文件人小

   FileFullMode    覆盖旧文件模式:0-覆盖旧数据;1-抛弃新数据

   FileOpenMode  打开文件模式:O-只读;1-在现成文件上附加:2-覆盖现成文件。

返回值:0-成功,非0-失败

函数描述:ConfigureLogFile函数用来设置RTDX log文件。

·long EnableRtdx();

参数:  无   

返回值:0-成功,非0-失败

函数描述:使能RTDX  

·long DisableRtdx();

     参数:  无

     返回值:0-成功,非0-失败

     函数描述:禁止RTDX

·long EnableChannel(BSTR ChannelName);

     参数:  ChannelName  通道号

     返回值:0-成功,非0-失败

     函数描述:使能该通道

·long DisableChannel(BSTR ChannelName);

     参数:  ChannelName  通道号

     返回值:0-成功,非0-失败

     函数描述:禁止该通道

2.通道操作函数

·long Open(BSTR Channel_String,BSTR Read_Write);

     参数:  Channel_String    通道标识符

     Read_Write  “r”.读;“W”-写

     返回值:0-成功,非0-失败

     函数描述:为读写操作打开相应通道

·long Close();

     参数:  无

     返回值:0-成功,非0-失败

     函数描述:关闭数据通道

·long ReadSAll(VARIANT*pArr);

     参数:pArr  VARIANT变最指针

     返回值:0-成功,非O-失败

     函数描述:从数据通道读取8位整数

·long ReadSAl2(VARIANT*pArr);

     参数:pArr  VARIANT变量指针

     返回值:0-成功,非0-失败

     函数描述:从数据通道读取·16位整数

·long ReadSAl4(VARIANT*pArr);

  参数:pArr  VARIANT变量指针

  返回值:0-成功,非0-失败

  函数描述:从数据通道读取32位整数

·long ReadSAF4(VARIANT*parr);

    参数:pArr  VARIANT变量指针

    返回值:0-成功,非0-失败

    函数描述:从数据通道读取32位浮点数。

·long ReadSAF8(VARIANT*pArr);

  参数:pArr  VARIANT变量指针

  返回值:0-成功,非0-失败

  函数描述:从数据通道读取64位浮点数。

·VARIANT ReadSAl2V(long*pStatus);

  参数:pStatus返回状态指针

  返回值:SAFERRAY指针变量。

  函数描述:从数据通道中读取信息放置到SAFERRAY变量中,返叫SAFERRAY指针。

·VARIANT ReadSAl4V(long*pStatus);

  参数:pStatus    返回状态指针

  返回值:SAFERRAY指针变量

  函数描述:从数据通道中渎取信息放置到SAFERRAY变量中,返回SAFERRAY指针。

·long Read(VARIANT*pArr,long dataType,long numBytes);

 参数:pArr    VARIANT变量指针

       dataType    数据类型

       numBytes  字节数

返回值:0-成功,非0-失败

 函数描述:从数据通道中读取特定类型和特定数日的数据。

·long Readll(BYTE*pData);

    参数:pData VARIANT变量指针

dataType    数据类犁

numBytes  字节数

返回值:0-成功,非0-失败

函数描述:返回读取的8位整数数据指针。

·long Readl2(short*pData);

     参数:pData VARIANT变量指针

           dataType数据类型

           numBytes    字节数

     返回值:0-成功,非0-失败

     函数描述:返回渎取的16位整数数据指针。

·long Readl3(10ng*pData);

     参数:pDam    VARIANT变量指针

           dataType数据类型

           numBytes  字节数

返回值:0-成功,非0-失败

函数描述:返回读取的32位整数数据指针。

·long ReadF4(float*pData);

参数:pDma    VARIANT变量指针

         dataType数据类型

         numBytes    字节数

返回值:0-成功,非0-失败

函数描述:返回读取的32位浮点数数据指针。

·long ReadF8(double*pData);

参数:pData   VARIANT变量指针

          dataType数据类型

          numBytes  字节数

返回值:0-成功,非0-失败

函数描述:返回读取的64位浮点数数据指针。

·long Write(VARIANT Art,long*numBytes);

参数:  Arr    指向SAFERRAY数据的VARIANT变量指针

    numBytes字节数

返回值:0-成功,非0-失败

     函数描述:写信息到数据通道。

·long Writell(unsigned char Data,long*numBytes);

参数:Data  向目标板的数据

    numBytes    字节数

返回值:0-成功,非0-失败

函数描述:写8位整数数据到目标板。

·long Writel2(short Data,long*numBytes);

     参数:Data  发送给目标板的数据

     numBytes  字节数

     返回值:0-成功,非0-失败

     函数描述:写16位整数数据到目标板。

·long Writel4(long Data.long*numBytes);

     参数:Data  发送给目标板的数据

    numBytes    字节数

返回值:0-成功,非0-失败

函数描述:写32位整数数据到目标板。

·long WriteF4(float Data.long*numBytes);

参数:Data  发送给目标板的数据

     numBytes  字节数

     返回值:0-成功,非0-失败

     函数描述:写32位浮点数数据到目标板。

·long WriteF8(double Data,long*numBytes);

     参数:Data  发送给目标板的数据

    numBytes  字节数

返回值:0-成功,非0-失败

函数描述:写64位浮点数数据到目标板。

·long StatusWrite(long*numBytes);

参数:  numBytes  字节数

返回值:0-成功,非0-失败

函数捕述:获取以前写操作的信息。

·long Seek(long MsgNum);

参数:  MsgNum  信息数

返回值:0-成功,非0-失败

函数描述:与GetMsgNumber、GetNumMsgs函数一起获取log文件中的信息。

·long SeekData(long numBytes);

参数:  numBytes    字节

返回值:0-成功,非0-失败

函数描述:将内部读指针向前或向后移动numBytes个字节数。

·long Flush();

参数:  无

返回值:0-成功,非0-失败

函数描述:将通道内所有的数据发送给目标板。

·long Rewind();

参数:  无

返同值:0-成功,非0-失败

函数描述:将读指针移到log文件的开头。

3.查询函数

·long GetChannelID(BSTR Channel_String,long*chanId);

  参数:  Channel_String  通道名

chanld    通道内部ID号

返回值:0-成功,非0-失败

函数描述:得到通道的内部ID号。

·long GetMsgID(long*pMsgId);

参数:pMsgld信息ID号

返回值:0-成功,非0-失败

函数描述:得到当前信息的内部ID号。

·long GetMsgLength(long*pLength);

参数:pLength当前信息长度指针

返回值:0-成功,非0-失败

函数描述:得到当前信息字节长度。

·long GetMsgNumber(long*pMsgNum);

参数:pMsgNum  当前信息序列号指针

返回值:0-成功,非0-失败

函数描述:得到当前信息序列号。

·long GetNumMsgs(long*pNum);

参数:pNum log文件中的信息数指针

返回值:0-成功,非0-失败

函数描述:得到log文件中的信息数目。

·long GotoNextMsg();

参数:  无

返回值:0-成功,非0-失败

函数描述:转到log文件中下一个指针。

4.诊断函数

·long GetChannelStatus(BSTR ChannelName,long*pChannelStatus);

参数:  ChannelName通道名

DChannelStatus  通道状态

返回值:0-成功,非0-失败

函数描述:返回指定通道的状态。

·long GetRTDXRev(long*RevNum);

参数:  RevNum版本号

返回值:0-成功,非0-失败

函数描述:返回RTDX的版本号。

·long GetStatusString(BSTr*StatusString);

参数:  StamsString  状态字符串    .

返回值:0-成功,非0-失败

函数描述:返同RTDX中最后一组错误状态信息字符串。

·long GetCapability(long*Capability);

参数:  Capability  能力

返回值:0-成功,非0-失败

函数描述:返回RTDX的能力

·long RunDiagnostics(short TestType,long TestMode,long TestInfo);

参数:  TestType    测试类型:0-Intemal 1-目标板到主机;2-主机到目标板

TestMode  测试模式:0-开始;1-停止;2-得到结果

            Testlnfo    测试信息:0-成功;l-失败;2-超时

    返回值:0-成功,非0-失败

    函数描述:执行测试操作

·BSTR GetDiagFilePath(short TestType);

参数:TestType    测试类型:0-Internal;1-目标板到主机;2.主机到日标扳 

返回值:路径和文件名

函数描述:返回指定测试的路径和文件名

7.4.2目标机函数

TMS320C6000 DSP/BIOS API里向包含的RTDX函数模块包含了以下几个函数:

int RTDX_channelBusy(RTDX_inputChannel*pichan):

参数:pichan通道号

返回值:0表示该通道不忙,l表示该通道忙

函数描述:RTDX_channelBusy该函数与RTDX_readNB函数结合使用,用来表示指定通道当前是否正在被使用,如果该通道被使用,则状态寄存器0(ST0)的TC标志位被设置成

1,否则被设置成0。该函数不能被中断函数调用。

RTDX_CreateInputChannel(ichan):

参数:ichan输入通道标号

返回值:无

函数描述:RTDX_CreateInputChannel用来声明一个用于输入的通道。它不能被中断函数调用。

  RTDX_CreateOutputChannel(ochan):

参数:ochan输入通道标号

返旧值:无

函数描述:RTDX_CreateOutputChannel用来声叫一个用于输出的通道。它不能被中断函数凋用。

    void RTDX_disablelnput(RTDX_inputChannel*ichan):

参数:ichan输入通道标号

返旧值:无

函数描述:RTDX_disablelnput用来禁止指定的输入通道。它不能被中断函数调用。

void RTDX_disableOutput(RTDX_outputChanneI*ochan);

参数:ochan输出通道标号

返回值:无

函数描述:RTDX_disableOutput用来禁止指定的输出通道。它不能被中断函数调用。

void RTDX_enablelnput(RTDX_inputChannel*ichan):

参数:ichan输入通道标号

  返回值:无

函数描述:RTDX_disablelnput用来使能指定的输入通道。它不能被中断函数调用。

void RTDX_enableOutput(RTDX_outputChannel*ochan);

参数:ochan输出通道标号

返回值:无

函数描述:RTDX_disableOutput用来使能指定的输出通道。它不能被中断函数调用。

RTDX_isInputEnabIed(ichan):

参数:ichan输入通道标号

返回值:无

函数描述:RTDX_isInputEnabled用来测试指定的输入通道是否被使能,如果被使能,则状态寄存器0的TC标志位被置为1,否则被置为0。

    RTDX_isOutputEnabled(ohan);

    参数:ochan输出通道标号

    返回值:无

函数描述:RTDX_isOutputEnabled用来测试指定的输出通道是否被使能,如果被使能,则状态寄存器0的TC标志位被置为1,否则被置为0。

int RTDX_read(RTDX_inputChannel*ichan,void*buffer,int bsize):

参数:ichan输入通道标号

buffer  接受缓冲区指针

bsize  接受缓冲区大小

返回值:>0缓冲区接受的数据量的长度

    0  失败

RTDX_READ_ERROR该通道没有被使能

函数描述:RTDX_read用来向指定的输入通道发送读数据请求,如果该通道是被使能的,则该函数在收到数据后将返回收到的数据长度,如果该通道没有被使能,则该函数将返回RTDX_READ_ERROR错误。RTDX_read不能被中断子程序调用。

int RTDX_readNB(RTDX_inputChannel*ichan,void*buffer,int bsize):

参数:ichan输入通道标号

buffer接受缓冲区指针

bsize  接受缓冲区大小

返回值:RTDX_OK  成功

    0  失败,缓冲区已满

RTDX_READ_ERROR该通道没有被使能

函数描述:RTDX_readNB与RTDX_read函数一样,用来向指定的输入通道发送读数据请求,但它不会向RTDX_read一样一直等待下去,而是立即返回。它一般与TDX_channelBusy和RTDX_sizeofInput函数结合使用。RTDX_readNB不能被中断子程序调用。

int RTDX_sizeoflnput(RTDX_inputChannel*pichan);

参数:pichan输入通道标号

返回值:缓冲区内数据的数量

函数描述:RTDX_sizeoflnput用来与RTDX_readNB结合使用,它返回从数据通道传送给A的数据体的数量。该函数不能被中断子程序调用。

int RTDX_write(RTDX_outputChannel*ochan,void*bLAfter,int bsize);

参数:ochan输出通道标号

buffer   接受缓冲区指针

bsize  接受缓冲区大小 

返回值:非0成功

0 失败

函数描述:RTDX_write用来将数据传送给指定的输出通道,当数据被传送给RTDX缓冲区后,该函数返回。该函数不能被中断子程序调用。

5系统设计实例

本节将通过从目标机接受整数数据和向目标机发送整数数据两个实例向读者展示如何使用RTDX,其中每个实例都必须包含主机和目标机上两个程序。其中PC机上的程序可以住C环境下编制,也可以在VB的环境下编制,甚至还可以用MATLAB实现,本节第一个案例是用C编制,第二个案例是用VB编制的。

5.1  从目标机接受整数数据实例

该程序完成的是目标机向PC机发送一个整数5,编制这个实例程序的流程如下:

(1)打开C语言编辑环境。

(2)输入源代码,如下:

 



从该源代码中可以看出,调用RTDX函数的几个步骤:

·加入RTDX头文件——#i nclude 。

·定义一个全局的PC主机数据输出通道,RTDX通道是一种必须在DSP目标存储器中    定义成全局数据对象的数据结构,通道的名字可以任取:

RTDX_CreateOutputChannel(ochan);

·初始化DSP目标系统。使用宏TARGET_INITIALIZEO或者自己编写的代码初始化    DSP目标系统,在初始化目标系统时,需要注意的是,初始化的顺序是与DSP处理器相关的。

TARGET_INITIALIZE();

·使能输出通道写数据。RTDX通道在初始化时默认是禁止的,在数据传输的时候必须    事先使能RTDX通道。

RTDX_enableoutput(&ochan);/*使能输出通道*/

·传送数据到PC主机。

Status=RTDX_write(&ochan,&data,sizeof(data));

·禁止输出通道传输数据。需要禁止CCS从DSP目标系统处理或传输数据,则需要调    用RTDX_disableOutput函数。

RTDX_disableOutput(  &ochan  );

(6)保存源代码文件,编译链接并生成OUT输出文件。

    (7)在CCS File菜单里载入生成的OUT文件。
(8)选择CCS菜单命令Tools→RTDX→Conflguration Control,在对应的图7-4的EnableRTDX栏前面画上一个“√”。

(9)在Debug菜单下运行Run命令,执行DSP应用程序。

(10)在PC机上运行对应的C语言程序。

(11)在PC机屏幕上将会显示数字“5”,表示PC主机已经从DSP目标系统读取了整数5。

5.2  向目标机发送整数数据实例

该程序完成的是目标机从PC机接受一个整数5,编制这个实例程序的流程如下:

 



·加入RTDX头文件——-#i nclude 。

·定义一个全局的PC主机数据输入通道,RTDX通道是一种必须在DSP目标存储器中定义成全局数据对象的数据结构,通道的名字可以任取:

RTDX_CreateInputChannel(  ichan  );

·初始化DSP目标系统。使用宏TARGET_INITIALIZEO或者自己编写的代码初始化    DSP目标系统,在初始化目标系统时,需要注意的是,初始化的顺序是与DSP处理器相关的。

TARGET_INITIALIZE();

·使能输出通道写数据。RTDX通道在初始化时默认是禁止的,在数据传输的时候必须    事先使能RTDX通道。

RTDX_enableInput(&ichan)j

  ·从PC主机接受数据。

status=RTDX_read(&ichan,&data,siZeof(data));

·禁止输出通道传输数据。需要禁止CCS从DSP日标系统处理或传输数据,则需要调    用RTDX_disableInput函数。

(6)保存源代码文件,编译链接并生成OUT输出文件。

(7)在CCS File菜单里载入生成的OUT文件。

(8)选择CCS菜单命令Tools→RTDX→Configuration Control,相对应的图7-4的EnableRTDX栏前面画上‘个“√”。

(9)在Debug菜单.下运行Run命令,执行DSP应用程序。

(10)在PC机上运行对应的Visual Basic程序。

(11)在CCS的标准窗口上就会显示 5 was received from the host,表示DSP目标系统已经从PC机读取了整数5。

6本章小结

    RTDX虽然只是方便调试的一种工具,但它在现在DSP特别是C6000系列的开发中占据着很重要的位置。了解和熟悉RTDX对于读者熟练掌握DSP的开发有重要的作用。本章则向读者详细介绍了RTDX的使用,并提供了RTDX的2个实例供读者实践学习。

 
系统分类: DSP
用户分类: DSP/RTDX
标签: 无标签
来源: 转贴
发表评论 阅读全文(200) | 回复(0)

0

本周最热门”中出现,认为够“牛”就投上一票吧!" AutoHide="false">
不抛弃不放弃,终知DSP/BIOS+RTDX真谛~~~
hotpower 发表于 2008-5-23 21:49 德州仪器(TI) ←返回版面

楼主: 不抛弃不放弃,终知DSP/BIOS+RTDX真谛~~~

哈哈~~~本想先做DSP/GEL菜鸟~~~不好意思RTDX菜鸟先"登顶"了~~~

一个字---爽歪歪~~~实时数据的交互终成正果~~~

哈哈~~~发帖祝贺~~~

rtdx_第3张图片

 

系统分类: DSP
用户分类: DSP/RTDX
标签: 无标签
来源: 原创
发表评论 阅读全文(250) | 回复(0)

0

本周最热门”中出现,认为够“牛”就投上一票吧!" AutoHide="false">
DSP/BIOS 实现实时数据调试和交换(转帖)

摘要:本文介绍了基于TI公司DSP/BIOS实现实时数据调试和交换的方法

      ----数字信号处理技术已成为目前最广泛的应用技术之一,TI公司在不断推出各种新型高速低功耗DSP的基础上,提出了基于DSP的微型实时操作系统BIOS的概念.


      ----DSP所面临的系统越来越复杂,诸如多任务处理,烦琐的硬件设备管理,实时数据处理及传送等等,传统的DSP编程越来越难以胜任.

      ----TI公司推出的BIOS可以支持以上功能,它提供了众多的模块及面向用户的API接口,包括多优先级多任务系统调度,内存管理,硬件DRIVER抽象,以及数字信号处理所独特的实时数据调试及交换的支持.


      ----先介绍一下BIOS中的图形化管理界面:DSP/BIOS CONFIGURATION TOOLS。在 CCS 集成 开发环境中打开FILE
      -> NEW -> DSP/BIOS CONFIGURATION,就可以看到DSP/CONFIGURATION TOOLS,
      在这里用图形化的界面集中管理所有的BIOS模块,包括硬中断,软中断,任务,时钟,管道等,在每个模块下都可以添加新的对象以及编辑它的属性,添加完对象会在工程中自动生成相应的代码,用户程序中只需声明此对象,然后调用它的API函数就可以了。


      ----下面主要介绍数字信号处理所独特的实时数据调试及交换

      ----在通常的软件调试中如何去观察变量?很简单,我们会单步运行或者设置断点,然后在WATCH窗口中观察变量的值.这种经典的调试方法在数字信号处理中捉荆见拙,因为我们面对的是实时任务,程序的停顿会使我们面对的系统面目全非.DSP/BIOS的解决方案是提供LOG模块,
      在目标DSP内,LOG对象将要监控的信息实时的捕捉存放在DSP的特定缓冲LOG
      BUFFER中,在DSP进入空闲的时刻通过JTAG接口传回主机,主机端的CCS集成环境将接受数据并显示在打开的LOG观察窗口中,从而不打断正常的程序运行情况下,获取必要的调试信息。


      ----下面介绍如何使用LOG模块。在现有的工程中打开DSP/BIOS CONFIGURATION TOOL
      ,在LOG模块上单击右键选择INSERT LOG,然后修改新添加的对象名为 LogTarget. 在程序里添加以下代码
      #include
      #include
      extern far LOG_Obj logTarget; //声明为外部对象
      func()
      {
             LOG_printf( &logTarget, … );
      }

      ----这样就完成了调试数据向主机的传送。在运行代码前,我们打开TOOLS....DSP/BIOS.....MESSAGE
      LOG,在打开的LOG窗口中,单击右键打开PROPERTY PAGE,选择Name为LogTarget. 然后运行
      代码,LOG.printf会将所需的信息打印到打开的LOG窗口中,这样能够在不影响系统运行的时候,观察变量,打印信息了.

      ----另一个重要的用于实时调试的模块是STS,用于提供在程序运行中的各种统计数据,如运行时间,特定的变量等。在DSP中,STS将所要统计的数据放在一组32位的变量,同样在DSP进入IDLE时刻,将数据通过JTAG接口传送给主机中的64位变量进行统计,并清除DSP中的32位变量。


      ----下面介绍一下STS的使用
      ----在工程中打开DSP/CONFIGURATION TOOLS,并在STS模块下添加一个对象stsObj.
      ----在程序里添加以下代码
      #include
      #include
      extern far STS_Obj stsObj;
      //通常有三种使用方法
      //1。统计消耗的时钟数
      func()
      {
          STS_set( &stsObj, CLK_gethtime()); //设置一个起始时刻
          "do algorithm"//运行算法
          STS_delta(&stsObj, CLK_gethtime()); //得到自上一个STS_set到目前的时钟数
      }
      //2。统计变化的变量
      func()
      {
      STS_add( &stsObj, pitch);//将变量pitch在一段循环中的最大值,平均值及总和打印出来
      }
      //3。统计变量改变的差值
      STS_set( &stsObj,targetValue);
      "processing"
      STS_delta(&stsObj,newValue);//将变量改变的差值统计出来

      ----在运行代码前,在CCS中打开TOOLS..DSP/BIOS..STATISTICS VIEW,在打开的STATISTICS窗口
      中,单击右键打开PROPERTY PAGE,选择要显示的STS对象及要观察的统计数据,如平均值, 总数,
      循环次数等.运行代码,所要观察的统计数据会出现在STATISTICS窗口中,这样我们能够在不影响系统运行的时候,获取有关的统计信息了.

      ----上面我们介绍的STS模块提供了灵活的获取统计数据的方法。

      ----下一个我们要提到的重要模块是RTDX(REALTIME DATA EXCHANGE),RTDX提供了实时连续探察
      DSP内部处理的方法,我们可以在DSP全速运行的时候在主机和DSP间进行数据的传输,用户可以在主机用OLE automation
      client分析显示得到的数据.

      ----RTDX包括主机部分和目标部分,目标DSP中程序调用RTDX目标库的API函数通过JTAG接口与主机交换数据,主机端客户程序通过OLE接口调用RTDX
      HOST LIBRARY API与DSP交换数据。

      目标DSP内输出管道的编程可以参照一下流程:

      1)#include
      2)RTDX_CreateOutputChannel(ochan);
      声明一个全局的输出管道
      3) RTDX_enableOutput(&ochan);
      使能一个输出的管道
      4) status = RTDX_write(&ochan, &data, sizeof(data));
      将所要传出的数据data传递到管道
      5)RTDX_disableOutput(&ochan);
      关断管道

      目标DSP内输入管道的编程与此类似
      在主机端可以用VB,VC或者EXCEL编程
      这里介绍一下VC环境下RTDX输入管道编程

      1) 输入RTDX支持库
      #import
      using namespace RTDXINTLib;

      2) 定义一个RTDX对象
      IRtdxExpPtr rtdx;

      3) 初始化COM
      ::CoInitialize(NULL);

      4) 初始化COM对象
      HRESULT hr = rtdx.CreateInstance( L"RTDX" );

      5) 打开一个管道
      status = rtdx.Open("ochan", "R")

      6) 从管道中读数据
      status = rtdx.ReadI4(data)

      7) 关闭管道
      status = rtdx.Close()

      8) 释放COM对象
      rtdx.Release();

      9) 释放COM
      ::CoUninitialize();

      主机端输出管道的编程与此类似.

      ----如果安装有CCS,那么在C:/ti/c6000/examples/rtdx/displays下的RTDX.EXE提供了一个通用的主机端接口程序,运行后,通过菜单配置,可以与DSP端RTDX管道建立连接,将接受的数据显示在表格中.


系统分类: DSP
用户分类: DSP/RTDX
标签: 无标签
来源: 转贴
发表评论 阅读全文(185) | 回复(0)

0

本周最热门”中出现,认为够“牛”就投上一票吧!" AutoHide="false">
TI DSP的仿真模拟(转帖)

TI 主页 > Digital Signal Processing > DSP 设计支持 > 开发开具 > 仿真模拟
TI 提供 XDS510? 和 XDS560? 类仿真器,支持实时基于 JTAG 扫描的仿真并为完整系列的 TI DSP 提供产品支持。这些仿真器与 Code Composer Studio 调试器界面紧密集成,使开发者能够利用 TI 的所有实时仿真控制和可视化功能。TI 第三方提供逻辑分析器、硬件测试设备以及各种仿真器,这些仿真器支持不同的主机输入/输出接口,包括 USB、以太网、PCI、并行端口、PCMCIA 以及 ISA 总线。
JTAG 仿真概览
德州仪器 (TI) 在十多年前发明了基于 JTAG 扫描的仿真,自此以后,该方法一直为嵌入式系统开发广为采纳。与较早且更昂贵的“电路内置仿真”或“ICE”技术相比而言,JTAG 更受开发者的偏爱。电路内置仿真将目标处理器替换为不同的器件,该器件扮演或“仿真”原始器件,但具有附加的引脚使器件上的内部结构(如总线)可见。电路内置仿真具有限制,因为支持 200MHz 以上的高速处理器所需要的成本是让人望而却步的。TI 的 XDS 系列仿真器所使用的 JTAG 仿真技术省去了这些调试成本和困难,方法是直接与处理器进行通信,从而彻底避免专用的仿真器件。标准 JTAG 连接器可让数据以非插入方式在片上和片外移动,而不会中断正在执行的器件。然后,TI 在 DSP 上使用附加的仿真逻辑对此功能进行了补充,旨在提供更高的可视性并提供对寄存器和其它内部功能(如片上高速缓冲存储器)进行访问。
RTDX 和高速 RTDX
直到最近,开发者一直被迫使用断点来停止他们的应用程序以便与主机计算机交换数据“快照”,这种技术称为“停止模式调试”。这种插入式方法会误导开发者,因为中止的高速应用程序的隔离快照不能显示系统的实际操作。
为解决这个问题,TI 开发了 RTDX(实时数据交换),这使设计人员能持续实时看到应用程序的直观视图。RTDX 由 TI 在 1998 年发明,是 DSP 行业第一款具有这种功能的产品。RTDX 使能在目标和主机之间进行实时异步数据交换,而不会停止目标应用程序。本质上,RTDX 数据链路是在 DSP 应用和主机之间提供一个“数据管道”。这种双向能力允许开发者访问应用程序的数据以获取实时直观视图,或者模拟给 DSP 输入数据(可能在实时传感器硬件可用之前)。该功能通过为开发者提供系统操作方式的实际视图来缩短了开发时间。
标准和高速 RTDX
有两种类型的 RTDX。XDS510 类仿真器支持现有形式的 RTDX,它称为“标准”RTDX,能够处理 10KB/s 和更高的数据速率,从而使 CD 音频、超低端电视会议和音频电话成为可能。XDS560 还支持标准 RTDX,将那些速度升高到 130 KB/s,即使高速 RTDX 在处理器上不可用。此外,XDS560 还向启用的处理器的高速 RTDX 提供 2MB/s 以上的带宽。高速 RTDX 带宽为流视频、ADSL 和硬磁盘驱动器等应用提供支持。这为正在运行的应用程序提供了史无前例的实时直观视图。

系统分类: DSP
用户分类: DSP/RTDX
标签: 无标签
来源: 转贴
发表评论 阅读全文(196) | 回复(0)

0

本周最热门”中出现,认为够“牛”就投上一票吧!" AutoHide="false">
RTDX在图像处理中的应用(转帖)
1 引言

在数字信号处理系统开发过程中,通常要对算法的正确性进行验证,也就是程序调试。而传统的主机调试器必须通过在目标应用程序中插入断点,在中断目标应用程序运行时观测目标机上各寄存器或内存变量的值。但是,由于处理系统是实时的,因此,这种经典的方法不能实时地跟踪数据的变化,有时显示的数据根本就是错误的。这种方法的不足在笔者的图像处理系统中表现得更为突出。且不说它不能实时反映数据处理的结果,即使可以实时反映,在用memoryview方法来观测图像处理的结果时也只是各内存单元的值,因而非常不直观,为故障诊断和系统性能测评等带来许多不便,所以,必须寻找一种方法来实时跟踪数据变化,而且数据还应以非常直观的形式显示在主机屏幕上。

TI的Real-Time Data Ex-change(RTDX)技术就是利用DSPs的内部仿真逻辑和JTAG接口来实现主机与目标机之间的数据交换,它不占用DSPs的系统总线和串口等I/0资源,数据传送完全可以在应用程序的后台运行,对应用程序影响很小,它完全可以在不中断目标应用程序的前提下,向主机实时发送目标机上各寄存器或内存变量的值。而主机上的可视化应用程序也可以通过嵌入COM的APl函数来获得这些数据,并以适当的格式把数据显示出来(如表格、波形图或二维图像等形式)。这样,就可以实时观测和分析应用程序的运行情况,使得编程人员查找和修改应用程序的错误更加方便,从而缩短系统的设计开发周期。

笔者在设计图像目标识别系统时,把摄像头信号通过视频采集卡进行采样和量化,并存放在处理机系统的外部存储器中。为了获得目标在图像中的位置,设计时必须对采样的数据进行识别算法处理。因为笔者处理的是连续图像帧序列,因而不能在中断程序运行的情况下观测处理结果,而且无法通过只看相应memo~的值来判断跟踪窗是否能跟上运动的目标,所以,笔者采用了RTDX技术。

2 RTDX的原理

RTDX是一种可以在不影响目标应用程序运行的情况下让主机和目标机进行实时数据传输的技术。RTDX支持双向数据流,即目标机到主机的数据流和主机到目标机的数据流。RTDX数据流示意图如图1所示。

rtdx_第4张图片


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主机函数库缓存,它一般应用在实时情况下。

    rtdx_第5张图片


    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;countwhile(!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;ifor(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不但可以用在软件调试过程中,而且可用于医疗监测、工业控制等领域。

  •  
    系统分类: DSP
    用户分类: DSP/RTDX
    标签: 无标签
    来源: 转贴
    发表评论 阅读全文(162) | 回复(0)

    0

    本周最热门”中出现,认为够“牛”就投上一票吧!" AutoHide="false">
    用RTDX实现数据的实时双向传输(转帖)

       要:讲述实时数据传输(RTDX)的使用,描述一个用RTDX双向传递大量多媒体数据的实现方法。该方法可以方便的应用于其他TI DSP的系统设计中。

    关键词:TI DSP;RTDX

    引言

    TI DSP在数字电路中作为信号处理、电路控制的核心设备,广泛应用于各个行业。在TI DSP系统设计阶段,实时数据交换(RTDX)提供了一种目标板和主机之间的双向实时数据传输的方法。它可以应用于大量数据的双向传输,例如应用在多媒体数据进行仿真处理中。但是由于它的实现难度较大以及不处于系统设计的核心位置,所以没有得到广泛使用。本文的目的是向读者描述一种RTDX的具体实现。

     

    RTDX的使用方法

    RTDX提供了目标板与主机之间的实时数据通信。当系统使用该功能时,DSP上驻留一个小的RTDX片上软件库,片上程序通过调用这个软件库的API实现JTAG与主机之间的数据传输。与DSP目标板相连的主机上也存在一个相应的RTDX主机端软件库,客户编写的主机端程序通过对象嵌入,实现DSP目标板的实时数据分析,以及向目标板提供新的数据。

           在编写DSP的软件上,RTDX的使用方式和C语言文件的IO操作非常相似,如图12所示,在实现数据由DSP到主机的过程中,首先声明一个RTDX输出通道,然后对该通道进行操作,最后查询状态,看数据是否被发送出去;而从主机端到DSP端的数据传输过程中,则声明一个RTDX输入通道,然后读取该通道上的数据。

    在主机端,TI 提供的RTDX库使用了微软公司的COM技术,数据的传输过程分别如图3、图4所示。

     

    RTDX实现多媒体数据的

    双向传输

           多媒体数据原始信息往往拥有极大的数据量,DSP在多媒体数据处理中的应用主要是压缩和解压缩,但由于DSP自身的限制,它没有大量的空间存储多媒体数据,即便这些数据是已经被压缩过的。在系统的调试阶段,如何单独测试DSP的编码效率呢?一种可行的解决办法就是借用DSP目标板相连的主机空间,用RTDX把原始数据传递给DSP,DSP对数据处理后再通过RTDX传回主机。

     

    系统的整体构架

    由于DSP片上存储空间有限, TIRTDX一次在主机和目标DSP之间传输的数据长度做了限制,此值不应该超过253个字长为16bit的数据,如果一次传输的数据量超过253,则要对数据分片传递。本应用中每次传递的数据远远大于253,所以主机端和目标板都定义了分片长度RTDXBLOCK,RTDXBLOCK=200。传输时两边同时进行相反的工作,目标板写数据的时候主机等着读数据,主机写数据的时候目标板进行相反的操作。每传输RTDXBLOCK大小的数据,两者的工作进行交换。分段传递数据还带来了很多好处,它可以方便主机与目标板之间的同步,每次数据的发出也是对上一次收到数据的应答;RTDX的特性是读一个字节,写一个字节,读写采用相同大小段节省了将近一半的时间;inbufferoutbuffer可以指向相同的地址,又节省了一些内存。

    采用相同大小的段传输数据还有一些细节问题要考虑,目标板的第一次操作是否应该先是写出?以便空出地方来接收下一次被处理的数据。由于每次传输数据总量的不对称性,大部分情况下是输入的数据比输出的数据多,目标板先写出数据会多占用一次传输的时间。另一个问题就是数据总量的不对称性,总是主机或目标板先写完数据,只剩下某一种操作,这部分时间没有办法节省。

    对于数据传递过程中可能传送的一些命令字如,跳过当前帧、程序终止等。做了这样的考虑,由主机和目标板主程序来填写和解释这些命令字,命令字不单独传输,本应用中放在inbuffer/outbuffer的第0个位置,与下一块数据同时传送。另外,本应用中inbufferoutbuffer的第1个位置存放的是数据段的实际长度,常用于向主机端指示压缩后数据的实际长度,以便用于不定长压缩方式的数据输出。inbuffer/outbuffer的实际数据的起始位置是可以根据应用自定义的。传输程序不负责这些问题,只管从buffer的第一个字节开始传输数据。

    软件的整体构架如图6所示。

    软件设计

    DSP片上实现了一次数据输入输出的函数dataIO,它采用C语言编写,返回值1表示运行过程均正常。有4个参数,分别是输出Buffer起始位置,输出Buffer的大小,输入Buffer的起始位置,输入Buffer的大小。使用时,在主函数中使用两个RTDX宏声明:RTDX_CreateOutput Channel(ochan),RTDX_CreateInput Channel(ichan),然后可以直接调用dataIO进行数据传输,dataIO会在第一次运行中自动初始化环境。如图7所示。dataIO函数经过简单的修改甚至不修改即可以适用于不同的环境。

    主机端的RTDX过程使用C++实现,因为程序的主要目的就是向目标板传递数据和取得数据,所以直接在主程序中作了一个大的循环,同目标板一样用了4个参数:inbuffer,outbuffer,inbufferlength,outbufferleng。执行时,主程序首先被阻塞,不停的试图从目标板读取经过压缩的数据,直到目标板DSP把压缩好的数据放到输出通道上。得到数据后,主程序把这些数据存放在本地文件中,然后把要压缩的数据写到输入通道上传递给DSP。这样反复执行直到传输双方中的一方表示传输终止。

    执行过程

    首先把程序写入目标板DSP中,然后在DSP集成开发环境CCStools菜单中选择RTDX,启用输入通道和输出通道。先后运行DSP程序和主机端程序即可实现数据的双向传输。因为两边都使用了阻塞机制,所以程序运行的先后顺序无所谓。

     

    结语

    本应用实现了如下功能:主机端把44.1KHz,16bit采样的音频数据传递到DSP内存中,每次传递1152个数据。DSP对这些数据进行Mp3格式的压缩,压缩后的数据长度不确定,最后DSP把这些数据传回主机端,然后等待下一次传输开始。实现基于DSK5416,用CCS2.0作为DSP综合开发环境。主机端程序用MS VC6.0编译。

    这种RTDX的实现方法用于2003年德州仪器公司数字信号处理大学挑战赛决赛项目“使用TMS320C547X实现多媒体数据在TCP/IP网络传输”的设计中,该项目最终获得大赛三等奖。

     

    参考文献:

    1. 彭启琮,TMS320C54x 实用教程’ ,电子科技大学出版社,1999

    2. 张雄伟、陈亮、徐光辉,‘DSP集成开发与应用实例’,电子工业出版社,2002

     

     

    RTDX_CreateOutputChannel( ochan );              //创建一个输出通道,该操作为宏操作

    ...   

    TARGET_INITIALIZE();

    RTDX_enableOutput( &ochan );                //初始化目标板以及通道使能

    ...

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

    //发送outp指针所指数据到输出通道,数据长度由RTDXBLOCK指定,返回实际发送的数据长度*

    *:数据长度指类型为发送数据类型转换为16位无符号所占长度,outp的数据类型也应为16位无符号数。

    1  目标板向主机输出数据

     

    RTDX_CreateInputChannel( ochan );           //创建一个输入通道,该操作为宏操作

    ...   

    TARGET_INITIALIZE();

    RTDX_enableInput( &ochan );                     //初始化目标板以及通道使能

    ...

    status = RTDX_read( &ichan, inp, RTDXBLOCK )

    //发送inp指针所指数据到输出通道,数据长度由RTDXBLOCK指定,返回实际接收的数据长度*

    *:数据长度指类型为发送数据类型转换为16位无符号所占长度,inp的数据类型也应为16位无符号数。

    2   目标板从主机端获取数据

     

     

    hr = rtdx_in.CreateInstance( __uuidof(RTDXINTLib::RtdxExp) ); //创建rtdx实例

    status = rtdx_in->Open( "ichan", "W" );              //创建ichan ,以便向目标板输入数据*

    status = rtdx_in->Write( sa, &bufferstate);       //把安全数组sa**中的数据写入目标板

    status = rtdx_in->Close();    //关闭输入通道

    *:读写状态标志"W"应该大写,否则会带来不可预知的错误。

    **:在写入数据时,应该把要写入的数据放在一个安全数组中。然后调用Write

    3  主机端向目标板传输数据

     

    hr = rtdx_out.CreateInstance( __uuidof(RTDXINTLib::RtdxExp) ); //创建rtdx实例

    status = rtdx_out->Open( "ochan", "R" );       //创建ochan ,以便从目标板获取数据

    status = rtdx_out->ReadSAI2( &sb );              //把目标板上的数据写入安全数组sb*,**

    status = rtdx_out->Close();  //关闭输出通道

    *:从目标板读取的数据首先被放在安全数组中,然后由使用者读出。

    **:可以根据目标板的数据格式,通过调用ReadSAI1,ReadSAI2,ReadSAI4,读取所占字节数不同的数据。例如读取占用48位字节的word类型数据,应该使用ReadSAI4

    4  主机端从目标板获取数据

     

    > 5  输入输出Buffer的数据格式

     

    rtdx_第6张图片

    > 6  主机端与目标板的数据传输过程图

     

    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();/*进行数据处理*/

           }

    }

     

    系统分类: DSP
    用户分类: DSP/RTDX
    标签: 无标签
    来源: 转贴
    发表评论 阅读全文(142) | 回复(0)

    0

    本周最热门”中出现,认为够“牛”就投上一票吧!" AutoHide="false">
    在目标应用程序中使用RTDX进行实时数据交换(转帖)

    http://topic.csdn.net/u/20070127/16/a5fd24b2-76e6-49d3-a39d-a853084d3ce3.html

    1、在目标应用程序中使用RTDX发送数据
    RTDX提供了实时、连续了解目标系统程序运行情况的手段,它允许用户在不干扰目标系统程序运行的情况下,在主机和目标系统之间传输数据。可以这么认为,RTDX提供了一个目标应用程序与主机客户程序之间的双向数据管道。
    目标系统与主机之间的RTDX实际上仍然是通过JTAG接口完成的。目标系统中的RTDX目标库和位于CCS中的RTDX主机库之间实时交换数据。RTDX目标库向目标应用程序提供用户接口,目标应用程序可以通过此接口发送和接受程序。RTDX主机库提供COM接口,主机客户成熟通过COM接口发送和接收数据。RTDX主机库孩可以将数据保存在日志文件中,供非实时数据分析使用。
    目标应用程序通过调用RTDX目标库中的函数发送数据。这些数据实际撒航只是放在RTDX目标库的缓冲去中,然后函数立即返回。RTDX目标库在处理器空闲时将本地缓冲区中的数据发送出去,这样不干扰应用程序的正常运行。根据设定的主机记录模式,主机将数据放到缓冲区或者记录到日志文件中。RTDX主机库对外提供COM接口,可以认为是COM服务器,主机客户程序通过COM接口获取数据,并根据需要分析和显示数据。
    在CCS中打开工程文件ti/tutorial/sim64xx/sect_1/less_1/s1l1.pjt,然后在一个源程序对话框中打开S1L1.c源文件。为了使用RTDX,需要对此源文件进行一定的修改。
    可以看到,目标应用程序发送数据的步骤主要包括:声明发送通道、初始化RTDX目标库、使能发送通道、发送数据、关闭通道。修改完成后,编译连接程序,得到s1l1.out文件,加载程序到目标系统。选择“Tool” |“RTDX” |“Configuration Control”命令,打开“RtdxConfig”对话框。然后按快捷键F5运行程序,可以在ccs标准输出对话框见到程序最后调用puts()函数的输出信息“Program Complete!”。此时数据应该发送到Rtdx主机库中。现在需要一个COM客户程序通过COM接口读出这个数据,CCS提供了一个工具,位于ti/tutorial/sim64xx/sect_1/less_1目录下。打开一个命令提示符对话框,改变目录到ti/tutorial/sim64xx/sect_1/less_1,运行程序s1l1.exe,程序输出。 

    2、在目标应用程序中使用RTDX接收数据
    在CCS中打开工程文件ti/tutorial/sim64xx/sect_1/less_3/s1l3.pjt,同时在一个源程序对话框打开s1l3.c文件。此源文件需要一定的修改,才能完成接受一个整数的工作。
    可以看到,接收数据的过程与发送数据的过程基本类似,只不过使用输入通道,用目标库提供的RTDX_read()函数读取数据。编译连接运行程序,然后打开一个命令行对话框,并在其中运行程序ti/tutorial/sim64xx/sect_1/less_3/s1l3.exe。在CCS的标准输出对话框中可以看到目标应用程序的输出“Value 5 was received from the host”,表示已经从主机客户接收到数据。
    3、建立DSP/BIOS的配置文件
    当DSP/BIOS的基本设置完成后,可以将修改后的配置以volume.cdb名字保存。配置文件编辑工具还将自动生成volumecfg.h,volumecfg.cmd,volumecfg等DSP/BIOS应用程序所需要的系统文件。
    4、用DSP/BIOS工具创建应用程序
    使用DSP/BIOS工具开发DSP应用程序与不使用DSP/BIOS工具基本一致。首先在“Project”菜单中选择“New”或“Open”,新建或打开一个工作文件。然后将需要的.h、.asm、.c、.obj、.lib(这时不需要添加C语言标准库如rts.lib)添加到该工程文件中。还需要将DSP/BIOS的配置文件.cdb添加到工程到工程文件中。注意:LNK使用的.cmd文件有DSP/BIOS配置文件自动产生,所以应该添加DSP/BIOS配置工具自动生成的.cmd文件。

    系统分类: DSP
    用户分类: DSP/RTDX
    标签: 无标签
    来源: 转贴
    发表评论 阅读全文(251) | 回复(0)
    总共 9, 当前 1/1

    你可能感兴趣的:(rtdx)