张永祥TMS320C54系列DSP原理与应用第六章课件_第1页
张永祥TMS320C54系列DSP原理与应用第六章课件_第2页
张永祥TMS320C54系列DSP原理与应用第六章课件_第3页
张永祥TMS320C54系列DSP原理与应用第六章课件_第4页
张永祥TMS320C54系列DSP原理与应用第六章课件_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章

TMS320C54xDSP的C/C++第6章TMS320C54xDSP的C/C++程序设计6.1C/C++程序设计基础6.2程序设计示例6.3C语言和汇编语言混合编程2首都师范大学信息工程学院6.1C/C++程序设计基础DSP生产厂商及第三方为DSP软件开发提供了C编译器,使得利用高级语言实现DSP程序的开发成为可能。在TI公司的DSP软件开发平台CCS中,又提供了优化的C编译器,可以对C语言程序进行优化编译,提高程序效率,目前在某些应用中C语言优化编译的结果可以达到手工编写的汇编语言效率的90%以上。3首都师范大学信息工程学院二、C/C++语言数据类型TMS320C54xDSP支持的基本数据类型5首都师范大学信息工程学院6.1C/C++程序设计基础类型长度最小值最大值charsignedchar16位-3276832767unsignedchar16位065535short16位-3276832767unsignedshort16位065535intsignedint16位-3276832767unsignedint16位065535longsignedlong32位-21474836482147483647unsignedlong32位04294967295enum16位-3276832767float32位1.19209290e-383.4028235e+38double32位1.19209290e-383.4028235e+38longdouble32位1.19209290e-383.4028235e+38pointers16位00xFFFF要注意的是由于TMS320C54xDSP是16位的处理器,字节长度为16位,sizeof操作符返回的对象长度是以16位为字节长度的字节数。例如sizeof(int)=1。同时可以发现短整型和整型数据类型是一致的,浮点型、双精度浮点型和长双精度浮点型是一致的,所以实际使用中可以将常用的数据类型进行适当简化,即将短整型、整型统一为整型(int),将各种浮点类型统一为浮点型(float)。

三、C/C++语言程序结构从执行方式上来划分,基本的程序结构可以划分为顺序结构、分支结构、循环结构三种。四、C/C++语言函数从函数定义的角度看,函数可分为用户定义函数和库函数两种。1.用户定义函数由用户按需要写的函数。用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。6首都师范大学信息工程学院6.1C/C++程序设计基础函数定义的一般形式:

类型说明符函数名(形式参数表)

{类型说明

语句

}类型说明符和函数名称为函数头。类型说明符说明本函数返回值的类型。函数名是由用户定义的标识符,函数名后有一个空括号,其中可以有参数,也可以无参数,但括号不可少。{}中的内容称为函数体。在函数体中也有类型说明,这是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值,此时函数类型符可以写为void。7首都师范大学信息工程学院6.1C/C++程序设计基础{ inti,k,p; doubler; p=0; for(k=0;k<=length-1;k++) { Output[k]=0; r=0; for(i=0;i<=p;i++)

首都师范大学信息工程学院96.1C/C++程序设计基础{ r=Input[k-i]*Impulse[i]; Output[k]=Output[k]+r; } p=p+1; if(p>length-1)p=length-1; elsep=p; }

p=length-2; for(k=length;k<=length+length-1;k++)

首都师范大学信息工程学院106.1C/C++程序设计基础 { Output[k]=0; r=0; for(i=0;i<=p;i++) { r=Input[length-1-i]*Impulse[length-1-p+i]; Output[k]=Output[k]+r; } p=p-1; } return; }首都师范大学信息工程学院116.1C/C++程序设计基础示例如下: #include<math.h>;注意此处和#include“math.h”

;的区别voidmail()

{ floatx,y; x=3.0; y=log10(x);

}首都师范大学信息工程学院136.1C/C++程序设计基础一类是安装在c:\ti\c5400\dsplib目录中,也称作DSPLIB通用库。是专门为TMS320C54xDSP芯片使用的C语言优化程序函数库。它包含了50多种函数——数字信号处理程序,全部由汇编语言编写,并可由C语言调用,方便C语言与汇编语言混合编程。DSPLIB可进行的运算有:FFT运算、滤波与卷积运算、自适应滤波运算、相关运算、数学函数运算、三角函数运算、矩阵运算等。首都师范大学信息工程学院146.1C/C++程序设计基础首都师范大学信息工程学院156.1C/C++程序设计基础示例如下://****************************************************//: sine_t.c//Version: 0.01//Description:testfordlmsroutine//****************************************************#include<math.h>#include<dsplib.h>#include<tms320.h>//在dsplib.h、tms320.h头文件中定义了许多运算中要用到的变量、函数,应用程序主函数必须用#include语句包含此头文件。#include"test.h"shorti;shorteflag=PASS;voidmain(void)rts.lib是TI提供的运行时支持库,如果是C代码写的源程序,必须在工程中添加该库文件。要想使程序正常运行,一些配置工作需要完成:打开工程的BulidOptions选项中两个地方进行设置。当编译时打不开或找不到dsplib.h、tms320.h文件,此时可以在compiler标签下选中preprocessor选项,在IncludeSearchPath栏中填入dsplib.h、tms320.h所在子目录(本例为:c:\ti\c5400\dsplib\include);当连接时找不到库函数相应的汇编程序,编译错误提示有些函数为未定义变量,此时可在linker标签下选中basic选项,在LibrarySearchPath栏中填入54xdsp.lib、rts.lib库文件所在路径(本例为:c:\ti\c5400\dsplib;c:\ti\c5400\cgtools\lib,注意用英文分号隔开);在IncludeLibrary栏填入两库文件(本例为:54xdsp.lib;rts.lib),至此程序可以正常编译。首都师范大学信息工程学院176.1C/C++程序设计基础五、C/C++的DSP访问规则1.DSP片内寄存器的访问规则在C语言中对DSP片内寄存器一般采用指针方式来访问,常常采用的方法是将DSP寄存器地址的列表定义在头文件中(如reg.h)。举例,通过指针操作对ST0和AR1进行初始化。#defineST0(volatileunsignedint*)0x0006#defineAR1 (volatileunsignedint*)0x0011Intuserfunc(){...*ST0=0x1278h;*AR1=0x6013h;...}首都师范大学信息工程学院186.1C/C++程序设计基础2.DSP内部和外部存储器的访问规则举例,通过指针操作对内部存储器单元0x4000和外部存储器单元0x80FF进行操作。

int*data1=0x4000; /*内部存储器单元*/ int*data2=0x80FF; /*外部存储器单元*/ intuserfunc() { ... *data1=7000; *data2=0; ... }首都师范大学信息工程学院196.1C/C++程序设计基础首都师范大学信息工程学院216.1C/C++程序设计基础下例声明了一个io变量,地址为300H,并对I/O端口做读/写操作。ioportunsignedport300; /*定义地址为300H的I/O端口变量*/intuserfunc(){...port300=20;//写I/O端口,port300作为一个变量使用...b=port300;//读I/O端口,port300作为一个变量使用...}一、电路设计与功能开发平台采用的是北京瑞泰创新科技有限责任公司的ICETEK-VC5416A-S60,主处理器采用的是TMS320VC5416DSP,主频可达到160MHz;内部存储空间为128K*16bit;扩展的6路12bitA/D接口ADS7864,最大采样速率500K;8Mbit扩展FLASH;设计有用户可以自定义的开关和测试指示灯,其实验箱整体外观如图6.2所示。首都师范大学信息工程学院226.2程序设计示例首都师范大学信息工程学院236.2程序设计示例首都师范大学信息工程学院256.2程序设计示例该评估板的接口说明实物图如图6.4所示。6.2程序设计示例二、代码分析首都师范大学信息工程学院26首都师范大学信息工程学院296.2程序设计示例GPIO.c源代码如下:#defineSPSA0*(unsignedint*)0x38#defineSPSD0*(unsignedint*)0x39#defineREGISTERCLKMD(*(unsignedint*)0x58)ioportunsignedcharport8000; ioportunsignedcharport8001; ioportunsignedcharport8002; ioportunsignedcharport8007; #defineCTRGRport8000#defineCTRKEYport8001#defineCTRLCDCMDRport8001#defineCTRLCDCRport8002#defineCTRCLKEYport8002#defineCTRLRport8007voidDelay(unsignedintnTime);首都师范大学信息工程学院306.2程序设计示例main(){ unsignedintuWork; REGISTERCLKMD=0; CTRGR=0; CTRGR=0x80; CTRGR=2; CTRLR=0; CTRLR=0x40; uWork=CTRCLKEY; SPSA0=1; uWork=SPSD0; uWork&=0xfffe; SPSD0=uWork; SPSA0=0x0e; uWork=SPSD0; uWork|=0x2800; SPSD0=uWork;首都师范大学信息工程学院31while(1) { SPSA0=0x0e; uWork=SPSD0; uWork|=0x2800; uWork^=0x8; SPSD0=uWork; Delay(4096); }}voidDelay(unsignedintnDelay){ inti,j,k=0; for(i=0;i<nDelay;i++) for(j=0;j<64;j++) k++;}6.2程序设计示例GPIO.cmd源代码如下: -w -stack400h -heap100 -lrts.lib MEMORY { PAGE0: VECT:o=80h,l=80h PRAM:o=100h,l=1f00h PAGE1: DRAM:o=2000h,l=1000h }首都师范大学信息工程学院326.2程序设计示例首都师范大学信息工程学院336.2程序设计示例SECTIONS{ .text:{}>PRAMPAGE0 .data:{}>PRAMPAGE0 .cinit:{}>PRAMPAGE0 .switch:{}>PRAMPAGE0 .const:{}>DRAMPAGE1 .bss:{}>DRAMPAGE1 .stack:{}>DRAMPAGE1 .vectors:{}>VECTPAGE0 }通过设置CCS在硬仿真(Emulator)方式下运行,编译、下载和运行程序后,可以观察到位于“交通灯”模块的“北”侧红色发光二极管定时闪烁。混合编程法成为开发TMS320C54xDSP应用程序的常用方法。其基本形式有如下三种:

1、连接独立的C语言模块和汇编语言模块; 2、在C语言中嵌入汇编语句; 3、手工修改C程序编译后的汇编程序;这种方法对程序员水平要求较高,通常不建议采用。首都师范大学信息工程学院346.3C语言和汇编语言混合编程一、独立的C模块和汇编模块接口混合编程方法是分别独立编写汇编程序和C程序,编译或汇编得得到各自的目标代码模块,用链接器将C模块和汇编模块链接起来。通过这种方法,C程序可以调用汇编程序,并且可以访问汇编程序中定义的变量。同样,汇编程序也可以调用C程序或访问C程序中定义的变量。混合编程方法要求用户必须自己维护各汇编模块的入口和出口代码,自己计算传递的参数在堆栈中的偏移量,工作量稍大,但能做到对程序的绝对控制。首都师范大学信息工程学院356.3C语言和汇编语言混合编程6.3C语言和汇编语言混合编程在编写C程序和汇编程序时,必须遵循有关的调用规则和寄存器规则。1.寄存器规则在C环境下严格约定了寄存器规则。它明确了编译器如何使用寄存器以及交叉调用时如何保护寄存器。调用函数时,被调用函数负责保护某些寄存器,这些寄存器不必由调用者来保护。如果调用者需要使用没有保护的寄存器,则调用者在调用函数前必须对其予以保护。首都师范大学信息工程学院366.3C语言和汇编语言混合编程2.函数调用规则参数传递局部帧的产生函数返回首都师范大学信息工程学院376.3C语言和汇编语言混合编程二、从C程序中访问汇编程序变量根据变量和常数定义的位置和方法不同,可分为三种情况:1.访问在.bss段中定义的变量

。实现方法如下:(1)采用.bss命令定义变量;(2)用.global将变量说明为外部变量;(3)在汇编变量名前加下划线“—”;(4)在C程序中将变量说明为外部变量,然后就可以像访问普通变量一样访问它。首都师范大学信息工程学院386.3C语言和汇编语言混合编程2.访问在汇编程序中用块定义的常数表(如用于FIR、IIR滤波器等的系数表)。访问时首先在汇编程序中说明一个指向该表起始的全局符号,然后用.sect定义一个块。在C程序中则定义个指向该系数表的指针。同时在C程序中用extern予以声明。3.访问.set和.global定义的全局常量。由于符号表包含的是常数值,而编译器并不能区分哪些符号表包含的是变量的地址,哪些是变量的值。因此在C程序中访问时需要在常数名前加地址操作符&,这样才能得到常数值。首都师范大学信息工程学院396.3C语言和汇编语言混合编程三、

在C程序中直接嵌入汇编语句需注意的是不能破坏C语言的运行环境。格式如下: asm(“汇编语句”);

例如: asm(“ssbxintm”);/*打开数据口*/ asm(“rsbxxf”);注意:括号中的汇编语句必须以标号、空格、tab、分号开头;不要破坏C环境,因为C编译器并不检查和分析嵌入的汇编语句;插入跳转语句和标号会产生不可预测

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论