资源预览内容
第1页 / 共62页
第2页 / 共62页
第3页 / 共62页
第4页 / 共62页
第5页 / 共62页
第6页 / 共62页
第7页 / 共62页
第8页 / 共62页
第9页 / 共62页
第10页 / 共62页
亲,该文档总共62页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第15章DSP的C语言编程第15章DSP的C语言编程 15.1 DSP C语言简介15.1 DSP C语言简介 DSP生产厂商及第三方为DSP软件开发提供了DSP生产厂商及第三方为DSP软件开发提供了C编译器C编译器, 使得利用高级语言实现DSP程序的开发成为可能。 在TI公司的DSP , 使得利用高级语言实现DSP程序的开发成为可能。 在TI公司的DSP软件开发平台CCS中软件开发平台CCS中,又提供了,又提供了优化 的C编译器 优化 的C编译器,可以对C语言程序进行优化编译,提高 程序效率,目前 ,可以对C语言程序进行优化编译,提高 程序效率,目前在某些应用中C语言优化编译的结 果可以达到手工编写的汇编语言效率的90%以上 在某些应用中C语言优化编译的结 果可以达到手工编写的汇编语言效率的90%以上。 DSP生产厂商和相关公司也在 。 DSP生产厂商和相关公司也在不断对C优化不断对C优化编译器进 行改进 编译器进 行改进 设计,相信日后设计,相信日后C语言程序优化编译的效果C语言程序优化编译的效果会有会有进一 步的改善 进一 步的改善。 TMS320C2000系列TMS320C2000系列提供有提供有优化的C编译器优化的C编译器,它支持,它支持ANSIANSI (American National Standards Institute,(American National Standards Institute,美 国国家标准委员会 美 国国家标准委员会)开发的C语言标准,该C语言标准 是使用最广泛的C语言标准, )开发的C语言标准,该C语言标准 是使用最广泛的C语言标准,ANSI标准ANSI标准具有一些受目 标处理器、运行期环境或主机环境影响的C语言特 性,从有效性或实现上的考虑,这些特征在各种标 准的C编译器之间可能有不同。 具有一些受目 标处理器、运行期环境或主机环境影响的C语言特 性,从有效性或实现上的考虑,这些特征在各种标 准的C编译器之间可能有不同。 15.2 DSP C语言特性15.2 DSP C语言特性 15.2.1 TMS320C2000 C语言的特征15.2.1 TMS320C2000 C语言的特征 (1)标识符和常数(1)标识符和常数 所有标识符的所有标识符的前100个字符有意义前100个字符有意义,区分大小写区分大小写。 源(主机)和执行(目标) 。 源(主机)和执行(目标)字符集为ASCII码字符集为ASCII码,不 存在多字节字符 不 存在多字节字符。 具有 。 具有多个字符的多个字符的字符字符常数按序列中最后一个字符来编 码 常数按序列中最后一个字符来编 码,例如:,例如: abcabc = = = = c c (2)数据转换(2)数据转换 浮点到整数的转换浮点到整数的转换取整数部分取整数部分。 指针和整数可以自由转换。指针和整数可以自由转换。 (3)表达式(3)表达式 当当两个有符号整数相除两个有符号整数相除时,若其中一个为负,则其 商为负, 时,若其中一个为负,则其 商为负,余数的符号与分子的符号相同余数的符号与分子的符号相同。斜杠 (/) 斜杠 (/)用来用来求商求商,百分号(%)百分号(%)用来用来求余数求余数。例如: 10/-3 = -3,-10/3 = -3,10%-3 = 1, -10%3 = -1 。例如: 10/-3 = -3,-10/3 = -3,10%-3 = 1, -10%3 = -1 (4)声明(4)声明 寄存器变量寄存器变量对所有char,short,int和指针类型 有效。 对所有char,short,int和指针类型 有效。 interrupt关键字interrupt关键字仅可用于没有参量的void函数。仅可用于没有参量的void函数。 (5)预处理(5)预处理 预处理器预处理器忽略任何不支持的#pragma伪指令忽略任何不支持的#pragma伪指令。预处 理器支持的伪指令包括: 预处 理器支持的伪指令包括: CODE_SECTOINCODE_SECTOIN DATA_SECTIONDATA_SECTION FUNC_EXT_CALLEDFUNC_EXT_CALLED 15.2.2 TMS320C2000 C语言的数据类型15.2.2 TMS320C2000 C语言的数据类型 注:注:在TMS320C2x/C2xx/C5x C语言中,字节长度为16位,sizeof操作符返回 的对象长度是以16位为字节长度的字节数。例如sizeof(int) = 1。 在TMS320C2x/C2xx/C5x C语言中,字节长度为16位,sizeof操作符返回 的对象长度是以16位为字节长度的字节数。例如sizeof(int) = 1。 15.2.3 TMS320C2000 C语言的关键字15.2.3 TMS320C2000 C语言的关键字 const(常数)const(常数) ioport(I/O端口)ioport(I/O端口) interrupt(中断)interrupt(中断) near(近)near(近) far(远)far(远) volatile(可变的)volatile(可变的) 15.2.4 寄存器变量15.2.4 寄存器变量 TMS320C2000 C编译器在一个函数中TMS320C2000 C编译器在一个函数中最多可以使用两个 寄存器变量 最多可以使用两个 寄存器变量。寄存器变量的声明必须在变量列表或 函数的起始处进行 寄存器变量的声明必须在变量列表或 函数的起始处进行,在嵌套块中声明的寄存器变量 被处理为一般的变量。编译器使用AR6和AR7作为寄 存器变量: ,在嵌套块中声明的寄存器变量 被处理为一般的变量。编译器使用AR6和AR7作为寄 存器变量: AR6被赋给第一个寄存器变量AR6被赋给第一个寄存器变量 AR7被赋给第二个寄存器变量 寄存器变量的地址会被放入分配的寄存器中,这 样变量的访问速度会更快。 AR7被赋给第二个寄存器变量 寄存器变量的地址会被放入分配的寄存器中,这 样变量的访问速度会更快。16位类型的变量16位类型的变量 (char、(char、 short、int和指针)都可以被定义为寄存器变量。但 在运行时,设置一个寄存器变量大约需要4条指 令,为了更有效地使用这个功能, short、int和指针)都可以被定义为寄存器变量。但 在运行时,设置一个寄存器变量大约需要4条指 令,为了更有效地使用这个功能,仅当变量被访问 超过2次时,才使用寄存器变量。 仅当变量被访问 超过2次时,才使用寄存器变量。 程序优化编译器也会定义寄存器变量,但使用方式不 同。编译器会自己决定哪些变量作为寄存器变量, 程序中声明的寄存器变量会全部被忽略。 声明的格式为: register type reg; 程序优化编译器也会定义寄存器变量,但使用方式不 同。编译器会自己决定哪些变量作为寄存器变量, 程序中声明的寄存器变量会全部被忽略。 声明的格式为: register type reg; 15.2.5 pragma伪指令15.2.5 pragma伪指令 pragma伪指令通知编译器的预处理器如何处理函数。 TMS320C2000 C编译器支持下列pragma: pragma伪指令通知编译器的预处理器如何处理函数。 TMS320C2000 C编译器支持下列pragma: CODE_SECTIONCODE_SECTION DATA_SECTIONDATA_SECTION FUNC_EXT_CALLEDFUNC_EXT_CALLED 1. CODE_SECTION1. CODE_SECTION 这个伪指令在名称为section name的命名段中为 symbol分配空间。 这个伪指令在名称为section name的命名段中为 symbol分配空间。语法为:语法为: #pragma CODE_SECTION (symbol, #pragma CODE_SECTION (symbol, “section namesection name”);); 2. DATA_SECTION2. DATA_SECTION 这个伪指令在名称为section name的命名段中为 symbol分配空间。 这个伪指令在名称为section name的命名段中为 symbol分配空间。语法为:语法为: #pragma DATA_SECTION (symbol, #pragma DATA_SECTION (symbol, “section name section name”);); 3. FUNC_EXT_CALLED3. FUNC_EXT_CALLED 当使用-pm选项时,编译器将使用程序级的优化。 在这个优化层次中,编译器将删除所有未被main函 数直接或间接调用的函数。 当使用-pm选项时,编译器将使用程序级的优化。 在这个优化层次中,编译器将删除所有未被main函 数直接或间接调用的函数。 而用户程序里可能包含要被手工编写的汇编语言程序 调用而没有被main函数调用的函数,这时就应该用 FUNC_EXT_CALLED来通知编译器保留此函数和被此函 数调用到的函数,这些函数将作为 而用户程序里可能包含要被手工编写的汇编语言程序 调用而没有被main函数调用的函数,这时就应该用 FUNC_EXT_CALLED来通知编译器保留此函数和被此函 数调用到的函数,这些函数将作为C程序的入口点。C程序的入口点。 这个伪指令必须出现在对要保留的函数的任何声明或 引用之前,其 这个伪指令必须出现在对要保留的函数的任何声明或 引用之前,其语法为: #pragma FUNC_EXT_CALLED (func); 语法为: #pragma FUNC_EXT_CALLED (func); 15.2.6 asm语句15.2.6 asm语句 TMS320C2000 C编译器可以在编译器输出的汇编语言程 序中直接输出汇编指令或语句。利用asm语句嵌入 TMS320C2000 C编译器可以在编译器输出的汇编语言程 序中直接输出汇编指令或语句。利用asm语句嵌入 汇编语言程序,可以汇编语言程序,可以实现一些C语言难以实现或实现起 来比较麻烦的硬件控制功能 实现一些C语言难以实现或实现起 来比较麻烦的硬件控制功能。 asm语句在语法上就象是调用一个函数名为asm的函 数,函数参数是一个字符串: asm ( asm语句在语法上就象是调用一个函数名为asm的函 数,函数参数是一个字符串: asm (“assembler textassembler text”); 编译器会直接将参数字符串复制到输出的汇编语言程 序中,因此必须保证参数双引号之间的字符串是一 个有效的汇编语言指令。双引号之间的 ); 编译器会直接将参数字符串复制到输出的汇编语言程 序中,因此必须保证参数双引号之间的字符串是一 个有效的汇编语言指令。双引号之间的汇编指令必 须以空格、制表符(TAB)、标记符(LABEL)或注 释开头 汇编指令必 须以空格、制表符(TAB)、标记符(LABEL)或注 释开头,这和汇编语言编程的要求是一致的。,这和汇编语言编程的要求是一致的。编译 器不会检查此汇编语句是否合法 编译 器不会检查此汇编语句是否合法,如果语句中有,如果语句中有 错误,在汇编的过程中会被汇编器指出。错误,在汇编的过程中会被汇编器指出。 使用asm指令的时候应小心使用asm指令的时候应小心不要破坏C语言的环境不要破坏C语言的环境。如 果C代码中 。如 果C代码中插入跳转指令和标记符插入跳转指令和标记符可能会可能会引起不可预 料的操作结果 引起不可预 料的操作结果。能够改变段或其它影响C语言环境的 指令也可能引起麻烦。 对包含asm语句的程序 。能够改变段或其它影响C语言环境的 指令也可能引起麻烦。 对包含asm语句
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号