欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第15章 DSP的C语言编程.pdf

    • 资源ID:70322551       资源大小:972.86KB        全文页数:49页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第15章 DSP的C语言编程.pdf

    第1 5 章D S P 的C 语言编程1 5.1 D S P C 语言简介第1 5 章D S P 的C 语言编程1 5.1 D S P C 语言简介DSP生产厂商及第三方为生产厂商及第三方为DSP软件开发提供了软件开发提供了C编译器,使得利用高级语言实现编译器,使得利用高级语言实现DSP程序的开发成为可能。在程序的开发成为可能。在TI公司的公司的DSP软件开发平台软件开发平台CCS中,又提供了中,又提供了优化的优化的C编译器编译器,可以对,可以对C语言程序进行优化编译,提高程序效率,目前语言程序进行优化编译,提高程序效率,目前在某些应用中在某些应用中C语言优化编译的结果可以达到手工编写的汇编语言效率的语言优化编译的结果可以达到手工编写的汇编语言效率的90%以上以上。DSP生产厂商和相关公司也在不断对生产厂商和相关公司也在不断对C优化编译器进行改进设计,相信日后优化编译器进行改进设计,相信日后C语言程序优化编译的效果会有进一步的改善。语言程序优化编译的效果会有进一步的改善。TMS320C2000系列提供有优化的系列提供有优化的C编译器,它支持编译器,它支持ANSI(American National Standards Institute,美国国家标准委员会)开发的,美国国家标准委员会)开发的C语言标准。该语言标准。该C语言标准是使用最广泛的语言标准是使用最广泛的C语言标准,语言标准,ANSI标准具有一些受目标处理器、运行期环境或主机环境影响的标准具有一些受目标处理器、运行期环境或主机环境影响的C语言特性,从有效性或实现上的考虑,这些特征在各种标准的语言特性,从有效性或实现上的考虑,这些特征在各种标准的C编译器之间可能有不同。编译器之间可能有不同。1 5.2 D S P C 语言特性1 5.2.1 T MS 3 2 0 C 2 0 0 0 C 语言的特征1 5.2 D S P C 语言特性1 5.2.1 T MS 3 2 0 C 2 0 0 0 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伪指令伪指令。预处理器支持的伪指令包括:。预处理器支持的伪指令包括:nCODE_SECTOINnDATA_SECTIONnFUNC_EXT_CALLED1 5.2.2 T MS 3 2 0 C 2 0 0 0 C 语言的数据类型1 5.2.2 T MS 3 2 0 C 2 0 0 0 C 语言的数据类型注:注:在T M S 3 2 0 C 2 x/C 2 x x/C 5 xC 语言中,在T M S 3 2 0 C 2 x/C 2 x x/C 5 xC 语言中,字节长度为1 6 位字节长度为1 6 位,s i z e o f 操作符返回的对象长度是以1 6 位为字节长度的字节数。例如,s i z e o f 操作符返回的对象长度是以1 6 位为字节长度的字节数。例如s i z e o f(i n t)=1s i z e o f(i n t)=1。1 5.2.3 T MS 3 2 0 C 2 0 0 0 C 语言的关键字1 5.2.3 T MS 3 2 0 C 2 0 0 0 C 语言的关键字nc o n s t(常数)c o n s t(常数)ni o p o r t(I/O 端口)i o p o r t(I/O 端口)ni n t e r r u p t(中断)i n t e r r u p t(中断)nn e a r(近)n e a r(近)nf a r(远)f a r(远)nv o l a t i l e(可变的)v o l a t i l e(可变的)1 5.2.4 寄存器变量1 5.2.4 寄存器变量TMS320C2000 C编译器在一个函数中编译器在一个函数中最多可以使用两个寄存器变量最多可以使用两个寄存器变量。寄存器变量的声明必须在变量列表或函数的起始处进行寄存器变量的声明必须在变量列表或函数的起始处进行,在嵌套块中声明的寄存器变量被处理为一般的变量。编译器使用,在嵌套块中声明的寄存器变量被处理为一般的变量。编译器使用AR6和和AR7作为寄存器变量:作为寄存器变量:nAR6被赋给第一个寄存器变量被赋给第一个寄存器变量nAR7被赋给第二个寄存器变量寄存器变量的地址会被放入分配的寄存器中,这样变量的访问速度会更快。被赋给第二个寄存器变量寄存器变量的地址会被放入分配的寄存器中,这样变量的访问速度会更快。16位类型的变量位类型的变量(char、short、int和指针)都可以被定义为寄存器变量。但在运行时,设置一个寄存器变量大约需要和指针)都可以被定义为寄存器变量。但在运行时,设置一个寄存器变量大约需要4条指令,为了更有效地使用这个功能,条指令,为了更有效地使用这个功能,仅当变量被访问超过仅当变量被访问超过2次时,才使用寄存器变量。次时,才使用寄存器变量。程序优化编译器也会定义寄存器变量,但使用方式不同。编译器会自己决定哪些变量作为寄存器变量,程序中声明的寄存器变量会全部被忽略。声明的格式为:程序优化编译器也会定义寄存器变量,但使用方式不同。编译器会自己决定哪些变量作为寄存器变量,程序中声明的寄存器变量会全部被忽略。声明的格式为:register type reg;1 5.2.5 p r a g ma 伪指令1 5.2.5 p r a g ma 伪指令pragma伪指令通知编译器的预处理器如何处理函数。伪指令通知编译器的预处理器如何处理函数。TMS320C2000 C编译器支持下列编译器支持下列pragma:nCODE_SECTIONnDATA_SECTIONnFUNC_EXT_CALLED1.CODE_SECTION这个伪指令在名称为这个伪指令在名称为section name的命名段中为的命名段中为symbol分配空间。语法为:分配空间。语法为:#pragma CODE_SECTION(symbol,“section name”);2.DATA_SECTION这个伪指令在名称为这个伪指令在名称为section name的命名段中为的命名段中为symbol分配空间。语法为:分配空间。语法为:#pragma DATA_SECTION(symbol,“section name”);3.FUNC_EXT_CALLED当使用当使用-pm选项时,编译器将使用程序级的优化。在这个优化层次中,编译器将删除所有未被选项时,编译器将使用程序级的优化。在这个优化层次中,编译器将删除所有未被main函数直接或间接调用的函数。而用户程序里可能包含要被手工编写的汇编语言程序调用而没有被函数直接或间接调用的函数。而用户程序里可能包含要被手工编写的汇编语言程序调用而没有被main函数调用的函数,这时就应该用函数调用的函数,这时就应该用FUNC_EXT_CALLED来通知编译器保留此函数和被此函数调用到的函数,这些函数将作为来通知编译器保留此函数和被此函数调用到的函数,这些函数将作为C程序的入口点程序的入口点。这个伪指令必须出现在对要保留的函数的任何声明或引用之前,其语法为:。这个伪指令必须出现在对要保留的函数的任何声明或引用之前,其语法为:#pragma FUNC_EXT_CALLED(func);1 5.2.6 a s m语句1 5.2.6 a s m语句TMS320C2000 C编译器可以在编译器输出的汇编语言程序中直接输出汇编指令或语句。利用编译器可以在编译器输出的汇编语言程序中直接输出汇编指令或语句。利用asm语句嵌入汇编语言程序,可以语句嵌入汇编语言程序,可以实现一些实现一些C语言难以实现或实现起来比较麻烦的硬件控制功能语言难以实现或实现起来比较麻烦的硬件控制功能。asm语句在语法上就象是调用一个函数名为语句在语法上就象是调用一个函数名为asm的函数,函数参数是一个字符串:的函数,函数参数是一个字符串:asm(“assembler text”);编译器会直接将参数字符串复制到输出的汇编语言程序中,因此必须保证参数双引号之间的字符串是一个有效的汇编语言指令。双引号之间的编译器会直接将参数字符串复制到输出的汇编语言程序中,因此必须保证参数双引号之间的字符串是一个有效的汇编语言指令。双引号之间的汇编指令必须以空格、制表符(汇编指令必须以空格、制表符(TAB)、标记符()、标记符(LABEL)或注释开头)或注释开头,这和汇编语言编程的要求是一致的。,这和汇编语言编程的要求是一致的。编译器不会检查此汇编语句是否合法编译器不会检查此汇编语句是否合法,如果语句中有错误,在汇编的过程中会被汇编器指出。,如果语句中有错误,在汇编的过程中会被汇编器指出。使用使用asm指令的时候应小心指令的时候应小心不要破坏不要破坏C语言的环境语言的环境。如果。如果C代码中代码中插入跳转指令和标记符插入跳转指令和标记符可能会引起不可预料的操作结果。能够改变段或其它影响可能会引起不可预料的操作结果。能够改变段或其它影响C语言环境的指令也可能引起麻烦。对包含语言环境的指令也可能引起麻烦。对包含asm语句的程序语句的程序使用优化器时要特别小心使用优化器时要特别小心。尽管优化器不能删除。尽管优化器不能删除asm指令,但它可以重新安排指令,但它可以重新安排asm指令附近的代码顺序,这样就可能会引起不期望的结果。指令附近的代码顺序,这样就可能会引起不期望的结果。1 5.2.7 访问I/O空间1 5.2.7 访问I/O空间读写读写I/O空间的功能是空间的功能是TMS320C2000 C编译器对标准编译器对标准C的扩展,是利用关键字的扩展,是利用关键字ioport(I/O端口)来实现的。该关键字的用法为:端口)来实现的。该关键字的用法为:ioport type porthexnum;nioport指示这是定义一个端口变量的关键字。指示这是定义一个端口变量的关键字。ntype(类型)必须是(类型)必须是char(字符)、(字符)、short(短整型)、(短整型)、int(整型)或对应的无符号类型。(整型)或对应的无符号类型。nporthexnum为定义的端口变量,为定义的端口变量,其格式必须是“其格式必须是“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;/*读端口读端口10h,加上,加上b,结果赋给,结果赋给a*/port10+=a;/*读端口读端口10h,加上,加上a,结果写回到端口,结果写回到端口10h*/在在进行函数调用进行函数调用的时候,可以做的时候,可以做I/O端口变量的值传递,而不是引用:端口变量的值传递,而不是引用:call(port10);/*读端口读端口10h,将其值传递给函数调用,将其值传递给函数调用*/call(&port10);/*引用传递无效!引用传递无效!*/1 5.2.8 访问数据空间1 5.2.8 访问数据空间访问访问DSP数据空间是利用指针来实现的数据空间是利用指针来实现的:*(unsigned int*)0 x1000=a;/*将将a的值写入数据空间的值写入数据空间1000h地址地址*/b=*(unsigned int*)0 x1000;/*读出数据空间读出数据空间1000h地址的值,赋给地址的值,赋给b*/可见可见访问访问DSP数据空间地址不需要对要访问的单元预先定义数据空间地址不需要对要访问的单元预先定义,利用指针直接访问就可以了。这样,利用指针直接访问就可以了。这样,访问数据空间很容易实现循环结构访问数据空间很容易实现循环结构。for(i=0;iVECS PAGE 0.text:PROG PAGE 0.cinit:PROG PAGE 0.data:PROG PAGE 0.stack:IDATA2 PAGE 1.bss:IDATA2 PAGE 1.reg240 x:REG_MEM PAGE 11 5.7.4 头文件1 5.7.4 头文件头文件头文件2407c.h主要定义主要定义TMS320LF2407的的片内外设控制寄存器片内外设控制寄存器。此文件在利用。此文件在利用TMS320LF2407进行的各种开发中可以通用。进行的各种开发中可以通用。1 5.7.5 汇编文件1 5.7.5 汇编文件示例程序中没有利用汇编语言编写控制程序,但由于对定时器中断的处理采用回调方式,需要编写汇编文件示例程序中没有利用汇编语言编写控制程序,但由于对定时器中断的处理采用回调方式,需要编写汇编文件定义中断向量表定义中断向量表。.r e f _ g p t i m e 1,_ c _ i n t 0.s e c t .v e c t o r s R S V E C T B _ c _ i n t 0 ;R e s e t V e c t o rI N T 1 B P H A N T O M ;I n t e r r u p t L e v e l 1I N T 2 B _ g p t i m e 1;I n t e r r u p t L e v e l 2I N T 3 B G I S R 3 ;I n t e r r u p t L e v e l 3.r e f _ g p t i m e 1,_ c _ i n t 0.s e c t .v e c t o r s R S V E C T B _ c _ i n t 0 ;R e s e t V e c t o rI N T 1 B P H A N T O M ;I n t e r r u p t L e v e l 1I N T 2 B _ g p t i m e 1;I n t e r r u p t L e v e l 2I N T 3 B G I S R 3 ;I n t e r r u p t L e v e l 31 5.7.6 C 文件1 5.7.6 C 文件(1)声明部分()声明部分(2)主函数()主函数(3)初始化定时器函数)初始化定时器函数gp_init(4)定时器中断服务函数)定时器中断服务函数gptime1void interrupt gptime1(void)uWork=(*PIVR);/*读外设中断向量寄存器读外设中断向量寄存器*/switch(uWork)case 0 x27:/*T1PINT,0 x27为定时器为定时器1的周期中断的向量值的周期中断的向量值*/(*EVAIFRA)=0 x80;/*清除中断标志清除中断标志T1PINT*/break;1 5.7.7 实例总结1 5.7.7 实例总结实例功能要求虽然简单,却包含了实例功能要求虽然简单,却包含了DSP控制程序设计中的许多问题,包括:(控制程序设计中的许多问题,包括:(1)各种文件的编写各种文件的编写:头文件(:头文件(.h)、链接命令文件()、链接命令文件(.cmd)、汇编代码文件()、汇编代码文件(.asm)、)、C源文件(源文件(.c);();(2)数据空间的读写数据空间的读写,对各种片内外设控制寄存器的设置都是通过数据空间的写操作实现的;(,对各种片内外设控制寄存器的设置都是通过数据空间的写操作实现的;(3)I/O空间的读写空间的读写,四个发光二极管的显示控制就是通过对,四个发光二极管的显示控制就是通过对I/O空间的写操作实现的;(空间的写操作实现的;(4)中断服务函数的编写中断服务函数的编写,程序中的,程序中的gptime1函数是一个中断服务函数,从函数定义到两级中断服务函数的结构都是函数是一个中断服务函数,从函数定义到两级中断服务函数的结构都是DSP C语言编程中常用的中断处理方法;(语言编程中常用的中断处理方法;(5)中断向量表的定义中断向量表的定义,虽然实例程序中只有一个自定义中断服务函数,但中断向量表的定义方法在各种,虽然实例程序中只有一个自定义中断服务函数,但中断向量表的定义方法在各种DSP应用中是类似的。实例程序已经覆盖到了应用中是类似的。实例程序已经覆盖到了DSP控制程序设计中大多数常见的问题,而在实际应用中可能存在的各种复杂问题的解决方法则需要在应用中深入研究。控制程序设计中大多数常见的问题,而在实际应用中可能存在的各种复杂问题的解决方法则需要在应用中深入研究。结束结束

    注意事项

    本文(第15章 DSP的C语言编程.pdf)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开