第6章-基于C语言的DSP芯片开发-课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第6章-基于C语言的DSP芯片开发-课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 语言 DSP 芯片 开发 课件
- 资源描述:
-
1、第6章 基于C语言的DSP芯片开发 第第6章章 基于基于C语言的语言的DSP芯片开发芯片开发 6.1 引言6.2 ANSI C编译器6.3 C语言编程基础知识6.4 基于C语言的DSP芯片开发的运行环境6.5 C语言与汇编语言的混合编程本章小结思考题与习题第6章 基于C语言的DSP芯片开发 6.1 引引 言言DSP的C语言编程的主要内容包括ANSI C语言编译器,运行环境,运行支持库的使用与建立,I/O编程,C语言编程的各种工具的使用,以及C调试器的使用等主要内容。限于篇幅,本章主要对ANSI C编译器和与C语言编程息息相关的运行环境以及有关C语言基础知识做一介绍。第6章 基于C语言的DSP芯
2、片开发 6.2 ANSI C编译器编译器6.2.1 优化优化ANSI C编译器编译器TMS320C3x/C4x编译器支持ANSI(American National Standards Institute)开发的C语言标准。该标准是使用最广泛的C语言标准,它规定C语言的一些特征受目标处理器、运行环境或主机环境影响。下面就TMS320C3x/C4x C语言的一些不同于标准C语言的特征给予介绍。第6章 基于C语言的DSP芯片开发 1标识符和常数(1)所有标识符的前100个字符有意义,区分大小写。这些标示符适用于内部和外部的标识符。(2)源(主机)和执行(目标)字符集为ASCII码,不存在多字节字符
3、。(3)字符常数或字符串常数中的十六进制或八进制转义序列可具有高达32位的值。(4)具有多个字符的字符常数按序列中的最后一个字符来编码,例如:abc=c。第6章 基于C语言的DSP芯片开发 2数据类型数据类型(1)整数、双精度等数据类型长度与常见编译器中的数据类型不同,所有的浮点数型都是用二进制浮点数格式来表示的。(2)size_t(sizeof操作符的结果)定义为unsigned int。(3)ptrdiff_t(指针加减的结果)定义为int。3数据转换数据转换 (1)浮点数到整数的转换部分取整数部分。(2)指针和整数可自由转换。第6章 基于C语言的DSP芯片开发 4表达式表达式(1)当两个
4、带符号的整数相除时,若其中一个为负,则其商为负,余数的符号与分子的符号相同。“/”表示求商,“%”表示求余。带符号的模运算取被除数的符号。如:10/-3=-3;-10/3=-3;10%-3=1;-10%3=-1(2)带符号数的右移为算术右移,即保留符号。第6章 基于C语言的DSP芯片开发 5声明声明(1)寄存器存储类对所有character、short、integer和pointer类型都有效。(2)结构成员不能被打包成字,除位域外,每个成员对准在16位字的边界。(3)整数类型的位域带有符号,位域从字的低位开始被打包成字,并且不超过字边界。6预处理器预处理器预处理器忽略所有不支持的#pragm
5、a伪指令,支持#pragma的伪指令见后面的内容。第6章 基于C语言的DSP芯片开发 ANSI C编译器的主要功能是:首先将DSP的C语言程序转化为汇编语言程序,然后按汇编语言程序调试手段进行调试;ANSI C编译器支持代码级调试。采用ANSI C语言进行DSP软件编程具有的优点包括:1标准化标准化C语言是一种非常便于移植的编程语言,尤其是在语言的扩展方面,但缺乏标准化,而ANSI C则为这些扩展提供了新的标准。第6章 基于C语言的DSP芯片开发 2兼容性兼容性ANSI C标准是K&R标准的超集。在绝大多数编译器下调试并运行的程序都可以在优化ANSI C编译器下运行。ANSI C的兼容性还有另
6、一个含义,就是通过简单的修改即可适用于TI公司的其他芯片。3补充新类型补充新类型补充的新类型主要是指新的const以及Volatile类型。它们允许对C语言程序进行更有效的优化。第6章 基于C语言的DSP芯片开发 4改进的函数约定改进的函数约定函数原型允许改进的类型检查并允许对函数调用进行优化。优化ANSI C编译器时主要考虑了三个方面的优化:(1)产生的汇编程序在效率上可与手工编写的汇编程序相比;(2)提供简单的C运行环境的程序接口,使得关键的DSP算法可用汇编语言实现;(3)为用C语言开发高性能DSP应用程序建立一定规模的库,它们都可以被方便地使用。第6章 基于C语言的DSP芯片开发 总的
7、来说,优化ANSI C编译器的主要特征包括:与ANSI C功能规范完全兼容。具有ANSI C标准运行支持库。程序可转化为ROM装载的格式,可重定位、重入。提供与汇编语言的接口,允许对时间敏感的程序用汇编语言编写。灵活而全面的链接器可以对内存重定位、内存设置、部分链接进行全面的控制,而且还可以对代码进行运行时的重定位。第6章 基于C语言的DSP芯片开发 提供了一个外壳程序(shell),允许进一步将C语言转化为可执行文件。快速的开发速度。提供大量有用的提示,以支持对C程序进行方便的编程和调试。支持行内扩展。可以对库进行管理,包括对库进行文件的增加、删除、或替换,还可以将目标文件库用作链接器的输入
8、。第6章 基于C语言的DSP芯片开发 提供丰富的列表文件,如源代码和汇编的交叉列表、预处理输出文件等。TMS320C3x/4x ANSI C编译器具有可为全局变量、静态变量和常数提供无限空间的大存储器模式。缺省的小存储模式,其空间限制为64K字,使编码执行速度更快、效率更高。C外壳程序提供了许多选项用于控制C编译汇编和链接的过程。C语言编译汇编和链接的常用的选项如表6.1所示。第6章 基于C语言的DSP芯片开发 表表6.1 C语言编译汇编和链接的常用选项语言编译汇编和链接的常用选项第6章 基于C语言的DSP芯片开发 6.2.2 优化编译器优化编译器C编译器提供了一个优化编译器。采用优化编译可以
9、生成高效率的汇编代码,从而提高程序的运行速度,减少目标代码的长度。在一定程度上可以认为,C编译器的效率主要取决于C编译器所能进行优化的范围和数量。C编译器的优化方法可以分为两类,即通用优化和特定优化。第6章 基于C语言的DSP芯片开发 对C语言的通用优化的范围主要包括:简化表达式;优化数据流;删除公共子表达式和冗余分配;优化跳转;简化控制流;优化与循环有关的重复;将循环体内的计算值不变的表达式移至循环体前;运行支持库函数的行内扩展;第6章 基于C语言的DSP芯片开发 对DSP芯片的特定优化的主要内容包括:有效地使用寄存器;自动增减寄存器寻址方式;使用块重复;使用并行指令;使用延迟跳转。第6章
10、基于C语言的DSP芯片开发 下面主要对浮点DSP芯片的特定优化作一详细介绍。1)优化寄存器变量的使用编译器将最大程度地利用寄存器存储局部变量、参数及中间值。将数据存储在寄存器中要比将数据存储在存储器中的程序的运行效率高。在将数组结构转化为循环时,这一优化显得尤其有效。第6章 基于C语言的DSP芯片开发 例6.1 优化寄存器变量的使用。C语言程序:int gvar;reg(int i,int j)gvar=call()&i;j=gvar+i;浮点DSP编译器输出程序:_reg:*R4分配给用户变量i *R5分配给用户变量j第6章 基于C语言的DSP芯片开发 CALL _call ;R0=call
11、()AND R4,R0 ;R0&=i STI R0,_gvar ;gvar=R0 ADDI R4,R0,R5 ;将gvar保留在R0中 ;将结果放到R5(j)中编译器在编译时,将i,j分别赋予R4,R5,将gvar保留在R0。这样gvar的运算成了3操作数运算,结果j直接放在RS中。可见,充分利用寄存器可提高程序的运行效率。第6章 基于C语言的DSP芯片开发 2)效率最优的寄存器分配编译器根据用户变量和中间值的类型与使用频率来对寄存器进行分配,在循环体内的变量比其他变量有更高的优先级,相互之间不覆盖的变量可以被分配给同一寄存器。3)并行指令许多类型的指令,如装载/装载、存储/操作/乘/加,可以
12、配对并行执行。当相邻符号满足并行运行的寻址要求时,编译器使它们并行运行。虽然这一功能已由代码生产工具完成,但优化还是对提高上述情况的运行效率起了很大的作用,因为操作数被更多地放到了寄存器中,进一步提高了运行速度。第6章 基于C语言的DSP芯片开发 4)自增寻址模式对于*P+,*-P这样的表达式,编译器可以使用高效的自增寻址模式。在许多场合,循环中的数组值被逐个使用。如:for(i=0;i,=N;+i)ai;这时,编译器通过自增寄存器变量指针把数组参数转化为间接寻址参数。5)块重复浮点编译器通过RPTS和RPTB指令实现过零循环。编译器能发现通过计算机控制的循环,并使用高效的RPTB和RPTS来
13、实现循环。这两种方式中,调整量可以是常数,也可以是表达式。第6章 基于C语言的DSP芯片开发 例6.2 块重复,自增寻址模式和并行运算。C语言程序:float a1,b10;scale(float k)int i;for(i=0;i10;+i)ai=bi*k;第6章 基于C语言的DSP芯片开发 浮点DSP编译器输出:_scaleLDI CONST+0,AR4 ;AR4=&a0LDI CONST+1,AR5 ;AR5=&b0MPYF R4,*AR5+,R0 ;计算第一个结果RPTS 8 ;STF R0,*AR4+;保存这一结果|MPYF R4,*AR5+,R0 ;开始计算另一个结果STF R0,
14、*AR4+;保存最后一个结果第6章 基于C语言的DSP芯片开发 6)延迟跳转指令浮点DSP支持延迟跳转指令。它与普通的跳转指令比起来,可以节省三个指令周期的运行时间。延迟跳转指令是在执行完其后的三条指令后才发生真正的跳转,编译器尽可能实现无条件的延迟跳转指令,并在计数循环的场合使用条件延迟跳转指令。第6章 基于C语言的DSP芯片开发 例6.3 延迟跳转指令。C语言程序:wait(volatile int*p)for(;)if(*p&0 x80)*p|=0 xf0;浮点DSP编译器输出程序:_wait:L6:第6章 基于C语言的DSP芯片开发 LDI *AR4,R0;R0=*p(AR4被分配给p
15、)TSTB 128,R0 ;test*p&0 x80BZ L6 ;结果为假,采用直接跳转返回BD L6 ;结果为真,采用延迟跳转返回LDI *AR4,R0 ;R0=*pOR 0F0h,R0 ;R0=*p|0 xF0STI R0,*AR4 ;*p=R0*BL6 ;结果为真时的真正跳转发生在这里第6章 基于C语言的DSP芯片开发 7)使用寄存器避免冲突编译器支持一项新的可选用的调用顺序。它通过寄存器而非压入堆栈的方法来避免冲突。这在程序调用时,可以明显改善程序的性能。8)条件指令在C语言中往往有条件语句,如:a=conditional expr1:expr2 或(condition)a=b这时编译
16、器使用条件指令来减少分支。第6章 基于C语言的DSP芯片开发 9)循环体重复块重复并不是用的越多越好,这要视具体情况而定。当编译器发现循环次数与循环体长度都很小时,它将不使用循环结构,改为使用多次重复运行代码段的循环体重复的方式。这样可以避免分支或块重复造成的跳转或判断开销,提高运行效率。第6章 基于C语言的DSP芯片开发 6.3 C语言编程基础知识语言编程基础知识6.3.1 数据类型数据类型所有整数类型(char、short、int、long以及对应的无符号数)都是相同的,即都是由32位的二进制数来表示的。有符号类型由基2的补码表示;字符型类型是有符号类型,等同于整型;枚举类型的对象用32位
17、数来表示,在表达上与整型相似;第6章 基于C语言的DSP芯片开发 所有的浮点型(float、double)都是相似的,在TMS320C3x/4x中都是由32位的单精度浮点格式表示的;Long double 型浮点格式在TMS320C3x/4x中是由40位的扩展精度格式表示的;数据类型的字长、表达方法、数据范围列于下表6.2;一些值的范围在头文件limits.h作为标准宏利用,头文件limits.h应用在编译器中。注:TMS320C3x/4x类型为32位 第6章 基于C语言的DSP芯片开发 表表6.2 数数 据据 格格 式式第6章 基于C语言的DSP芯片开发 长双精度浮点数据类型不同于其他的浮点
18、数据类型。长双精度浮点数据的特性如下:(1)长双精度浮点数据类型不是用浮点和双精度所用的单精度32位格式表示的,而是用40位扩展精度格式表示。(2)长双精度要求两个存储器字:第一个字保存高24位,第二个字保存低24位,操作的数据长度为40位,在装载和保存该长双精度浮点格式需要两条指令。第6章 基于C语言的DSP芯片开发 (3)长双精度保存在一个浮点寄存器中,像短浮点和双精度浮点一样,在寄存器中传输参数。(4)寄存器变量都不是40位值;因此长双精度不能通过CALL保存为寄存器变量。在CALL之前保存在存储器中,在需要时还可以重新装载。(5)在浮点数/双精度浮点到长双精度浮点转换时,40位寄存器的
19、低8位用0填满。在长双精度浮点到浮点/双精度浮点转换时,常用RND指令把此值取舍为最接近的单精度浮点数值。第6章 基于C语言的DSP芯片开发 (6)若加、减和负值(取反)指令用扩展精度浮点数作为输入,可以用汇编指令实现,如C3X乘法用函数MPY_LD,除法用函数DIV_LD实现。(7)40位的汇编函数链接到名为.float40的自身的段中。第6章 基于C语言的DSP芯片开发 6.3.2 关键字关键字C编译器中涉及的关键字主要包括C寄存器关键字和说明C编译器如何访问全局和静态变量以及如何调用函数的near和far关键字。1C寄存器关键字寄存器关键字TMS320C3x/4x编译器通过增加C寄存器关
20、键字扩展C语言,从而使高级语言访问寄存器。第6章 基于C语言的DSP芯片开发 当用户在目标文件中用C寄存器关键字时,编译器就会把目标文件名称与为C3x/C4x列出的标准控制寄存器的名称作比较。如果名称匹配,则编译器就生成控制寄存器的参考代码。如果名称不匹配,则编译器就报告出错。有效的控制寄存器如表6.3所示。第6章 基于C语言的DSP芯片开发 表表6.3 有效的控制寄存器有效的控制寄存器第6章 基于C语言的DSP芯片开发 C寄存器关键字仅用在显示文件中,不必在函数中作任何的声明。可应用在整数或指针类型对象中,但不允许应用在浮点或结构型或逻辑对象中。C寄存器关键字指明对象不能是变量。如果所用的控
21、制寄存器是变量(即可通过外部控制来改变其值),那么这个对象也可以用变量关键字声明。如果要用表6.3中的控制寄存器,用户必须按照下面方式声明:extern cregister volatile unsigned int register;一旦声明了寄存器,用户就可以直接用这个寄存器的名称。第6章 基于C语言的DSP芯片开发 例6.4 定义和使用控制寄存器extern creglsger volatile unsigned int IE;extern creglster volatilt unsigned int IF;extern creglsger volatile unsigned int
22、IOF;extern creglster volatilt unsigned int ST;unsigned myfunc unsigned int mask while ST&mask int mask 0 /*Do nothing;wait*/;return IOF;第6章 基于C语言的DSP芯片开发 2near和和far关键字关键字C3x/C4x的C编译器扩展了C语言功能,增加的near和far关键字是用来说明C编译器是如何访问全局和静态变量以及如何调用函数的。在句法上,near和far关键字被看做存储类变址数,它们可以出现在保存类声明和类型的之前、之后和中间。两个保存类变址不可以在一个
23、声明中同时应用,例如:far static int x;static near int x;static int fat x;far int f();static far int f();第6章 基于C语言的DSP芯片开发 1)near和far数据对象全局和静态数据对象可以通过下面两种方式访问:near关键字编译器对数据的访问采取相对数据页指针方式,如:sti r0,_var far关键字编译器不能通过DP访问数据。但是如果数据的量大于DP所允许的32K字时,就可以采用DP访问,例如:ldiu cll,ar0 sti r0,*ar0这里cll是包含在.bss中的变量的地址。第6章 基于C语言的
24、DSP芯片开发 默认情况下,编译器产生小的存储模型代码,这意味每个数据对象都被当作near关键字,除非它被声明为far关键字。如果对象声明为near关键字,一般的用相对于数据页指针的偏移寻址。数据页指针指向.bss段的开始。如果-ml,-mb和-mf这些选项被用,则可改变默认的设定值。大存储器模型代码,意思是每个数据对象被当作far关键字来处理并生成相应的代码。如果用DATA_SECTION,对象就会被确认为far变量,并且不能更改。这样就保证对不同数据页中的变量进行存取。第6章 基于C语言的DSP芯片开发 2)near和far函数调用 函数调用可采用以下两种方式之一 near关键字编译器假定
25、调用的目的操作数在所调用的224字节内,编译器用PC相对寻址方式调用指令:call _funcfar关键字用户通知编译器调用的不在调用的224字节之内,编译器所用的调用指令为寄存器寻址模式:ldiu cll,rocallu,ro这里cll常量在.bss中为函数的地址。第6章 基于C语言的DSP芯片开发 6.3.3 寄存器变量寄存器变量TMS320C3x/4x C编译器对寄存器变量的处理依靠用户是否用优化器来决定。用优化器的编译编译器忽略寄存器的任何声明,在优化时把所有的变量都当作寄存器变量来处理。不用优化器的编译如果用户用了寄存器关键字,建议把该变量分配到所选的寄存器中。第6章 基于C语言的D
展开阅读全文