本文结合具体例证,介绍基于MATLAB 的DSP 应用程序调试方法。
MATLAB 具有强大的分析、计算和可视化功能,利用MATLAB 提供的数十个专业工具箱,可以方便、灵活地实现对自动控制、信号处理、通信系统等的算法分析和仿真,是算法设计人员和工程技术人员必不可少的软件工具。
数字信号处理器(DSP)作为一种可编程专用芯片,是数字信号处理理论实用化过程的重要技术工具,在语音处理、图像处理等技术领域得到了广泛的应用。但对于算法设计人员来讲,利用汇编语言或C 语言进行DSP 功能开发,对于具有周期长、效率低的缺点,不利于算法验证和产品的快速开发。
由MathWorks 公司和TI 公司联合开发的MATLAB Link for CCS Development Tools(简称CCSLink)是MATLAB6.5 版本(Release13)中增加的一个全新的工具箱,它提供了MATLAB、CCS 和DSP 目标板的接口,利用此工具可以像操作MATLAB变量一样来操作DSP 器件的存储器和寄存器,使开发人员在MATLAB 环境下完成对DSP 的操作,从而极大地提高DSP 应用系统的开发进程。
1 CCSLink 初步
CCSLink 工具通过双向连接将MATLAB、CCS 和DSP 目标板联系起来,允许开发者利用MATLAB 强大的可视化、数据处理和分析函数对来自CCS 的数据进行分析和处理,极大地简化TI 公司DSP 软件的分析、调试和验证过程。三者关系如图1示。
图1 CCSLink连接关系
CCSLink 的主要特点为:在MATLAB 环境下完成对DSP器件的调试、数据传递和验证;在MATLAB 和DSP 之间实现数据实时传递;支持XDS510 和XDS560 仿真器;提供嵌入式对象,可以访问C/C++变量;扩展了MATLAB 和eXpressDSP工具调试能力。
MATLAB 6.5 版集成了CCSLink1.0 工具,支持CCS 能识别的所有板卡及硬件DSP,包括TIC2000、C5000、C6000 DSP及EVM 板、DSK 板、simulator 及任何符合标准的用户板和第三方板。CCSLink 正常工作除了需要MATLAB 及其信号处理工具箱外,还需要TI 的编译器(compiler)、汇编器(assembler)、链接器(linker)、CCS IDE2.1、CCS 配置工具信其他软件工具。
在MATLAB 环境下输入命令
help ccslink
若CCSLink 已正确安装,则会显示产品信息及进行CCS 和RTDX 操作的函数列表:
MATLAB Link for Code Composer Studio(tm)
Version 1.0 (R13) 28-Jun-2002。
若MATLAB 不能返回信息,则表明CCSLink 未安装成功,需进行重新安装。
2 CCSLink 对象的建立
在对DSP 进行操作之前,应该首先建立一个DSP 目标。对于配置了多DSP 系统的用户,CCSLink 提供了两种选择DSP目标的工具:ccsboardinfo 函数和boardprosel 图形用户界面,用户可以根据返回值和自己需求选择相应的对象。以采用图形用户界面为例,若配置有XDS510 Emulator 和C5416 Simulator 二种DSP 系统,运行[boardNum,procNum] = boardprocsel,则MATLAB 通过对CCS 配置的自动检测,出现图2 所示的目标选择界面。本文根据需要选择硬件仿真器C54xxXDS510Emulator
并点击Done,则可返回板卡编号和处理器编号:
boardNum=1,procNum=0。
图2 CCSLink对象选择
利用ccsdsp 函数可以确立一个DSP 对象。ccsdsp 以板卡编号和处理器编号为参数,并在建立链接对象后返回其它属性,如处理器型号、处理器名称等。例如,运行cc=ccsdsp('boardnum',boardNum, 'procnum', procNum),则建立起一个CCS IDE 对象的句柄cc。从而可以通过cc,在MATLAB 下实现对CCS 的操作并控制DSP 芯片。
3 CCSLink 调试DSP 代码实例
建立起MATLAB 链接之后,就可以通过CCS 为DSP 目标产生可执行代码,并进行编译、调试和分析。在以下的介绍中,均以MATLAB 自带的工程文件为例。
3.1 加载DSP 目标板
在MATLAB 环境执行以下代码:
projfile = fullfile( matlabroot, 'toolbox', 'ccslink', 'ccsdemos', 'ccstutorial','ccstut_54xx.pjt')%选择工程文件
projpath = fileparts(projfile) %指定工程文件路径
open(cc,projfile)%打开工程文件
visible(cc,1)%使CCS IDE 前台可见
cd(cc,projpath)%改变MATLAB 工作路径
build(cc,'all',60)%编译工程
load(cc,'ccstut_54xx.out',30)%加载可执行文件
则如代码注释所示,在MATLAB 环境下完成了对工程文件的调入、编译,生成可执行文件并将其加载到DSP 目标板。利用鼠标操作切换到CCS 界面,可以看到在MATLAB 下已经完成了对CCS 的各种操作过程,如图3 所示。
图3 CCSLink调试DSP代码实例
3.2 利用CCSLink 连接调试访问DSP 内存
在编译并加载.out 文件后,可以直接由CCSLink 读取目标符号表并获取变量在DSP 内存中的地址。如输入ddatA =dec2hex(address(cc,'ddat')),将返回变量ddat 的地址和所在页:
23AC,0000。
在MATLAB 中,可以控制CCS IDE 中程序的显示及断点的增加和删除,并控制程序代码的执行和暂停,读写DSP 的内存变量。例如,执行以下程序:
open(cc,'ccstut.c','text')%在CCS 中打开ccstut.c 文件
open(cc,'ccstut_54xx.cmd','text')%在CCS 中打开ccstut_54xx.cmd 文件
activate(cc,'ccstut.c','text')%将ccstut.c 作为当前的活动文件
insert(cc,'ccstut.c',64)%在第64 行加入断点
halt(cc)%暂停CPU
restart(cc) %继续与CCS 保持联系
run(cc,'runtohalt',20)%DSP 程序执行到断点
ddatV = read(cc,address(cc,'ddat'),'single',4) %(1)读取C 代码初始化数据ddat
idatV = read(cc,address(cc,'idat'),'int16',4) %(2)读取C代码初始化数据idat
write(cc,address(cc,'ddat'),single([pi, 12.3, exp(-1), sin(pi/4)])) % (3)修改DSP 内存中的数据ddat
write(cc,address(cc,'idat'),int16([1:4]))% (4)修改DSP 内存中的数据idat
run(cc,'runtohalt',20) %从断点处继续执行
ddatV = read(cc,address(cc,'ddat'),'single',4)% (5)读取修改后的数据ddat
idatV = read(cc,address(cc,'idat'),'int16',4) %(6)读取修改后的数据idat
阅读本例工程文件可知,在C 代码中,变量初始化值为ddat=[16.3,-2.13,5.1,11.8],idat=[1,508,647,7000]。执行上述(1)、(2)两语句,在MATLAB 中获得了这两个变量的值ddatV 和idatV。经过(3)、(4)两语句的修改,ddat 和idat 分别改为了新值ddat=[3.1416,12.3,0.3679,0.7071]和idat=[1,2,3,4]。这一修改,可从(5)、(6)两语句的执行在MATLAB 中得到验证,同时也可在CCS IDE 下通过变量观测器进行证实。
在MATLAB 下,同样可以通过regread 和regwrite 来对CPU寄存器进行读写操作。如
tReg = regread(cc,'AL','2scomp') % 按二进制补码方式读取AL
regread(cc,'TRN','binary') % 按无符号二进制数读取TRN
regwrite(cc,'AH','FFFF','binary') % 按无符号二进制数读写AH
3.3 利用CCSLink 嵌入式对象调试访问DSP 内存
利用MATLAB 的面向对象编程技术和CSLink,可以为目标程序中的所有C 符号创建嵌入式对象,并通过对象来操作该C 符号。
仍以上述程序为例,首先复位DSP,并创建一个嵌入式对象:
restart(cc) % 复位程序,使PC 指向程序入口处
goto(cc,'main') %将PC 定位到C 主程序入口
cvar = createobj(cc,'idat') %(7)为操作嵌入式对象idat 创建MATLAB 对象
cvar
语句(7)创建了指向DSP 中C 符号的MATLAB 对象,从而可以在MATLAB 环境下实现对其全部或部分读取和修改。
read(cvar)%(8)将嵌入式数组读入到MATLAB 工作空间
read(cvar,2)%只读取第2 个元素
write(cvar,4,7001)%(9)将第4 个元素修改为7001
set(cvar,'size',[2])%(10)将对象减小到2 个元素
语句(8)将指向idat 的嵌入式数组cvar 读入MATLAB,在语句(9)中对其第4 个元素进行了修改,而在语句(10)中对数组的大小进行了改变。
通过CCSLink,不仅可以为数组变量创建对象,而且也可以为结构体变量创建对象并进行相应的操作,如:
cvar = createobj(cc,'myStruct')%创建指向C 结构体的MATLAB 对象
write(cvar,'iz', 'Simulink') %修改结构体的字符串iz 域为Simulink
cstring = getmember(cvar,'iz')%读取该域到MATLAB
write(cstring,1,'s')%该写字符串的首字符
readnumeric(cstring)%按数值方式读取字符串
上述5 条语句,均通过MATLAB 环境下的对象cvar,实现了对DSP 的C 语言程序中结构体变量myStruct 的读写操作和修改,具有很大的方便性。
通过CCSlink,无论对CCS IDE 建立了连接对象还是嵌入式对象,均可在MATLAB 环境下进行操作,达到了DSP 内部各种变量的读写和修改,并进行相关的调试过程,具有很大的方便性。对于上述示例所有的操作执行结果,均可以在MATLAB和CCS IDE 环境下进行观测和验证。
4 结束语
本文简要讨论了基于MATLAB 的DSP 程序调试方法,描述了CCSLink 与CCS IDE 的基本概念,介绍了建立CCS 对象的过程,并以MATLAB 提供的实际工程文件为例,演示了利用CCSLink 连接和嵌入式对象进行C 变量操作的实际过程,并对其执行过程和结果进行了简要解释。
应该说明的是,MATLAB提供了大量的进行DSP程序调试的函数,本文只涉及到了其中极少的一部分。要充分利用MATLAB的强大功能进行更深层次的DSP程序调试,应进一步参考MathWorks公司提供的技术资料MATLAB Link for Code Composer Studio Development Tools。