- 1、本文档共72页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[信息与通信]第15章_DSP的C语言编程
第15章 DSP的C语言编程 15.1 DSP C语言简介 软件开发平台为CCS。 CCS中提供了优化的C编译器,优化编译结果达手工编写的汇编语言效率的90%以上。 厂商和相关公司也在不断对C优化编译器进行改进. 相信C语言程序优化编译的效果会有进一步改善。 优化的C编译器,它支持ANSI C语言标准。(标准C,American National Standards Institute,美国国家标准委员会) ANSI 标准具有一些受目标处理器、运行期环境或主机环境影响的C语言特性,从有效性或实现上的考虑,这些特征在各种标准的C编译器之间可能有不同。 15.2 DSP C语言特性 15.2.1 TMS320C2000 C语言的特征 (1)标识符和常数 所有标识符的前100个字符有意义,区分大小写。 源(主机)和执行(目标)字符集为ASCII码,不存在多字节字符。 具有多个字符的字符常数按序列中最后一个字符来编码,例如: ‘abc’ = = ‘c’ (2)数据转换 浮点到整数的转换,取整数部分。 指针和整数可以自由转换。 (3)表达式 当两个有符号整数相除时,若其中一个为负,则其商为负,余数的符号与分子的符号相同。 斜杠(/)用来求商,例如: 10/-3 = -3, -10/3 = -3, 百分号(%)用来求余数,例如: 10%-3 = 1, -10%3 = -1 (4)声明 寄存器变量对所有char,short,int和指针类型有效。 interrupt关键字仅可用于没有参量的void函数。 (5)预处理 预处理器忽略任何不支持的#pragma伪指令。 预处理器支持的伪指令包括: CODE_SECTOIN DATA_SECTION FUNC_EXT_CALLED 15.2.2 TMS320C2000 C语言的数据类型 15.2.3 TMS320C2000 C语言的关键字 const(常数) ioport(I/O端口) interrupt(中断) near(近) far(远) volatile(可变的) 15.2.4 寄存器变量 一个函数中最多可使用两个寄存器变量。 寄存器变量的声明必须在变量列表或函数的起始处进行,在嵌套块中声明的寄存器变量被处理为一般的变量。 编译器使用AR6和AR7作为寄存器变量: AR6被赋给第一个寄存器变量 AR7被赋给第二个寄存器变量 寄存器变量的地址会被放入分配的寄存器中,这样变量的访问速度会更快。 实现起来比较麻烦的硬件控制功能。 asm语句在语法上就象是调用一个函数名为asm的函数,函数参数是一个字符串: asm (“assembler text”); 编译器会直接将参数字符串复制到输出的汇编语言程序中,因此必须保证参数双引号之间的字符串是一个有效的汇编语言指令。 双引号之间的汇编指令必须以空格、制表符(TAB)、标记符(LABEL)或注释开头,这和汇编语言编程的要求是一致的。 编译器不会检查此汇编语句是否合法,如果语句中有错误,在汇编的过程中会被汇编器指出。 使用asm指令应小心不要破坏C语言的环境。如果C代码中插入跳转指令和标记符可能会引起不可预料的操作结果。能够改变段或其它影响C语言环境的指令也可能引起麻烦。 对包含asm语句的程序使用优化器时要特别小心。优化器可以重新安排asm指令附近的代码顺序,这样就可能会引起不期望的结果。 15.2.7 访问I/O空间 读写I/O空间的功能是TMS320C2000 C编译器对标准C的扩展,是利用关键字ioport(I/O端口)来实现的。 关键字的用法:ioport type porthexnum; ioport指示这是定义一个端口变量的关键字。 type(类型)必须是char(字符)、short(短整型)、int(整型)或对应的无符号类型。 Porthexnum为定义的端口变量,其格式为“port”后面跟一个16进制数。 例如“port000A”是定义访问I/O空间地址0Ah的变量。 所有I/O端口的定义必须在文件级完成,不支持在函数级声明的I/O端口变量。 利用ioport关键字定义的I/O端口变量可以象一般变量一样进行赋值操作: ioport unsinged port10; /*访问I/O空间10h的变量*/ { port10 = a; /*将a写到端口10h*/ b = port10; /*从端口10h读入b*/ } 端口变量的使用不仅限于赋值操作,用ioport关键字定义的I/O端口变量可以象其它变量一样用在表达式中,例如: a = port10 + b; /*读端口1
文档评论(0)