导航菜单

TigeiShark系列DSP的混合编程问题研究

杜天有

(中国电子科技集团公司第二十研究所,陕西 西安 710068)

【摘要】介绍了在TS201上进行软件开发的几种方法,从工程实现的角度比较各自的优缺点,指出C/C++语言和汇编语言混合编程技术的优越性。之后详细阐述ccts编译器的C/C++运行时模型对TigerShark系列DSP芯片的C/C++混合编程所规定的调用规则和接口规范,并给出程序设计实例。对工程实践有很大的参考价值。

教育期刊网 http://www.jyqkw.com
关键词 DSP;混合编程

1C/C++语言和汇编语言混合编程特点

TS201的软件开发平台Visual DSP++允许用户从汇编语言、C语言的任意一种进行编程或者两种结合使用。C语言程序和汇编程序各具特点,根据不同的场合选择不同的编程语言。C语言程序除了具备可移植性好、兼容性好、软件资源丰富等优点外,对于这种DSP处理器的开发而言,采用C语言编写还能免去熟悉DSP指令体系、硬件的内部结构等工作,简单方便。但是,虽然汇编语言写程序代码长,程序检查也很困难,汇编语言的算法执行效率远远高于C语言。在程序设计的时候,可根据系统计算量、时间资源等选择适合的编程语言,同时也可以选择两种编程语言结合使用。在实际的工程中,常常采用的都是两种结合使用的方式,程序的框架和控制部分采用C语言设计,算法和数据传输部分采用汇编语言设计,这样程序就可读性好,同时执行效率高。

2混合编程参数传递规则

如果在C语言中调用汇编子程序,则这些汇编子程序必须遵守DSP运行规则,这些运行规则称为C语言实时运行模式。

2.1堆栈管理

实时运行堆栈就是内部存储器中的一个缓冲区,通过堆栈指针(j/k27寄存器)和帧指针(j/k26寄存器)进行堆栈的维护。堆栈主要用于保存局部变量,在函数中可能被修改的专用和保留寄存器的值,函数的输入输出参数以及链接信息。

ccts编译器目前使用两个堆栈。这两个堆栈位于不同的存储器块中,分别通过iALU寄存器J和K寻址。堆栈指针从存储器的高地址向低地址增长,且堆栈行4字为1组,帧指针指向当前堆栈帧的起始地址,而堆栈指针则指向下一个可用的存储器地址单元。

帧指针总是在实际帧基地址的基础上的,偏移量-0x40以便为局部变量提供较大的寻址范围,J帧指针可以保存到k24中。当在JALU中进行其他地址计算时,允许JFP相对寻址引用可以提高程序的执行效率。如果程序不使用k堆栈,就可以省去所有的操作,包括与k堆栈相关的链接信息等。在调用者的帧中,至少要为4个“参数字”分配空间,这样对于输入参数较少的叶子函数避免创建堆栈。

2.2参数传递规则

1)指针和整数类型通过j寄存器传递。

2)浮点数和双字变量通过XR寄存器来传递。

3)如果输入参数超过2个字,则调用者通过为变量分配存储空间,并将地址以通过j寄存器传递到被调函数中。前4个参数字一般通过寄存器来传递,这样就可以提高程序执行的效率,也大大方便了程序的编写。

4)如果函数原型有参数(“…”),则紧跟着省略号之前的那个参数和省略号后的参数都将通过存储器传递。

2.3返回值规则

返回值总是通过寄存器j8和X8、X9来传递。返回值的类型决定使用j寄存器还是使用寄存器X,指针和整数通过j寄存器来传递,浮点和双字结果通过两个X寄存器来传递。如果返回值大于2个字,则调用者必须为被调用者的返回值分配空间,并将此空间的地址以隐含参数的方式传递到被调函数中。

3实例分析

子函数:Rx_compute(plusenumber,X,Rx)

该子函数实现了计算矩阵的协方差矩阵的功能。由于输入和输出矩阵的大小都超过了两个字,所以可以采取分配存储空间,通过地址来进行参数传递。

输入参数:plusenumber→矩阵的大小

X→输入矩阵的地址

输出参数:Rx→输出矩阵的地址

则按照上面的顺序,子函数中三个参数分别在j4、j5、j6 中存储。

4结束语

本文介绍了基于TS201平台的C/C++语言和汇编语言混合编程方法。由示例程序的比较结果可以看出,这种方法既可以极大提高程序的执行效率,也可以方便用户编程。

教育期刊网 http://www.jyqkw.com
参考文献

[1]Visual DSP++4.0 C/C++ Compiler and Library Manual for TigerSHARC Processors[Z].2005.

[2]刘树明,苏涛,罗辉军.TigerSHARC DSP应用系统设计[M].北京:电子工业出版社,2004.

[3]ADSP-TS201 TigerSHARC Processor Programming Reference[Z].2003.

[责任编辑:邓丽丽]

下载文本