浅谈TI公司三大系列DSP编程方法4

上传人:豆浆 文档编号:31158889 上传时间:2018-02-05 格式:DOC 页数:5 大小:120KB
返回 下载 相关 举报
浅谈TI公司三大系列DSP编程方法4_第1页
第1页 / 共5页
浅谈TI公司三大系列DSP编程方法4_第2页
第2页 / 共5页
浅谈TI公司三大系列DSP编程方法4_第3页
第3页 / 共5页
浅谈TI公司三大系列DSP编程方法4_第4页
第4页 / 共5页
浅谈TI公司三大系列DSP编程方法4_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《浅谈TI公司三大系列DSP编程方法4》由会员分享,可在线阅读,更多相关《浅谈TI公司三大系列DSP编程方法4(5页珍藏版)》请在金锄头文库上搜索。

1、浅谈 TI 公司三大系列 DSP 编程方法郭林 201221905023摘要:本文以 TI 公司的 TMS320C54X 为背景详细讨论了 DSP 的汇编语言和 C 语言的混合编程技术 ,提出并分析了在考虑程序代码效率、 执行效率和程序的可读性及可移植性的情况下 ,采用 C 语言和汇编语言混合编程的优点 ,详细阐述了混合编程方法的特点、 应遵循的规则 。关键字:TMS320C54X ;汇编语言编程;C 语言编程;混合编程;引言:C 语言编程具有开发周期短、 可读性强 ,可移植性好和修改方便等优点 ,但是 C 程序反汇编生成的汇编代码往往较长。直接用汇编语言编程虽然编制的程序较短 ,但是开发周期

2、长 ,修改也不方便。较好的解决方法是程序的框架或主体部分用 C 语言编写 ,对那些耗时多运算密集的模块用汇编语言编写。这种混合编程的方法将 C 语言和汇编语言的优点结合起来 ,既能保证程序的结构化和可读性又能保证应用的实时性。 TMS320C54X 的主要特点包括:高运算速度、优化的 CPU 结构、低功耗方式和智能外设等。使用专用 DSP 芯片进行设计与开发包括硬件和软件两个方面。通常有以下三种软件设计方式:(1)完全用 C 语言开发。TI 公司提供了用于 C 语言开发的 CCS(CODE COMPOSER STUDIO)平台。该平台包括了优化 ANSI C 编译器,从而可以在 C 源程序级进

3、行开发调方式。这种方式大大提高了软件的开发速度和可读性,方便了软件的修改和移植。但是,在某些情况下,C 代码的效率还是无法与手工编写的汇编代码的效率相比,如 FFT 编程。这是因为即使最佳的 C 编译器,也无法在所有的飞速下都能够最合理地利用 DSP 芯片所提供的各种资源。此外,用 C 语言实现 DSP 芯片的某些硬件控制也不如汇编程序方便,有些甚至无法用 C 语言实现(2)完全有汇编语言开发,TI 公司提供了用于汇编语言开发的针对 TMS320C54X 的汇编语言。用户可以用它进行软件开发。此种方式可以更为合理地充分利用 DSP 芯片提供的硬件资源,其代码效率高,程序执行速度快。但是用 DS

4、P 芯片的汇编语言编写程序是比较繁杂的。一般来说,不同公司的芯片汇编语言是不同的,即使是同一公司的芯片,由于片类型的不同(如定点和浮点) ,芯片的升级换代,其汇编语言也不同。因此,用汇编语言开发基于某种 DSP 芯片的产品周期较长,并且软件的修改和升级较困难,这些都是因为汇编语言的可读性和可移植性较差所致。(3)用 C 语言和汇编语言混合编程开发。为了充分利用 DSP 芯片的资源,更好地发挥 C 语言和汇编语言进行软件开发的各自的优点,可以将两者有机结合起来,兼顾两者的优点,避免其弊端。因此,在很多情况下,采用混合编程方法能更好地达到设计要求,完成设计功能。但是,采用 C 语言和汇编语言混合编

5、程必须遵循一些有关的规则,否则会遇到一些意想不到的问题,给开发设计带来许多麻烦。1 TMS320C54X 的 C 语言和汇编语言混合编程方法C 语言和汇编语言的混合编程有以下几种方法:(1)独立编写编编程序和 C 程序,分开编译或汇编形成各自的目标代码模块,用链接器将C 模块和汇编模块链接起来,这是一种灵活性较大的方法。采用这种方法,C 程序可以调用汇编程序,并且可以访问汇编程序中定义的变量。同样,汇编程序也可以调用 C 程序或访问 C 程序中定义的变量。但用户必须自己维护各汇编模块的入口和出口代码,自己计算传递的参数在堆栈中的偏移量,工作量稍大,但能做到对程序的绝对控制。(2)在 C 程序中

6、直接内嵌汇编语句。此种方法可以在 C 程序中实现 C 语言无法实现的一些硬件控制功能,如修改中断控制寄存器、中断标志寄存器等。嵌入汇编语句的方法比较简单,只需在汇编语句的两边加上括号和双引号,并且在括号前加上 asm 标识符即可,即asm(“汇编语句”)。但是,采用此种方法必须注意以下几点:括号中的汇编语句必须以标号、空格、tab、分号开头,这和通常的汇编编程的语法一样。不要破坏 C 环境,因为 C 编译器并不检查和分析嵌入的汇编语句。插入跳转语句和标号会产生不可预测的结果。汇编语句不要改变 C 程序中变量的值。不要在汇编语句中加入汇编器选项而改变汇编环境。(3)将 C 程序编译生成相应的汇编

7、程序,手工修改和优化 C 编译器生成的汇编代码。采用此种方法可以控制 C 编程器从而产生个有交叉列表的汇编程序,而且程序员可能对其中的汇编语句进行修改。之后,对汇编程序进行汇编可产生目标文件。注意,修改汇编语句时切勿破坏 C 环境。2混合编程应遵循的规则和详细的接口规范2.1 寄存器规则在 C 环境中,定义了严格的寄存器规则。寄存器规则明确了编译器如何使用寄存器以及在函数调用过程中如何保护寄存器。调用函数时,被调用函数负责保护某些寄存器,这些寄存器不必由调用者来保护。如果调用者需要使用没有保护的寄存器,则调用者在调用函数前必须予以保护。下面具体说明寄存器规则:(1)辅助寄存器 AR1、AR6、

8、AR7由被调用函数保护,即可以在函数执行过程中修改,但在函数返回时必须恢复。在 TMS320C54X 中,编译器将 AR1和 AR6用作寄存器变量。其中,AR1被用作第一个寄存器变量,AR6被有作第二个寄存器变量,其顺序不能改变。AR0、AR2、AR3、AR4、AR5可以自由使用,即在函数执行过程中可以修改,而且不必恢复。(2)堆栈指针 SP 在函数调用时必须予以保护,但其是自动保护的,即在返回时,压入椎栈的内容都将被全部弹出。(3)ARP 在函数进入和返回时,必须为0,即当前辅助寄存器为 AR0。函数执行时可以是其它值。(4)在缺省的情况下,编译器总是认为 OVM 为0。因此,若在汇编程序中

9、将 OVM 置为1,则在返回 C 环境时,必须将其恢复为0。(5)其它状态位和寄存器在子程序中可以任意使用,不必恢复。2.2 标识符合名规则C 编译器将 C 程序定义的所有标识符前都加一下划线(-) 。因此,必须将在 C 程序中要引用的汇编变量和汇编模块子程序的名字前加上下划线(-) 。如果变量仅在汇编模块中使用,则不加下划线(-)的变量名可以任意使用,而不会与 C 标识符发生冲突。2.3 函数调用规则C 编译器规定了一组严格的函数调用规则。除了特殊的运行支持函数外,任何调用 C函数或被 C 函数所调用的函数都必须遵循这些规则,否则就会破坏 C 环境,造成不可预测的结果。2.3.1 参数传递函

10、数调用前,将参数以逆序压入运行堆栈,即最右边的参数最先入栈,然后自右向左将参数依次入栈。但是,对于 TMS320C54X,在函数调用时,第一个参数放入累加器 A 中进行传递。若参数是长整型和浮点数时,则低位字先压栈,高位字后压栈。若参数中有结构形式,则调用函数给结构分配空间,其地址通过累加器 A 传递给被调用函数。2.3.2 结果返回函数调用结束后,将返回值置于累加器 A 中。整数和指针在累加器 A 的低16位中返回。浮点数和长整型数在累加器 A 的32位中返回。2.3.3 函数调用时需注意的一些问题参数不是由被调用函数弹出椎栈,而是由调用函数弹出。因此调用函数可以传递任意数目的参数至函数,而

11、且函数不必知道有多少个参数传递。在汇编程序中,除了自动初始化全局变量外,不要将。cinit 段用作其它用途。C 程序在 boot。asm 中的启动程序认为。cinit 段中放置的全部是初始化表,因此将其它一些信息放入。cinit 段将产生不可预料的结果。如果要定义在 C 程序中访问的汇编变量或调用的汇编子程序,则必须在汇编程序中用。global 说明为外部;同样,如果要定义在汇编程序中要调用的 C 函数或访问变量,也必须在 C 程序中将其以 exterm 说明为外部。下面给出具体例子。C 程序:Extern int asmfunc ( ); /*声明外部的汇编子程序*/*注意函数名前不要加下划

12、线*/int gvar; /*定义全局变量*/main( )int I=3;I=asmfunc(i); /*进行函数调用*/汇编程序:_asmfunc:;函数名胶一定要有下划线ADD *(-gvar),A ;I 的值在累加器 A 中STL A,*(-gvar);返回结果在累加器 A 中RETD ;子程序返回3 C 语言和汇编语言混合编程软件设计要点和具体设计实例在智能测试仪表的软件设计中,要完成对振动信号进行数据采集,从而进行频谱分析的主要功能。在这个具体实例中,主程序要完成系统的实始化,进行用户操作界面显示,并且进行键值查询,根据按键值决定程序的流程,从而完成仪器设计要求的各项功能。主程序对

13、运行速度和代码效率要求不高,但要求可读性强且修改维护容易,因此采和 C 语言实现。另外一些子程序如 FFT 算法,对运行速度要求较高,可用汇编语言实现。而 DSP 与PC 机的通讯与硬件串口有关,采用汇编语言易于实现编程,因此也采用汇编语言钭其做成子程序,而在 C 语言编写的主程序中调用它。在实际的系统软件设计中,可以根据具体情况来选择将某一模块或某一子程序用 C 语言或汇编语言来实现,从而更充分地发挥两者的优势,将 DSP 技术更加充分地利用于各种系统设计中。在此,仅以 A/D 数据采集为例来具体说明 C 语言和汇编语言的相互调用问题。由于篇幅有限,仅列出与混合编程及相互调用相关的部分程序以

14、供分析和参考。C 程序:Extern void ad1247( ); /*定义外部的汇编函数*/*函数名前不必加下划线*/main( ) /*主程序*/int adlength=2048; /*数据的采样长度*/int adfreq=40; /*数据采样频率*/。汇编程序:。mmregsFP 。set AR7。sect。text。global_ad1247 ;定义汇编子程序,以 global 说明要被外部的 C 程序调用,函数名前要有划线。bss len,1 ;定义局部变量 len。bss freq,1 ;定义局站变量 freq,变量名前不必加下划线。_ad1247 ;程序入口PSHM AR6

15、 ;保护 AR6PSHM AR7 ;保护 AR6PSHM AR1 ;保护 AR1FRAME #-16;为建立的局部帧分配空间函数体STL A,*(len) ;将置于累加器 A 的第一个参数传给变量 lenSSBX CPL ;用 SP 的直接寻址方式LD 17,A ;第二个参数的偏移地址STL A,*(freq);将置于堆栈中的第二个参数传给变量 freq。FRAME #16 ;释放局部帧的空间POPM AR1 ;恢复 AR1POPM AR7 ;恢复 AR7POPM AR6 ;恢复 AR6RET ;返回其中有关函数调用中堆栈的使用和分配,详见图1。注意:为局部帧分配的空间由三部分构成:传递的参数所占的空间;局部变量所占的文凭间;一个字节空间(这一部分可能不存在) ,其有无主要取决于保证使堆栈指针 SP 为偶地址。由以上的例子可以看出,采用 C 语言和汇编语言混合谐和的方法,可以大大提高编程的效率,使程序设计者可以把精力更多地集中到算法的实现上,而不必关心寄存器的使用和安排;在一些要求代码执行效率高的地方可以用汇编语言来实现,从而可以编写出高效的处理程序,将 DSP 技术更加充分地利用于各种系统设计中。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号