DSP软件开发与C语言编程_第1页
DSP软件开发与C语言编程_第2页
DSP软件开发与C语言编程_第3页
DSP软件开发与C语言编程_第4页
DSP软件开发与C语言编程_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、主讲人:潘昌忠信息与电气工程学院 信息楼412Tel:E-mail: DSP原理及应用原理及应用 课程回顾课程回顾1.1. DSPDSP开发工具与软件开发流程开发工具与软件开发流程软件开发流程?软件开发流程?2.集成开发环境集成开发环境CCSCCS环境下的应用程序开发步骤?环境下的应用程序开发步骤?3.DSP的的C工程文件工程文件COFF?最小单位?最小单位?MEMORY 和和SECTIONS命令的作用?命令的作用?2 2#include “f2407_c.h”void Delay(unsigned int nDelay); /延时子程序,函数声明延时子程序,函数声明

2、main( ) SCSR1=0 x0200; WDCR=0 xe8; while(1)MCRC=0 x0000;PEDATDIR=0 x0202; Delay(500); PEDATDIR=0 x0200; Delay(500); 功能:并行接口功能:并行接口IOPE1引脚通过反相驱动器接一个引脚通过反相驱动器接一个LED指指示灯示灯, 使其指示灯闪烁。使其指示灯闪烁。+3.3V1kIOPE1LEDvoid Delay(unsigned int nDelay) int i, j, k=0;for ( i=0; inDelay; i+ ) for ( j=0; j2200; j+ ) k+; 第

3、4章 DSP的软件开发与C语言编程4本章内容:本章内容:4.1 DSP开发工具与软件开发流程开发工具与软件开发流程4.2 集成开发环境集成开发环境CCS4.3 DSP的的C工程文件工程文件 4.4 DSP C语言程序设计基础语言程序设计基础4.5 DSP C程序举例程序举例5 54.4 DSP C语言程序设计基础语言程序设计基础6 6C语言程序设计优缺点语言程序设计优缺点汇编语言程序设计汇编语言程序设计: 执行速度快。执行速度快。 开发周期长、移植性和可读性差开发周期长、移植性和可读性差 。 C语言程序设计语言程序设计: 开发周期短、移植性和可读性好。开发周期短、移植性和可读性好。 执行速度可

4、以满足要求。执行速度可以满足要求。7 C28x DSP具有优化的具有优化的C编译器,它支持编译器,它支持ANSI C 标准标准。还具有一些不同于标准。还具有一些不同于标准C的特征。的特征。 DSP的基本数据类型如表所示,还具有数的基本数据类型如表所示,还具有数组、结构、联合等构造类型数据。组、结构、联合等构造类型数据。4.4.1 数据类型数据类型8 8TMS320C24x C的数据类型的数据类型 类型类型长度长度(位位)表示方法表示方法数值范围数值范围最小值最小值最大值最大值字符型字符型char, signed charunsigned char1616ASCIIASCII-327680327

5、6765535整型整型shortunsigned shortint, signed intunsigned intlong, signed longunsigned long161616163232补码补码二进制二进制补码补码二进制二进制补码补码二进制二进制-327680-327680-214748364803276765535327676553521474836474294967295实型实型floatdoublelong double32IEEE 32-bit1.19209290E-383.4028235E+38枚举枚举enum16补码补码-3276832767指针指针pointer16二

6、进制二进制00 xFFFF9 94.4.2 C语言运算符与基本语句语言运算符与基本语句 1. C语言运算符语言运算符2. C语言基本语句语言基本语句 C语言运算符有算术运算符、关系运算符、逻辑运语言运算符有算术运算符、关系运算符、逻辑运算符、位操作运算符等。不同的运算符可以有不同的优算符、位操作运算符等。不同的运算符可以有不同的优先级、运算对象个数与结合方向。先级、运算对象个数与结合方向。 C语句有控制语句、表达式语句、函数调用语句、语句有控制语句、表达式语句、函数调用语句、空语句和复合语句五类。空语句和复合语句五类。1010 与普通的与普通的C语言程序类似,语言程序类似,DSP C程序是由若

7、程序是由若干模块化的函数构成。函数是干模块化的函数构成。函数是C程序的基本模块,程序的基本模块,子程序就是由函数来实现的。子程序就是由函数来实现的。 用户可以根据需要定义自己的功能函数,也可用户可以根据需要定义自己的功能函数,也可以调用以调用C编译器提供的标准函数(库函数)来完成某编译器提供的标准函数(库函数)来完成某种特定的功能。种特定的功能。 注意函数调用的规则。注意函数调用的规则。4.4.3 函数函数 1111 C函数的一般格式为函数的一般格式为类型函数名(形式参数及其类型表)类型函数名(形式参数及其类型表)变量声明部分;变量声明部分;执行语句部分;执行语句部分; 函数在程序中的三种形态

8、:函数定义(函数在程序中的三种形态:函数定义(Definition)、函)、函数调用和函数声明(数调用和函数声明(Declaration)。)。 函数定义相当于汇编语言中的一般子程序。 函数调用相当于调用子程序。函数定义和函数调用不分先后,但若调用在定义之前,那么在调用前必须先进行函数声明。 函数声明是一个没有函数体的函数定义,而函数调用则要求有函数名和实际参数表。 1212 可以用指针的方法可以用指针的方法访问变量访问变量,用指针,用指针访问数组、结构访问数组、结构、联合变量非常方便。联合变量非常方便。4.4.4 指针指针 C语言中语言中访问片内外数据存储器或外设寄存器访问片内外数据存储器或

9、外设寄存器, 可以用指可以用指针的方法实现。例如,一种方法定义针的方法实现。例如,一种方法定义volatile unsigned int *IMR = (volatile unsigned int *) 0 x0004这时,这时,IMR为指针,则给寄存器为指针,则给寄存器IMR赋值可以用以下语句赋值可以用以下语句*IMR=0 x0010 或者,另一种方法定义或者,另一种方法定义define IMR *(volatile unsigned int *) 0 x0004这时,这时,IMR为宏名,则给寄存器为宏名,则给寄存器IMR赋值可以用以下语句赋值可以用以下语句IMR=0 x0010 1313C

10、语言用指针访问数据存储器(或片内外设寄存器)语言用指针访问数据存储器(或片内外设寄存器) 可以用指针方法实现。可以用指针方法实现。 一般将这些定义放到一个头文件,一般将这些定义放到一个头文件,使用时,用编译预处理命令使用时,用编译预处理命令 include包含该头文件即可。包含该头文件即可。1414例,将例,将DSP的数据存储器的数据存储器300H开始的开始的16个单元复制到个单元复制到200H开始的单元。开始的单元。main( )int i;unsigned int *p1, *p2, *p3;/定义定义3个指向无符号整型的指针个指向无符号整型的指针p1=(unsigned int *) 0

11、 x300;/用指针方式访问存储单元用指针方式访问存储单元p2=(unsigned int *) 0 x200;for ( i=0, p3=p1; i16; i+, p3+ )*p3=i;/0 x3000 x30F单元分别赋值单元分别赋值015for ( i=0, p3=p2; i16;i+,p3+ ) *p3=0 x1234; /0 x2000 x20F单元均赋值单元均赋值0 x1234for ( i=0; i16; i+, p1+, p2+ )*p2=*p1; /将将300H开始的开始的16个单元复制到个单元复制到200H开始的单元开始的单元while(1) ; 1515宏定义宏定义 #d

12、efine #define PI 3.14159 #define Uint16 unsigned int (typedef unsigned int Uint16; ) #define EINT asm(“ clrc INTM”) EINT; #define IMR *(volatile unsigned int *)0 x0004 /定义一个宏代表定义一个宏代表中断屏蔽寄存器中断屏蔽寄存器IMR 4.4.5 编译预处理编译预处理 文件包含文件包含#include #include #include “f2407_c.h ”1. 宏定义、文件包含与条件编译宏定义、文件包含与条件编译1616条件

13、编译条件编译 #ifdef 标识符标识符程序段程序段1#else程序段程序段2#endif1717 pragma是一类编译预处理命令(是一类编译预处理命令(directive),通),通知编译预处理器如何处理函数。知编译预处理器如何处理函数。C24x C/C+ 支持如下支持如下pragma命令,命令,CODE_SECTION (func, “section name”)DATA_SECTION (symbol, “section name”)INTERRUPT (func)FUNC_EXT_CALLED (func)FAST_CALL (func)2. pragma 命令命令1818 CODE

14、_SECTION (func, “section name”) 它为函数它为函数func在一个名为在一个名为section name 的段的段(section)中中指定空间。指定空间。char bufferA80;#pragma CODE_SECTION (funA, “codeA”)char funA (int i);void main( ) char c; c=funA(1);char funA(int i) return bufferAi;1919 DATA_SECTION (symbol, “section name”) 它为符号它为符号symbol在一个名为在一个名为section

15、name的数据段中指的数据段中指定空间。定空间。#pragma DATA_SECTION (bufferB, “my_sect”)char bufferB512; 数据块数据块bufferB被定位于被定位于my_sect段中,段中,my_sect段段在在 .cmd文件中规定物理地址。文件中规定物理地址。20204.4.6 C语言与汇编语言混合编程语言与汇编语言混合编程1. 在在C程序中直接嵌入汇编语句。程序中直接嵌入汇编语句。2. 独立的独立的C模块和汇编模块接口。模块和汇编模块接口。3. 从从C程序中访问汇编程序变量。程序中访问汇编程序变量。21211. 在在C程序中直接嵌入汇编语句程序中直

16、接嵌入汇编语句 可以在C程序中实现用C语言难以实现的一些硬件控制功能。另一方面,也可以用这种方法在C程序中的关键部分用汇编语句代替C语句以优化程序。 缺点:比较容易破坏C环境,因为C编译器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入的汇编语句。asm (“ 汇编语句”) 例如: asm (“ NOP”); #define EINT asm (“ CLRC INTM”) /开放中断22222. 独立的独立的C模块和汇编模块接口模块和汇编模块接口23233. 从从C程序中访问汇编程序变量程序中访问汇编程序变量 从从C程序中访问在汇编程序中定义的变量或常数,可程序中访问在汇编程序中定义的变量或

17、常数,可以分为以下以分为以下2种情况:种情况:(1)访问在)访问在.bss段中定义的变量。段中定义的变量。(2)访问不在)访问不在.bss段中定义的变量。段中定义的变量。 2424例例4-5,在,在C程序中访问在程序中访问在.bss段中定义的变量。段中定义的变量。汇编程序:汇编程序:.bss _var, 1; 定义变量定义变量.global _var; 声明为外部变量声明为外部变量C程序:程序:extern int var/声明为外部变量声明为外部变量var=1/访问变量访问变量 2525例例4-6,在,在C程序中访问不在程序中访问不在.bss段中定义的变量。段中定义的变量。汇编程序:汇编程序

18、:.global _sine;声明为外部变量声明为外部变量.sect “sine_tab”;建立一个独立的段建立一个独立的段_sine:;常数表起始地址常数表起始地址.float 0.0.float 0.015987.float 0.022145C程序:程序:extern float sine/声明为外部变量声明为外部变量float *sine_p=sine;/声明一个指针指向该变量声明一个指针指向该变量f=sine_p4; /作为普通数组访问作为普通数组访问sine数组数组26264.4.6 C24x DSP编译器的关键字编译器的关键字 C28x DSP C/C+编译器,支持标准的编译器,支

19、持标准的const、register、volatile等关键字等关键字, 还扩展了还扩展了cregister 、interrupt等关键字。等关键字。关键字关键字const 该关键字可以优化存储器的分配。加该关键字可以优化存储器的分配。加const到任何变到任何变量的定义可以确保其内的值不变。量的定义可以确保其内的值不变。2727关键字关键字volatile 该关键字所定义的变量是可变的,可以被其他硬件该关键字所定义的变量是可变的,可以被其他硬件修改,而不仅仅只能由修改,而不仅仅只能由C程序修改。优化器会尽量减少存程序修改。优化器会尽量减少存储器的访问,所以有时必须禁止优化,特别是循环控制储器

20、的访问,所以有时必须禁止优化,特别是循环控制变量。例子变量。例子 volatile unsigned int *ctrl; while (*ctrl != 0 xff) ; /循环等待,直到循环等待,直到 ctrl 地址的内容为地址的内容为0 xff2828关键字关键字interrupt 该扩展关键字用来说明函数是一个中断函数。该扩展关键字用来说明函数是一个中断函数。 中断函数被定义成返回中断函数被定义成返回void类型,而且无参数调用,类型,而且无参数调用,例如,例如,interrupt void int_handler( )unsigned int flags;2929关于中断函数关于中断

21、函数 中断的使能和屏蔽必须由程序员自己设置。中断的使能和屏蔽必须由程序员自己设置。 中断程序没有参数传递,既使说明,也会被忽略。中断程序没有参数传递,既使说明,也会被忽略。 中断处理程序不能被正常的中断处理程序不能被正常的C程序调用。程序调用。 在汇编语言中断程序中,注意在符号名前面加上一个下在汇编语言中断程序中,注意在符号名前面加上一个下划线,例如划线,例如c_int0记为记为_ c_int0。 中断程序使用的所有寄存器,包括状态寄存器和程序中中断程序使用的所有寄存器,包括状态寄存器和程序中调用函数使用的寄存器都必须予以保护。调用函数使用的寄存器都必须予以保护。3030例例4-7 1个个LE

22、D指示灯连接到指示灯连接到DSP的的XF引脚。用引脚。用C语言编程使之闪烁。语言编程使之闪烁。+3.3V+3.3V1k1kLEDLED4.5 DSP C程序举例程序举例3131/XF指示灯闪烁指示灯闪烁C程序,程序,xfdemo.c#include “f2407_c.h” / 2407 DSP片内外设寄存器定义头文件片内外设寄存器定义头文件void Delay (unsigned int nDelay); /延时子程序,函数声明延时子程序,函数声明main( )SCSR1=0 x0200;/设置时钟为设置时钟为2倍频倍频,CLKIN=10MHz, / CLKOUT=20MHz,并禁止外设并禁止外设WDCR=0 xe8;/禁止看门狗定时器禁止看门狗定时器 while(1) asm(“ clrc xf”); /LED亮亮Delay(500);/调用延时函数调用延时函数,延时延时500msasm(“ setc xf”); /LED灭灭Delay(500);/调用延时函数调用延时函数323

温馨提示

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

评论

0/150

提交评论