论文首页哲学论文经济论文法学论文教育论文文学论文历史论文理学论文工学论文医学论文管理论文艺术论文 |
TMS320C62X是美国德州仪器公司煟裕桑牭男乱淮高性能定点数字信号处理器(DSP)芯片。基于DSP的软件设计问题,就是采用编程语言进行算法实现并使程序效率尽量满足实时性要求。TI DSP的软件设计可以采用汇编语言、高级语言煟茫C++犚约埃糜镅杂牖惚嘤镅缘幕旌媳喑獭M耆采用汇编语言编程复杂性高、开发周期长,而完全采用C语言编程则程序的执行效率相对较低,不能满足实时性的要求。为了设计出性价比最好、开发周期较短、比较复杂的DSP系统,可以采用混合语言编程,把C语言和汇编语言的优点有效地结合起来。C语言和汇编语言的混合编程有三种形式:在编写C语言代码中插入汇编语句熤恍柙诨惚嘤锞淞奖呒由纤引号和括号,在括号前面加上标识asm,如asm煛盎惚嘤锞洹保牐辉诒嘈矗么码的过程中调用内联函数煟裕停樱常玻埃茫叮玻刂杏幸恍┲苯佑成湮内联的C6000指令的特殊函数,内联函数用前下划线煟撸牨硎荆使用时同调用C语言的库函数一样调用它,如b=_nassert煟危荆剑保埃牐换惚啻码以C代码可以调用的函数出现。本文采用第三种形式。为了使程序代码的执行具有尽可能高的执行效率,本文将着重点放在并行汇编代码的编程,而不是线性汇编代码的编程。
1 C语言与汇编语言混合编程的接口规范和标准
用C语言编写的代码中核心代码常常只是整个程序代码的5%,但是却占用了整个程序约95%的执行时间。对这些核心代码采用汇编语言编写,可以大大提高代码的执行效率,而C语言程序可以象调用C程序的一个函数那样去调用这个汇编函数。为了实现C语言和汇编语言的混合编程,需要注意一些规定的接口规范和标准。
(1)采用C语言和汇编语言混合编程时,TMS320C62X定义了一套严格的寄存器规则。这个寄存器规则表明了编译器如何使用这些寄存器以及在函数调用过程中如何保护这些寄存器。
调用函数保护了寄存器A0~A9和B0~B9,这就使得在编写汇编程序的时候可以任意的使用这几个寄存器而不需保护它们。但当使用到寄存器A10~A15或B10~B15的时候,则必须自行对它们进行保护。长型、双精度型或者是长双精度型的数据对象要放在一个奇/偶寄存器对(如A1:A0)里,奇数寄存器存放着数据的符号位、指数位和最高有效位,而偶数寄存器则存放着低有效位。
在默认情况下,A3用作返回结构指针寄存器,B3用作被调用函数返回地址寄存器,A15用作帧指针寄存器,B14用作数据页指针寄存器,B15用作堆栈指针寄存器。这些寄存器在被调用的汇编函数中用到时都要进行保护。
(2)调用函数将参数传递到被调用函数中,前十个参数将被从左到右依次放入寄存器A4、B4、A6、B6、A8、B8、A10、B10、A12和B12,如果传递的参数是长型、双精度型或者是长双精度型,则将参数依次放入寄存器组A5:A4、B5:B4、A7:A6等,并将剩下的变量按相反的顺序放在堆栈里。注意,如果传递的参数是一个结构类型的参数,则传递的是该结构类型的地址。
(3)如果在C/C++调用函数中做了正确的函数返回声明,则被调用的汇编函数可以返回有效值。如果返回值是整型或32位的浮点型,则放在寄存器A4中返回;如果返回值是双精度或是长双精度型,则放在A5:A4中返回;如果返回值是一个结构类型,则将其结构的地址放在A3中返回。