TMS320C6000系列DSP程序开发课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《TMS320C6000系列DSP程序开发课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TMS320C6000 系列 DSP 程序 开发 课件
- 资源描述:
-
1、4.14.24.34.44.54.6TMS320C6000系列系列DSP的的C/C+语言特点语言特点TMS320C6000系列系列DSP的的C/C+语言关键字语言关键字pragma伪指令伪指令初始化静态变量和全局变量初始化静态变量和全局变量TMS320C6000系列系列DSP的的C/C+代码优化代码优化C/C+语言和汇编语言的混合编程语言和汇编语言的混合编程4.1.1 TMS320C6000系列系列DSP的的C语言特点语言特点1标识符和常量标识符和常量l标识符的所有字符都是有意义的并且区分大小写,此特征适用于内部和外部的所有标识符;l源(主机)和执行(目标)字符集为ASCII码,不存在多字节字
2、符;l字符常量或者字符串常量中的十六进制或者八进制转义序列或者字符串常量具有高达32位的值;l具有多个字符的字符常量按序列中的最后一个字符编码,例如:abc=c。2数据类型数据类型表4-1列出了TMS320C6000编译器中各种标量数据类型、位数表示方式及取值范围,许多取值范围的值可以作为头文件limits.h中的标准宏使用。类 型位 数表示方式取值范围最小值最大值char,signed charunsigned charshortunsigned shortint,signed intunsigned intlong,signed longunsigned longenumfloatdoub
3、lelong doublepointers,references,pointer to data members8 bits8 bits16 bits16 bits32 bits32 bits40 bits40 bits32 bits32 bits64 bits64 bits32 bitsASCIIASCII2s complementBinary2s complementBinary2s complementBinary2s complementIEEE 32-bitIEEE 64-biiIEEE 64-bitBinary-1280-32 7680-2 147 483 6480-549 755
4、 813 8880-2 147 483 6481.175 494e-382.22 507 385e-3082.22 507 385e-308012725532 76765 5352 147 483 6474 294 967 295549 755 813 8871 099 511 627 7752 147 483 6473.40 282 346e+381.79 769 313e+3081.79 769 313e+3080 xFFFFFFFF3数据转换数据转换(1)浮点类型到整型的转换,截取0前面的整数部分。(2)指针类型和整数类型之间可以自由转换。4表达式表达式(1)当两个带符号的整数相除时,如
5、果其中有一个为负,则商为负,余数的符号与分子的符号相同。斜杠(/)用来求商,百分号(%)用来求余数。例如:10/-3=-3,-10/3=-310%-3=1,-10%3=-1(2)有符号数的右移为算术移位,即保留符号。5声明声明(1)寄存器存储类对所有的charsshortinteger和pointer类型有效。(2)结构体成员被打包为字。(3)整数类型的位段带有符号,位段被打包为从高位开始的字,并且不能超越字的边界。(4)中断关键字interrupt只能用于没有参数的void型函数。6预处理器预处理器预处理器忽略任何不支持的#pragma伪指令。TMS320C6000系列DSP编译器支持ISO
6、标准的C+语言,但与标准的C+又存在不同的特点:(1)并不包括完整的C+标准库支持,但是包括C子集和基本的语言支持。(2)支持C的库工具(C library facilities)的头文件不包括:,。(3)所包括的C+标准库头文件为和。(4)对bad_cast和bad_type_id的支持并不包括在typeinfo文件中。(5)不支持异常事件的处理。(6)默认情况下,禁止运行时类型的信息(RTTI)。RTTI允许在运行时确定各种类型的对象。它可以使用-rtti编译选项来使能。(7)如果两个类不相关,reinterpret_cast类型指向其中一个类成员的指针,不允许这个指针再指向另一个类的成员
7、。(8)不支持标准中tesp.res和temp.dep里描述的“在模板中绑定的二相名”。(9)不能实现模板参数。(10)不能实现模板的export关键字。(11)用typedef定义的函数类型不包括成员函数cv-qualifiers。(12)类成员模板的部分说明不能放在类定义的外部。1const关键字关键字(1)如果在一个对象定义的同时也指定了关键字volatile(如:volatile const int x),volatile关键字被分配到RAM(程序不会修改一个const volatile 的对象,但是程序外部的对象可能会被修改);(2)对象是auto存储类型(在堆栈中分配)。在以上的两
8、种情况下,为对象分配存储空间与不使用const关键字时是相同的。在一个定义中使用const关键字很重要,例如,下面代码的第一句定义了常量指针p为一个整型的变量,第二句定义了一个变量指针q为一个整型常量:int*const p&x;const int*q&x;使用const关键字,用户可以定义大常量表并将他们分配到系统ROM中。例如,分配一个ROM表,可以使用如下的定义:far const int digits=0,1,2,3,4,5,6,7,8,9;2cregister关键字关键字当对一个对象使用cregister关键字时,编译器将比较对象名和TMS320C6000的标准控制寄存器列表,如果名
9、字匹配,编译器将参照控制寄存器产生相应的代码。如果不匹配,编译器将产生一个错误。控制寄存器列表见表4-2。寄 存 器描 述寄 存 器描 述AMRCSRFADCRFAUCRFMCRGFPGFRICR寻址模式寄存器控制状态寄存器(仅C6700)浮点加法器配置寄存器(仅C6700)浮点辅助配置寄存器(仅C6700)浮点乘法器配置寄存器(仅C6400)Galois域多项式产生函数寄存器中断清除寄存器IERIFRIRPISRISTPNRP中断使能寄存器中断标记寄存器中断返回指针中断设置寄存器中断服务表指针不可屏蔽中断返回指针一旦声明该寄存器,用户就能够直接使用该寄存器名。下例为控制寄存器的声明和使用:【
10、例4.1】定义和使用控制寄存器。extern cregister volatile unsigned int AMR;extern cregister volatile unsigned int CSR;extern cregister volatile unsigned int IFR;extern cregister volatile unsigned int ISR;extern cregister volatile unsigned int ICR;extern cregister volatile unsigned int IER;extern cregister volatile
11、unsigned int FADCR;extern cregister volatile unsigned int FAUCR;extern cregister volatile unsigned int FMCR;main()printf(”AMR=%xn”,AMR);3interrupt关键字关键字当用户将interrupt关键字使用到函数的定义上时,编译器会按照中断函数要求的寄存器保存规则和中断返回的特殊顺序去保存寄存器,然后生成特殊的返回代码序列。用户可以将interrupt关键字和定义为void但没有参数的函数一起使用。中断函数体可以具有局部变量和自由的使用堆栈或者全局变量。如:in
12、terrupt void int_handler()unsighed int flags;.4near和和far关键字关键字语法上,near和far关键字被看做存储类别的变址数。它们出现在存储类别说明符和类型的前、后和中间。这两个存储器类别的变址数不能用于一个定义中。正确的使用实例代码如下:far static int x;static near int x;static int far x;far int foo();static far int foo();5restrict关键字关键字【例4.2】对指针使用关键字restrict。void func1(int*restrict a,int
13、*restrict b)/*此处为函数func1()的代码*/该例代码中关键字restrict的使用告诉编译器func1中的指针a和b指向的存储器范围不会交迭,即指针变量a和b对存储器的访问不会冲突,对一个指针变量的写操作不会影响另一个指针变量的读操作。【例4.3】对数组使用关键字restrict。void func2(int crestrict,int drestrict)int i;for(i=0;i 64;i+)/计算数组的累加和以及数组di的加1操作 ci+=di;di+=1;6volatile关键字关键字优化器分析数据流,尽可能地避免存储器的访问。如果用户将依赖于存储器访问的代码写在
14、C/C+程序中,则必须使用volatile关键字以识别这种访问。编译器不会优化任何对volatile变量的引用。下面的代码中,循环等待一个读为oxFF的单元:unsigned int*ctrl;while(*ctrl!=oxFF);该代码中,*ctrl是一个循环不变的表达式,因此该循环被优化为一个单存储器读。为了改正这些优化,可以定义*ctrl为:volatile unsigned int*ctrl7asm语句语句TMS320C6000的C/C+编译器可以将TMS320C6000汇编指令或者伪指令直接嵌入编译器输出的汇编语言文件。该功能是对C/C+语言的扩展,即asm语句。asm语句提供了C/
15、C+语言所不能提供的对硬件的访问。asm语句类似于调用一个名为asm的函数,该语句以一个字符串常数为参数,具体语法格式:asm(“assembler text”);编译器将参数直接复制到编译器的输出文件,汇编正文必须包含在双引号内。所有通常的字符串都保持它们原来的定义。例如,可插入一个包含引号的.string伪指令:asm(“str:.string”abc“”);pragma伪指令告诉编译器如何处理特定的函数、对象或者代码段。TMS320C6000的C/C+编译器支持下面的伪指令:CODE_SECTIONDATA_ALIGNDATA_MEM_BANKDATA_SECTIONFUNC_CANNO
16、T_INLINEFUNC_EXT_CALLEDFUNC_INTERRUPT_THRESHOLDFUNC_IS_PUREFUNC_IS_SYSTEMFUNC_NEVER_RETURNSFUNC_NO_GLOBAL_ASGFUNC_NO_IND_ASGINTERRUPTMUST_ITERATENMI_INTERRUPTPROB_ITERATESTRUCT_ALIGNUNROLL1CODE_SECTION指令指令CODE_SECTION指令用于为命名段中的符号指定空间。该指令在C语言中的语法格式为:#pragma CODE_SECTION(symbol,”section name”);该指令在C+语
17、言中的语法格式为:#pragma CODE_SECTION(”section name”);【例4.4】CODE_SECTION指令使用。C源文件:#pragma CODE_SECTION(fn,”my_sect”)int fn(int x)return x;此例使用#pragma CODE_SECTION(fn,my_sect),产生my_sect段,并把fn函数指定到my_sect段。汇编源文件:.sect”my_sect”.global _fn;*;*FUNCTION NAME:_fn*;*;*Regs Modified:SP*;*Regs Used:A4,B3,SP*;*Local F
18、rame Size:0 Args+4 Auto+0 Save=4 byte*;*_fn:;*RET.S2 B3;|6|SUB.D2 SP,8,SP;|4|STW.D2T1 A4,*+SP(4);|4|ADD.S2 8,SP,SP;|6|NOP 2;BRANCH OCCURS;|6|2DATA_SECTION指令指令DATA_SECTION指令为命名的段中符号指定空间。该指令在C语言中的语法格式为:#pragma DATA_SECTION(symbol,“section name”);该指令在C+语言中的语法格式为:#pragma DATA_SECTION(“section name”);【例4
19、.5】DATA_SECTION指令的使用。C源文件:#pragma DATA_SECTION(bufferB,”my_sect”)char bufferA512;char bufferB512;C+源文件:char bufferA512;#pragma DATA_SECTION(”my_sect”)char bufferB512;汇编源文件:.global _bufferA.bss _bufferA,512,4.global _bufferB_bufferB:.usect”my_sect”,512,43DATA_ALIGN指令指令DATA_ALIGN指令把符号对齐到边界。对齐的边界是符号默认的
20、最大界值或常量,常量是2的整数次幂。该指令在C语言中的语法如下:#pragma DATA_ALIGN(symbol,constant);该指令在C+中的语法如下:#pragma DATA_ALIGN(constant);4FUNC_CANNOT_INLINE指令指令FUNC_CANNOT_INLINE指令通知编译器,该命名的函数不能扩展为直接插入。任何使用pragma命令的函数会忽略由其他方式指定的直接插入。该指令必须出现在对函数的任何声明和引用之前。该指令在C语言中的语法格式为:#pragma FUNC_CANNOT_INLINE(func);该指令在C+语言中的语法格式为:#pragma
展开阅读全文