《张永祥TMS320C54系列DSP原理与应用第六章.ppt》由会员分享,可在线阅读,更多相关《张永祥TMS320C54系列DSP原理与应用第六章.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第6章 TMS320C54x DSP的C/C+程序设计第6章 TMS320C54x DSP的C/C+程序设计6.1 C/C+6.1 C/C+程序设计基础程序设计基础6.2 6.2 程序设计示例程序设计示例6.3 C6.3 C语言和汇编语言混合编程语言和汇编语言混合编程2首都师范大学信息工程学院6.1 C/C+程序设计基础DSP生产厂商及第三方为DSP软件开发提供了C编译器,使得利用高级语言实现DSP程序的开发成为可能。在TI公司的DSP软件开发平台CCS中,又提供了优化的C编译器,可以对C语言程序进行优化编译,提高程序效率,目前在某些应用中C语言优化编译的结果可以达到手工编写的汇编语言效率的9
2、0%以上。3首都师范大学信息工程学院一、一、面向面向DSPDSP的程序设计原则的程序设计原则面向DSP的C/C+程序设计和通用计算机上的C/C+程序设计从本质上和工作原理上来说都是一致的,都是采用C/C+编程语言来对处理器进行编程,但受硬件资源和处理对象的不同,也有一些区别。在面向DSP的C/C+程序设计中,要注意以下几个原则:1、灵活使用嵌入式C语言中的位操作指令;2、编译系统不允许有太多的程序嵌套;3、对DSP硬件的时序要求需要考虑;4、不同库函数的区别使用;5、变量不同存储类型的使用;6、尽可能模块化设计;4首都师范大学信息工程学院6.1 C/C+程序设计基础二、二、C/C+C/C+语言
3、数据类型语言数据类型TMS320C54x DSP支持的基本数据类型5首都师范大学信息工程学院6.1 C/C+程序设计基础类型长度最小值最大值charsigned char16位-3276832767unsigned char16位065535short16位-3276832767unsigned short16位065535int signed int16位-3276832767unsigned int16位065535long signed long32位-21474836482147483647unsigned long32位04294967295enum16位-3276832767flo
4、at32位1.19209290e-383.4028235e+38double32位1.19209290e-383.4028235e+38long double32位1.19209290e-383.4028235e+38pointers16位00 xFFFF要注意的是由于TMS320C54x DSP是16位的处理器,字节长度为16位,sizeof操作符返回的对象长度是以16位为字节长度的字节数。例如sizeof(int)=1。同时可以发现短整型和整型数据类型是一致的,浮点型、双精度浮点型和长双精度浮点型是一致的,所以实际使用中可以将常用的数据类型进行适当简化,即将短整型、整型统一为整型(int)
5、,将各种浮点类型统一为浮点型(float)。三、三、C/C+C/C+语言程序结构语言程序结构从执行方式上来划分,基本的程序结构可以划分为顺序结构、分支结构、循环结构三种。四、四、C/C+C/C+语言函数语言函数从函数定义的角度看,函数可分为用户定义函数和库函数两种。1.1.用户定义函数用户定义函数由用户按需要写的函数。用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。6首都师范大学信息工程学院6.1 C/C+程序设计基础函数定义的一般形式:类型说明符 函数名(形式参数表)类型说明 语句 类型说明符和函数名称为函数头。类型说明符说明本函
6、数返回值的类型。函数名是由用户定义的标识符,函数名后有一个空括号,其中可以有参数,也可以无参数,但括号不可少。中的内容称为函数体。在函数体中也有类型说明,这是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值,此时函数类型符可以写为void。7首都师范大学信息工程学院6.1 C/C+程序设计基础有参函数比无参函数多了形式参数表,包括形式参数及其类型,在形参表中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。示例如下:void Convolveok(double*Input,/原始输入数据 double*Impulse,/冲击响应 double*Ou
7、tput,/卷积输出结果 Word16 length/卷积序列长度)8首都师范大学信息工程学院6.1 C/C+程序设计基础int i,k,p;double r;p=0;for(k=0;k=length-1;k+)Outputk=0;r=0;for(i=0;ilength-1)p=length-1;else p=p;p=length-2;for(k=length;k=length+length-1;k+)首都师范大学信息工程学院106.1 C/C+程序设计基础 Outputk=0;r=0;for(i=0;i=p;i+)r=Inputlength-1-i*Impulselength-1-p+i;O
8、utputk=Outputk+r;p=p-1;return;首都师范大学信息工程学院116.1 C/C+程序设计基础需要注意的是,如果函数和主程序在同一个文件中,则只需要在主程序前部加入该函数的声明即可;如果函数和主程序不在同一个文件中,则需要在主程序文件的头部用“#include 头文件名”将函数头文件名包括在内。2.2.库函数库函数CCS提供的库函数包括两类。一类安装在c:tic5400cgtoolsinclude目录中,共有文件38个,其中具有.h的文件19个,具有.hpp的文件19个(注意将没有扩展名的文件加上.hpp扩展名)。首都师范大学信息工程学院126.1 C/C+程序设计基础示
9、例如下:#include ;注意此处和#include“math.h”;的区别 void mail()float x,y;x=3.0;y=log10(x);首都师范大学信息工程学院136.1 C/C+程序设计基础一类是安装在c:tic5400dsplib目录中,也称作DSPLIB通用库。是专门为TMS320C54x DSP芯片使用的C语言优化程序函数库。它包含了50多种函数数字信号处理程序,全部由汇编语言编写,并可由C语言调用,方便C语言与汇编语言混合编程。DSPLIB可进行的运算有:FFT运算、滤波与卷积运算、自适应滤波运算、相关运算、数学函数运算、三角函数运算、矩阵运算等。首都师范大学信息
10、工程学院146.1 C/C+程序设计基础首都师范大学信息工程学院156.1 C/C+程序设计基础示例如下:/*/Filename:sine_t.c/Version:0.01/Description:test for dlms routine/*#include#include#include/在dsplib.h、tms320.h头文件中定义了许多运算中要用到的变量、函数,应用程序主函数必须用#include语句包含此头文件。#include test.hshort i;short eflag=PASS;void main(void)首都师范大学信息工程学院166.1 C/C+程序设计基础 /*
11、clear*/for(i=0;iNX;i+)ri=0;/clear output buffer(optional)/*compute*/sine(x,r,NX);/*test*/eflag=test(r,rtest,NX,MAXERROR);/for r if(eflag!=PASS)exit(-1);return;rts.lib是TI提供的运行时支持库,如果是C代码写的源程序,必须在工程中添加该库文件。要想使程序正常运行,一些配置工作需要完成:打开工程的Bulid Options选项中两个地方进行设置。当编译时打不开或找不到dsplib.h、tms320.h文件,此时可以在compiler标
12、签下选中preprocessor选项,在Include Search Path栏中填入dsplib.h、tms320.h所在子目录(本例为:c:tic5400dsplibinclude);当连接时找不到库函数相应的汇编程序,编译错误提示有些函数为未定义变量,此时可在linker标签下选中basic选项,在Library Search Path栏中填入54xdsp.lib、rts.lib库文件所在路径(本例为:c:tic5400dsplib;c:tic5400cgtoolslib,注意用英文分号隔开);在Include Library栏填入两库文件(本例为:54xdsp.lib;rts.lib)
13、,至此程序可以正常编译。首都师范大学信息工程学院176.1 C/C+程序设计基础五、五、C/C+C/C+的的DSPDSP访问规则访问规则1.DSP1.DSP片内寄存器的访问规则片内寄存器的访问规则在C语言中对DSP片内寄存器一般采用指针方式来访问,常常采用的方法是将DSP寄存器地址的列表定义在头文件中(如reg.h)。举例,通过指针操作对ST0和AR1进行初始化。#define ST0 (volatile unsigned int*)0 x0006#define AR1 (volatile unsigned int*)0 x0011Int userfunc().*ST0=0 x1278h;*A
14、R1=0 x6013h;.首都师范大学信息工程学院186.1 C/C+程序设计基础2.DSP2.DSP内部和外部存储器的访问规则内部和外部存储器的访问规则举例,通过指针操作对内部存储器单元0 x4000和外部存储器单元0 x80FF进行操作。int *data1=0 x4000;/*内部存储器单元*/int *data2=0 x80FF;/*外部存储器单元*/int userfunc().*data1=7000;*data2=0;.首都师范大学信息工程学院196.1 C/C+程序设计基础3.DSP I/O3.DSP I/O端口的访问规则端口的访问规则在C语言中访问DSP的I/O空间借助于关键字
15、ioport来进行,注意,此关键字只为TMS320C54xx DSP的编译器所识别和使用。定义的形式为 ioport type porthex_num其中,import和port均为关键字,port表示I/O地址,hex_num是十六进制地址,type是I/O数据类型,在TMS320C54xx DSP中,I/O空间共有64K字,所以数据类型只能是char、short、int等16位的类型。首都师范大学信息工程学院206.1 C/C+程序设计基础首都师范大学信息工程学院216.1 C/C+程序设计基础下例声明了一个io变量,地址为300H,并对I/O端口做读/写操作。ioport unsigne
16、d port300;/*定义地址为300H的I/O端口变量*/int userfunc().port300=20;/写I/O端口,port300作为一个变量使用.b=port300;/读I/O端口,port300作为一个变量使用.一、一、电路设计与功能电路设计与功能开发平台采用的是北京瑞泰创新科技有限责任公司的ICETEK-VC5416A-S60,主处理器采用的是TMS320VC5416 DSP,主频可达到160MHz;内部存储空间为128K*16bit;扩展的6路12bit A/D接口 ADS7864,最大采样速率 500K;8Mbit 扩展 FLASH;设计有用户可以自定义的开关和测试指示
17、灯,其实验箱整体外观如图6.2所示。首都师范大学信息工程学院226.2 程序设计示例首都师范大学信息工程学院236.2 程序设计示例该实验箱的核心是ICETEK-VC5416-A 评估板,具有4 组标准扩展连接器,为用户进行二次开发提供条件,其原理框图如图6.3所示。首都师范大学信息工程学院246.2 程序设计示例首都师范大学信息工程学院256.2 程序设计示例该评估板的接口说明实物图如图6.4所示。6.2 程序设计示例二、二、代码分析代码分析首都师范大学信息工程学院26其主要代码分析如下:SPSA0=1;/设置McBSP0的SPCR2控制寄存器uWork=SPSD0;uWork&=0 xff
18、fe;/标志XRST=0SPSD0=uWork;SPSA0=0 x0e;/设置McBSP0的PCR1寄存器uWork=SPSD0;uWork|=0 x2800;/设置:XIOEN=1 FSXM=1,使能通用I/O功能,FSX用于输出SPSD0=uWork;while(1)SPSA0=0 x0e;/设置McBSP0的PCR1寄存器uWork=SPSD0;uWork|=0 x2800;uWork=0 x8;/FSXP=FSXP,BFSX0引脚状态取反SPSD0=uWork;Delay(4096);首都师范大学信息工程学院276.2 程序设计示例三、程序源代码整个工程只包含有两个文件,一个为GPIO
19、.c文件,该文件实现了整个功能要求,另一个为GPIO.cmd,该文件实现实验箱存储器内存空间分配。首都师范大学信息工程学院286.2 程序设计示例首都师范大学信息工程学院296.2 程序设计示例GPIO.c源代码如下:#define SPSA0*(unsigned int*)0 x38#define SPSD0*(unsigned int*)0 x39#define REGISTERCLKMD(*(unsigned int*)0 x58)ioport unsigned char port8000;ioport unsigned char port8001;ioport unsigned cha
20、r port8002;ioport unsigned char port8007;#define CTRGR port8000#define CTRKEY port8001#define CTRLCDCMDR port8001#define CTRLCDCR port8002#define CTRCLKEY port8002#define CTRLR port8007void Delay(unsigned int nTime);首都师范大学信息工程学院306.2 程序设计示例main()unsigned int uWork;REGISTERCLKMD=0;CTRGR=0;CTRGR=0 x80
21、;CTRGR=2;CTRLR=0;CTRLR=0 x40;uWork=CTRCLKEY;SPSA0=1;uWork=SPSD0;uWork&=0 xfffe;SPSD0=uWork;SPSA0=0 x0e;uWork=SPSD0;uWork|=0 x2800;SPSD0=uWork;首都师范大学信息工程学院31while(1)SPSA0=0 x0e;uWork=SPSD0;uWork|=0 x2800;uWork=0 x8;SPSD0=uWork;Delay(4096);void Delay(unsigned int nDelay)int i,j,k=0;for(i=0;inDelay;i+)
22、for(j=0;j PRAM PAGE 0.data :PRAM PAGE 0.cinit :PRAM PAGE 0.switch:PRAM PAGE 0.const :DRAM PAGE 1.bss :DRAM PAGE 1.stack :DRAM PAGE 1.vectors:VECT PAGE 0通过设置CCS在硬仿真(Emulator)方式下运行,编译、下载和运行程序后,可以观察到位于“交通灯”模块的“北”侧红色发光二极管定时闪烁。混合编程法成为开发混合编程法成为开发TMS320C54x DSPTMS320C54x DSP应用程序的常用方应用程序的常用方法。其基本形式有如下三种:法。其
23、基本形式有如下三种:1、连接独立的C语言模块和汇编语言模块;2、在C语言中嵌入汇编语句;3、手工修改C程序编译后的汇编程序;这种方法对程序员水平要求较高,通常不建议采用。首都师范大学信息工程学院346.3 C语言和汇编语言混合编程一、一、独立的独立的C C模块和汇编模块接口模块和汇编模块接口混合编程方法是分别独立编写汇编程序和C程序,编译或汇编得得到各自的目标代码模块,用链接器将C模块和汇编模块链接起来。通过这种方法,C程序可以调用汇编程序,并且可以访问汇编程序中定义的变量。同样,汇编程序也可以调用C程序或访问C程序中定义的变量。混合编程方法要求用户必须自己维护各汇编模块的入口和出口代码,自己
24、计算传递的参数在堆栈中的偏移量,工作量稍大,但能做到对程序的绝对控制。首都师范大学信息工程学院356.3 C语言和汇编语言混合编程6.3 C语言和汇编语言混合编程在编写 C 程序和汇编程序时,必须遵循有关的调用规则和寄存器规则。1.1.寄存器规则寄存器规则在在C C 环境下严格约定了寄存器规则。它明确了编译器如何环境下严格约定了寄存器规则。它明确了编译器如何使用寄存器以及交叉调用时如何保护寄存器。使用寄存器以及交叉调用时如何保护寄存器。调用函数时调用函数时,被调用函数负责保护某些寄存器被调用函数负责保护某些寄存器,这些寄存器这些寄存器不必由调用者来保护。不必由调用者来保护。如果调用者需要使用没
25、有保护的寄存器如果调用者需要使用没有保护的寄存器,则调用者在调用则调用者在调用函数前必须对其予以保护。函数前必须对其予以保护。首都师范大学信息工程学院366.3 C语言和汇编语言混合编程2.2.函数调用规则函数调用规则参数传递局部帧的产生函数返回首都师范大学信息工程学院376.3 C语言和汇编语言混合编程二、二、从从C C程序中访问汇编程序变量程序中访问汇编程序变量根据变量和常数定义的位置和方法不同,可分为三种情况:1.1.访问在.bss .bss 段中定义的变量 。实现方法如下:(1)采用.bss 命令定义变量;(2)用.global 将变量说明为外部变量;(3)在汇编变量名前加下划线“”;
26、(4)在 C 程序中将变量说明为外部变量,然后就可以像访问普通变量一样访问它。首都师范大学信息工程学院386.3 C语言和汇编语言混合编程2.2.访问在汇编程序中用块定义的常数表(如用于在汇编程序中用块定义的常数表(如用于FIRFIR、IIRIIR滤滤波器等的系数表)。波器等的系数表)。访问时首先在汇编程序中说明一个指向该表起始的全局符号,然后用.sect定义一个块。在C程序中则定义个指向该系数表的指针。同时在 C 程序中用extern 予以声明。3.3.访问访问.set.set和和.global.global定义的全局常量。定义的全局常量。由于符号表包含的是常数值,而编译器并不能区分哪些符号
27、表包含的是变量的地址,哪些是变量的值。因此在 C 程序中访问时需要在常数名前加地址操作符&,这样才能得到常数值。首都师范大学信息工程学院396.3 C语言和汇编语言混合编程三三、在C C程序中直接嵌入汇编语句需注意的是不能破坏C语言的运行环境。格式如下:asm (“汇编语句”);例如:asm(“ssbx intm”);/*打开数据口*/asm(“rsbx xf”);注意:括号中的汇编语句必须以标号、空格、tab、分号开头;不要破坏 C 环境,因为 C 编译器并不检查和分析嵌入的汇编语句;插入跳转语句和标号会产生不可预测的结果;汇编语句不要改变 C 程序中变量的值;不要用汇编语句中加入汇编器选项
28、而改变汇编环境。首都师范大学信息工程学院406.3 C语言和汇编语言混合编程举例,举例,定时器定时器0 0中断中断服务程序服务程序1.对中断进行初始化,在C语言程序中对中断进行初始化的程序片段如下:asm(“ssbx intm“);/*开放所有可屏蔽中断,此处就可以利用直接嵌入的方式*/IMR=0 x0008;/*开放定时器0中断*/IFR=0 xffff;/*清除所有尚未处理完的中断*/2.编写中断服务程序。两种方式可以用来定义中断函数。首都师范大学信息工程学院416.3 C语言和汇编语言混合编程Interrupt void userfunction(void).这种方式下C编译器自动保护各
29、寄存器的值,中断响应后自动恢复。userfunction定时器0的中断服务函数名,可由用户任意更改,但要与第三步中名字相对应。void c_intxx(void)其中,xx代表0099之间的两位数,如c_int01就是一个有效的中断函数名。首都师范大学信息工程学院426.3 C语言和汇编语言混合编程3.建立中断矢量表。为了能够让相应的中断信号调用不同的中断函数,还需要在中断向量文件(vector.asm)中定义中断向量表。如下例所示:.ref _c_int00 .ref _ userfunction.sect vectors RS:BD _c_int00 NOPNOP.TINT0:BD _ userfunction;定时器0中断 NOP NOP .end首都师范大学信息工程学院43