《基于MATLAB_的DSP_调试方法精品资料.doc》由会员分享,可在线阅读,更多相关《基于MATLAB_的DSP_调试方法精品资料.doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于MATLAB 的DSP 调试方法时间:2009-06-02 来源: 作者:刘瑞华 潘建军 点击:755 字体大小:【大 中 小】 MATLAB 具有强大的分析、计算和可视化功能,利用MATLAB 提供的数十个专业工具箱,可以方便、灵活地实现对自动控制、信号处理、通信系统等的算法分析和仿真,是算法设计人员和工程技术人员必不可少的软件工具。 数字信号处理器(DSP)作为一种可编程专用芯片,是数字信号处理理论实用化过程的重要技术工具,在语音处理、图像处理等技术领域得到了广泛的应用。但对于算法设计人员来讲,利用汇编语言或C 语言进行DSP 功能开发,对于具有周期长、效率低的缺点,不利于算法验证和产
2、品的快速开发。 由MathWorks 公司和TI 公司联合开发的MATLAB Link for CCS Development Tools(简称CCSLink)是MATLAB6.5 版本(Release13)中增加的一个全新的工具箱,它提供了MATLAB、CCS 和DSP 目标板的接口,利用此工具可以像操作MATLAB变量一样来操作DSP 器件的存储器和寄存器,使开发人员在MATLAB 环境下完成对DSP 的操作,从而极大地提高DSP 应用系统的开发进程。 本文结合具体例证,介绍基于MATLAB 的DSP 应用程序调试方法。1 CCSLink 初步 CCSLink 工具通过双向连接将MATLA
3、B、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 能识别的所有
4、板卡及硬件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)Versio
5、n 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,则MA
6、TLAB 通过对CCS 配置的自动检测,出现图2 所示的目标选择界面。本文根据需要选择硬件仿真器C54xxXDS510Emulator 并点击Done,则可返回板卡编号和处理器编号:boardNum=1,procNum=0。 图2 CCSLink对象选择 利用ccsdsp 函数可以确立一个DSP 对象。ccsdsp 以板卡编号和处理器编号为参数,并在建立链接对象后返回其它属性,如处理器型号、处理器名称等。例如,运行cc=ccsdsp(boardnum,boardNum, procnum, procNum),则建立起一个CCS IDE 对象的句柄cc。从而可以通过cc,在MATLAB 下实现对C
7、CS 的操作并控制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)%
8、打开工程文件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 文件后,可以直接由CCSL
9、ink 读取目标符号表并获取变量在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
10、 作为当前的活动文件insert(cc,ccstut.c,64)%在第64 行加入断点halt(cc)%暂停CPUrestart(cc) %继续与CCS 保持联系run(cc,runtohalt,20)%DSP 程序执行到断点ddatV = read(cc,address(cc,ddat),single,4) %(1)读取C 代码初始化数据ddatidatV = read(cc,address(cc,idat),int16,4) %(2)读取C代码初始化数据idatwrite(cc,address(cc,ddat),single(pi, 12.3, exp(-1), sin(pi/4) % (
11、3)修改DSP 内存中的数据ddatwrite(cc,address(cc,idat),int16(1:4)% (4)修改DSP 内存中的数据idatrun(cc,runtohalt,20) %从断点处继续执行ddatV = read(cc,address(cc,ddat),single,4)% (5)读取修改后的数据ddatidatV = 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)
12、、(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) % 按二进制补码方式读取ALregread(cc,TRN,binary) % 按无符
13、号二进制数读取TRNregwrite(cc,AH,FFFF,binary) % 按无符号二进制数读写AH3.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)创建了
14、指向DSP 中C 符号的MATLAB 对象,从而可以在MATLAB 环境下实现对其全部或部分读取和修改。read(cvar)%(8)将嵌入式数组读入到MATLAB 工作空间read(cvar,2)%只读取第2 个元素write(cvar,4,7001)%(9)将第4 个元素修改为7001set(cvar,size,2)%(10)将对象减小到2 个元素 语句(8)将指向idat 的嵌入式数组cvar 读入MATLAB,在语句(9)中对其第4 个元素进行了修改,而在语句(10)中对数组的大小进行了改变。 通过CCSLink,不仅可以为数组变量创建对象,而且也可以为结构体变量创建对象并进行相应的操作
15、,如:cvar = createobj(cc,myStruct)%创建指向C 结构体的MATLAB 对象write(cvar,iz, Simulink) %修改结构体的字符串iz 域为Simulinkcstring = getmember(cvar,iz)%读取该域到MATLABwrite(cstring,1,s)%该写字符串的首字符readnumeric(cstring)%按数值方式读取字符串 上述5 条语句,均通过MATLAB 环境下的对象cvar,实现了对DSP 的C 语言程序中结构体变量myStruct 的读写操作和修改,具有很大的方便性。 通过CCSlink,无论对CCS IDE 建
16、立了连接对象还是嵌入式对象,均可在MATLAB 环境下进行操作,达到了DSP 内部各种变量的读写和修改,并进行相关的调试过程,具有很大的方便性。对于上述示例所有的操作执行结果,均可以在MATLAB和CCS IDE 环境下进行观测和验证。4 结束语 本文简要讨论了基于MATLAB 的DSP 程序调试方法,描述了CCSLink 与CCS IDE 的基本概念,介绍了建立CCS 对象的过程,并以MATLAB 提供的实际工程文件为例,演示了利用CCSLink 连接和嵌入式对象进行C 变量操作的实际过程,并对其执行过程和结果进行了简要解释。 应该说明的是,MATLAB提供了大量的进行DSP程序调试的函数,
17、本文只涉及到了其中极少的一部分。要充分利用MATLAB的强大功能进行更深层次的DSP程序调试,应进一步参考MathWorks公司提供的技术资料MATLAB Link for Code Composer Studio Development Tools。Tags:DSP Matlab 上一篇:在Nexar上实现基于RTOS51的嵌入式系统下一篇:如何搭建Xilinx FPGA开发环境定点DSP与浮点DSP的比较LabVIEW 和Matlab混合编程综述数学工具常见问题集MATLAB语言与自动控制系统设计利用TL16C750实现DSP与PC机的高速串行通信基于DSP的蓝牙(Bluetooth)嵌入
18、式系统应用CCS中如何看程序运行的时钟周期ADSP2189M在船舶自动识别系统开发中的应用推荐文章 Proteus 与单片机实时动态仿真 基于FPGA/CPLD设计与实现UART(VHDL 基于VHDL 的全数字锁相环的设计 如何仿真IP核(建立modelsim仿真库 Modelsim 包会教程 IIR滤波器matlab源程序 使用 FPGA 控制 VGA 显示 Nios II的Boot过程分析 Proteus 常见问题答疑 ModelSim SE操作指南 FIR 滤波器FAQ Modelsim 初学者心得 Proteus ISIS常见问题FAQ VHDL秒表计时器 用verilog编写的多功
19、能数字钟热门文章 FPGA实现串行接口 RS232 Xilinx ISE 使用入门 Debussy 仿真快速上手教程 静态时序分析(Static Timing Anal Quartus II与 ModelSim功能仿真与 基于MATLAB的IIR数字滤波器的设计 Proteus 虚拟串口调试心得 用MATLAB信号处理工具箱进行FIR滤 Verilog学习笔记 Modelsim 包会教程 ModelSim,synplify,ISE后仿真流程 Nios II的Boot过程分析 proteus VSM常见问题FAQ 用 proteus软件建立单片机仿真虚拟 创建基于DLL的Proteus VSM仿
20、真模型关于本站- 联系我们 - 鲁ICP备06020214号 - 网站地图 - 网站留言 - 返回顶部Copyright 2006-2008 电子开发网 All rights reserved.附录资料:MATLAB Cell函数使用技巧谈谈MATLAB中cell函数如果p为一个数,那么h(1)=p,是没有问题的。如果p为一个向量,那么h(1,:)=p是没有问题的。如果p是一个矩阵的话,上面的两种赋值方法都是会有错误的。那么要如何处理呢?这时就用到了cell数据类型了。cell的每个单元都可以存储任何数据,比如传递函数等。当然,存储矩阵更是没有问题的了。但是用cell数据类型之前,要先初始化。
21、a=cell(n,m)那么就把a初始化为一个n行m列的空cell类型数据。如何赋值呢?a1,1=rand(5)那么a的1行1列的单元中存储的就是一个随机的55的方阵了。那么要用第一个单元中的方阵中的某个值呢?可以如下引用:a1,1(2,3)就可以了,引用cell单元时要用,再引用矩阵的某个数据就要用()了。cell单元中的每个单元都是独立的,可以分别存储不同大小的矩阵或不同类型的数据。下面举个例子:a=cell(2,2);%预分配a1,1=cellclass;a1,2=1 2 2;a2,1=a,b,c;a2,2=9 5 6;a1,1ans =cellclassa1,2ans = 1 2 2a2
22、,:ans =abcans = 9 5 6 b=a1,1b =cellclass元胞数组:元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫做元胞(cell)。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。(1)元胞数组的创建 a=matlab,20;ones(2,3),1:10a = matlab 20 2x3 double 1x10 double b=matlab,20;one
23、s(2,3),1:10b = matlab 20 2x3 double 1x10 double c=10c = 10c(1,2)=2c = 10 2c(2,2)=5c = 10 2 5isequal(a,b)ans = 1whosName Size Bytes Class Attributesa 2x2 388 cell ans 1x1 1 logical b 2x2 388 cell c 2x2 208 cell 用cell函数创建元胞数组,创建的数组为空元胞。cell函数创建空元胞数组的主要目的是为数组预先分配连续的存储空间,节约内存占用,提高执行效率。 a=cell(1)a = b=ce
24、ll(1,2)b = c=cell(3,3)c = d=cell(2,2,2)d(:,:,1) = d(:,:,2) = whosName Size Bytes Class Attributesa 1x1 4 cell ans 1x1 1 logical b 1x2 8 cell c 3x3 36 cell d 2x2x2 32 cell (2)元胞数组的数据获得从元胞数组中读取数据,可保存为一个标准的数组或一个新的单元数组,或取出数组进行计算。元胞数组中数据的访问,可通过元胞内容的下标进行,用元胞数组名加大括号。大括号中数值表示元胞的下标。如a1,2表示元胞数组中第一行第二列的元胞。 a=2
25、0,matlab;ones(2,3),1:3a = 20 matlab 2x3 double 1x3 doublestr=a(1,2)str = matlabclass(str)ans =cellstr=a1,2str =matlabclass(str)ans =char()和有着本质的区别,大括号用于表示元胞的内容,小括号表示指定的元胞。a = 20 matlab 2x3 double 1x3 doublea2,1(2,2)ans = 0.9134a2,1(2,3)ans = 0.0975a1,2(2)ans =a使用元胞的下标,可将一个元胞数组的子集赋值给另一个变量,创建新的元胞数组。 a
26、=1,2,3;4,5,6;7,8,9a = 1 2 3 4 5 6 7 8 9 b=a(2:3,2:3)b = 5 6 8 9 c=a(1:3,2:3)c = 2 3 5 6 8 9本例使用元胞下标的方式创建了新的元胞数组b和c,通过结果看出b和c就是元胞数组a的一部分。(3)元胞数组的删除和重塑要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。a=20,matlab;ones(2,3),1:3a = 20 matlab 2x3 double 1x3 doublea(1,:)=a = 2x3 double 1x3 double a=20,matlab;one
27、s(2,3),1:3;a1=a = matlab 2x3 double 1x3 doublea(1)=a = 2x3 double matlab 1x3 doublea(2)=a = 2x3 double 1x3 doublea(1,2)=? A null assignment can have only one non-colon index.a(1)=a = 1x3 double元宝数组和其他数组一样,也可以通过reshape函数改变形状,改变后的元胞数组与原元胞数组的元素个数相同,不能通过改变形状来添加或删除元胞数组中的元素。 a=cell(4,4)a = size(a)ans = 4
28、4 b=reshape(a,2,8)b = size(b)ans = 2 8(5)元胞数组中的操作函数 cell:创建空的元胞数组cellfun:为元胞数组的每个元胞执行指定的函数celldisp:显示所有元胞的内容cellplot:利用图形方式显示元胞数组 cell2mat:将元胞数组转变成为普通的矩阵 mat2cell:将数值矩阵转变成为元胞数组 num2cell:将数值数组转变成为元胞数组 deal:将输入参数赋值给输出 cell2struct:将元胞数组转变成为结构 struct2cell:将结构转变为元胞数组iscell:判断输入是否为元胞数组 a=20,matlab,3-7i;on
29、es(2,3),1:3,0a = 20 matlab 3.0000 - 7.0000i 2x3 double 1x3 double 0 b=cellfun(isreal,a)b = 1 1 0 1 1 1 c=cellfun(length,a)c = 1 6 1 3 3 1 d=cellfun(isclass,a,double)d = 1 0 1 1 1 1(函数的应用)cellfun函数的主要功能是对元胞数组的元素(元胞)分别指定不同的函数,不过,能够在cellfun函数中使用的函数ushuliang是有限的。能在cellfun中使用的函数:isempty:若元胞元素为空,则返回逻辑真isl
30、ogical:若元胞元素为逻辑类型,则返回逻辑真isreal:若元胞元素为实数,则返回逻辑真 length:元胞元素的长度ndims:元胞元素的维数prodofsize:元胞元素包含的元素个数(7)元胞数组的嵌套元胞数组的元胞中包含其他的元胞数,称为嵌套元胞数组,没有嵌套结构的元胞则称为页元胞。使用嵌套的大括号或cell函数,或直接用赋值表达式,都可以创建嵌套单元数组,另外还可以访问嵌套元胞数组的子数组、元胞或元胞的元素。 a=cell(1,2)a = a(1,2)=cell(2,2)a = 2x2 cella(1,1)=magic(3);a1,2(1,1)=1 2 3;4 5 6;7 8 9
31、;a1,2(2,1)=2-i;4+7i;a1,2(2,2)=cell(1,2);a1,22,2(2)=5;cellplot(a)(8)元胞数组与数值数组间的转化应用循环,可以将元胞数组转化为数值数组。2010-11-08 12:06:44zz: Matlab Cell功能最近完成模式分类的作业,需要大量使用matlab,期间发现了一个问题,是matlab代码的复用程度。在面向过程编程里,基本的复用单位是函数,程序的复杂度籍此下放到函数的接口上。设计好函数间的接口,基本上就成功了一半。在面向对象编程里,基本的复用单位是对象,对象使得数据具有了一定程度的自维护。而在matlab里,我很长时间都没有
32、找到方向,因为我搞不清楚复用的单位是什么。matlab中,基本的单位是矩阵,针对矩阵系统有一大堆的函数供你调用。但是,想自己写程序还是有一定的麻烦的。for循环语句在matlab里似乎是一个禁忌,所有老师都敦敦告诫,不要轻易使用for。而函数调用也是同样的低效,有兴趣的同学可以参见此文。那么我们应该基于什么模块进行复用呢?答案是Cell模式。 Cell是matlab的一个特色功能,将一段代码以%标记为cell以后,就可以重复执行了,相当于在命令行输入该代码块。以前,为了测试不同参数的结果,往往要用up arrow执行上一条指令。遇到需要多条指令的地方,就很容易出错。而算法又没有完善到可以封装成函数的地步,整天来回跑代码让人不堪其烦。通过cell模式,可以非常方便地在不同的代码块之间跳转,或重复执行一个代码块。对于我来说,matlab中的编程越来越趋向于bash编程,所用到的语言只是起到一个粘合剂的作用,负责把系统内置的高性能函数组合起来。这种对语句块的复用方式能够快速地调试出需要的功能,有点类似传统的goto,但是可以一直观察着执行的结果,事前无须编译,也不用考虑函数的接口问题。当算法稳定下来,就可以考虑用一个接口轻易地封装成函数了。同时也可以直接保存为mfile供以后使用。