用DSP/BIOS和RTDX技术实现I/O
1.1 打开和查看工程
在CCS中打开工程文件并查看它包含的源程序及库文件。
1. 如果你把CCS安装在c:\ti 目录,可以创建一个新目录c:\ti\myproject;如果CCS安装在其他目录,则可在相应的位置建立myproject 目录。
2. 将c:\ti\c5400\tutorial\hostio1下的所有文件拷贝到新目录下。
3. 从Windows开始菜单中,选择Program→Code Composer Studio ’C5400→CCStudio。
4. 选择Project→Open并打开hostio.mak。
5. 依次点击Project、HOSTIO.MAK、Source旁的’+’,可以看到工程文件中包含的各种文件。hostiocfg.cmd及include中的头文件是在保存配置文件时创建的。本例程需要的文件有:
o hostio.c 主程序
o signalprog.exe VB应用程序,它产生正弦波并显示输入/输出信号
o slider.exe VB应用程序,它控制输出信号幅度
o hostiocfg.cmd 连接命令文件,它仅增加了名为trace的LOG对象
o hostiocfg.s54 汇编源文件
o hostiocfg.h54 头文件
1.2 查看源程序
本章中的例子模拟一个能数字化音频信号、调整音量、产生幅度可调的模拟输出的DSP应用程序。
为简单起见,该例没有使用收、发模拟信号的设备,而是使用主机产生的数字信号测试算法。数据的输入/输出及音量控制信号是采用RTDX在主机和目标板之间传送的。
在主机上运行的VB应用程序使用RTDX产生输入信号并显示输入/输出信号,该程序允许开发者不中止程序运行即进行算法测试。
1. 双击Project View中的hostio.c源程序。
2. 注意源程序的下述方面:
o 三个RTDX通道声明为全局的。第一个输入通道控制音量,第二个输入通道接收主机发送来的信号,输出通道用于从目标板向主机发送的输出信号。(是站在目标板应用程序的角度来称输入和输出信道的,即:输入信道从主机接收数据,输出信道向主机发送数据。)
o 当通道当前不是处于等待输入状态时,调用RTDX_channelBusy函数将返回FALSE,它表明数据已到达可供读取。如第六章所述,调用RTDX_readNB无需等待接收数据就可返回DSP应用程序。主机将数据异步写入控制通道。
o RTDX_Poll用于RTDX下层应用之间的数据读/写的。
o 如果输入通道是使能的,RTDX_read将等待数据的到来。
o 如果输出通道是使能的,RTDX_write将缓冲区的数据写入到输出的RTDX通道中。
o 当目标板通过调用RTDX_enableInput使控制通道control_channel处于使能状态时,则该例程中的其他RTDX通道将处于非使能状态。而下一节描述的主机程序将使能这些通道。使用control_channel的滑动控制被视为应用程序的有机组成部分,在目标程序中使能该通道会使人们在应用程序运行时亦清楚该通道是处于使能状态的;而A2D通道和D2A通道是用于算法测试的。所以这些通道是通过主机应用程序设定为使能状态或非使能状态的。
#include <std.h>
#include <log.h>
#include <rtdx.h>
#include "target.h"
#define BUFSIZE 64
#define MINVOLUME 1
typedef Int sample; /* representation of a data sample from A2D */
/* Global declarations */
sample inp_buffer[ BUFSIZE];
sample out_buffer[ BUFSIZE];
Int volume = MINVOLUME; /* the scaling factor for volume control */
/* RTDX channels */
RTDX_CreateInputChannel(control_channel);
RTDX_CreateInputChannel(A2D_channel);
RTDX_CreateOutputChannel(D2A_channel);
/* Objects created by the Configuration Tool */
extern LOG_Obj trace;
/*
* ======== main ========
*/
Void main()
{
sample *input = inp_buffer;
sample *output = out_buffer;
Uns size = BUFSIZE;
TARGET_INITIALIZE(); /* Enable RTDX interrupt */
LOG_printf(&trace,"hostio example started");
/* enable volume control input channel */
RTDX_enableInput(&control_channel);
Connecting to I/O Devices while (TRUE) {
/* Read a new volume when the hosts send it */
if (!RTDX_channelBusy(&control_channel)){
RTDX_readNB(&control_channel, &volume, sizeof(volume));
}
while (!RTDX_isInputEnabled(&A2D_channel)){
RTDX_Poll(); /* poll comm channel for input */
}
/*
* A2D: get digitized input (get signal from the host through
* RTDX). If A2D_channel is enabled, read data from the host.
*/
RTDX_read(&A2D_channel, input, size*sizeof(sample));
/*
* Vector Scale: Scale the input signal by the volume factor to
* produce the output signal.
*/
while(size--){
*output++ = *input++ * volume;
}
size = BUFSIZE;
input = inp_buffer;
output = out_buffer;
/*
* D2A: produce analog output (send signal to the host through
* RTDX). If D2A_channel is enabled, write data to the host.
*/
RTDX_write(&D2A_channel, output, size*sizeof(sample));
while(RTDX_writing){
RTDX_Poll(); /* poll comm channel for output */
}
}
}
1.3 Signalprog应用程序
VB编制的应用程序signalprog.exe的源程序可用于文件signalfrm.frm。有关该应用程序的详细说明可见文件signalprog.pdf。可查看几个对该例而言很重要的例程和函数:
o Test_ON。点击Test_ON按钮时运行该例程。首先,它为输入通道和输出通道创建RTDX接口实例;接着,它打开输入/输出通道并使它们处于使能状态。该例程同时清除图形并启动Transmit_Signal和Receive_Signal的定时器。VB源程序中的全局变量声明把VB应用程序中的通道和hostio.c应用程序中相应通道联系到一起,如下:
' Channel name constants
Const READ_CHANNEL = "D2A_channel"
Const WRITE_CHANNEL = "A2D_channel"
o Test_OFF 该例程废止、关闭和释放Test_ON例程创建的RTDX对象,并使定时器处于非使能状态。
o Transmit_Signal首先,该函数产生正弦波信号并把正弦信号显示在Transmitted Signal图中;然后,它试图使用‘写’方式将数据传送到目标板。
o Receive_Signal 该函数使用ReadSAI2方式从目标板读取数据,并将信号显示在Received Signal图中。
o tmr_MethodDispatch_Timer 该例程调用Transmit_Signal和Receive_Signal函数,该例程在定时器被Test_On例程使能后每隔1ms被调用一次。
1.4 运行应用程序
1. 点击工具栏按钮或选择Project→Build。
2. 选择File→Load Program并双击hostio.out。
3. 选择Tools→RTDX。
4. 选择窗口中RTDX区域的Configure,在RTDX属性对话框的General Settings中选择Continuous RTDX模式并点击OK。
5. 将RTDX域的RTDX Disable改为RTDX Enable,此时按钮Configure变为Diagnostics。
6. 选择Tools→DSP/BIOS→Message Log。在Message Log区域点击鼠标右键并从弹出菜单中选择Property Page,选择名为trace的Log对象并点击OK。
7. 点击工具栏按钮或选择Debug→Run。
8. 使用Windows浏览器,运行signalprog.exe和slider.exe,你可以看到两个VB应用程序。
由于slider.exe应用程序将创建和打开RTDX控制通道,因此它必须在RTDX使能以后运行,否则它不能打开控制通道。Signalprog应用程序只有在点击Test On按钮后才使用到RTDX,因此它可以在任何时候运行。
9. 调整signalprog窗口高度。
10.
在signalprog窗口中的点击Test ON,这就启动了输入/输出通道。
11. 滑动Volume Slider窗口的控制钮,这将改变输出信号幅度,观察Received Signal图中信号幅度的变化。
注:Volume Slider初始化设置
Volume Slider的初始化设置与其应用程序的运行不是同步进行的,它们在滑动条第一次移动时同步。
12. 关闭Volume Slider应用程序,这将废止输入/输出通道。
13. 点击signalprog窗口中的Test OFF,这将关闭控制通道。
14. 点击工具栏按钮或按Shift+F5中止运行。
15. 现在你可在Massage Log窗口中看到调用LOG_prinft产生的信息“hostio example started”。由于整个程序的运行都是在主函数中进行的,因此你不能更早地看到上述信息。DSP/BIOS和主机在DSP处于idle状态时才进行通信联系。直到应用程序从主函数中返回,DSP才会处于idle状态。所以,如果你想看到运行中DSP/BIOS的影响,你的程序应当在从主函数返回后执行DSP/BIOS的函数。下一节所用的hostio.c的修改版会说明该技术。
1.5 使用HST和PIP模块修改源程序
现在用DSP/BIOS提供的HST和PIP修改该实例。修改后的程序仍能实时测试DSP算法。这次测试数据来自一个主机文件,而不是前述的正弦信号。
HST模块为执行数据I/O提供了与外设接口更直接的通道。HST模块使用PIP模块实现主机I/O。一旦I/O设备和ISRs已经做好测试准备,就可使用PIP模块的API,这只需对源程序稍加修改即可。
1. 将目录c:\ti\c5400\tutorial\hostio2中的下述文件拷贝到你的工作文件夹下。(不要全部拷贝,特别不能拷贝hostio.cdb文件)。
o hostio.c 已经修改过的源程序,它使用DSP/BIOS API的HST和PIP模块代替RTDX传送输入/输出信号。
o input.dat 该文件包含输入数据
|