基于DSP的混合编程关键技术研究
辅助寄存器(AR0~AR7)可供使用,在C语言环境中这些寄存器都有明确的分工。
①AR0:帧指针(Frame Pointer,FP)。LF240xA只提供了大小为8个字的硬件栈,不能满足需要。因此,C环境定义了一段特殊的存储器空间,作为软件栈。软件栈的作用是分配局部变量、传递函数的参数、保存处理器的状态、保存临时结果等。AR0指向软件栈中函数局部数据空间的起始处。
②ARl:软件栈的栈顶指针(Stack Pointer,SP)。ARl为指向软件栈栈顶的专用指针。
③AR2:局部变量指针(Local Variable Pointer,LVP)。AR2存放局部变量的偏移量,与AR0(FP)一起对局部变量进行寻址定位。
④AR6、AR7:寄存器型变量。在C语言程序中用register修饰的变量存放在AR6、AR7中。
⑤AR3~AR5:用户自定义。AR3~AR5没有特殊的约定,可以由用户自由决定其用途。在汇编程序的入口处,假设ARP已经被设置为ARl,这是由C编译器自动完成的。C语言程序调用汇编函数时,汇编函数程序必须遵循下述规范:
①从硬件堆栈中弹出返回地址,然后把它压入软件堆栈;
②把C程序的数据结构指针FP压入堆栈;
③如果汇编程序改变了AR6或AR7,也需要把它们压入堆栈;
④分配局部数据结构;
⑤执行汇编程序的实际任务代码;
⑥如果汇编程序有返回值,则把这个返回值放入累加器中;
⑦设置ARP为ARl;
⑧解除分配的局部数据结构;
⑨如果AR6和AR7曾经被保存过,则从软件堆栈恢复它们的值;
⑩从软件堆栈恢复FP;
⑾把软件堆栈中存储的返回地址压入硬件堆栈;
⑿返回。
当汇编函数调用完毕后,C语言程序要弹出先前压入堆栈的传递参数。这个操作通过下面的命令语句实现:SBRK i(i是C程序向汇编程序传递的参数个数)。在上述操作过程中,对软件堆栈的处理至关重要。图1所示为C语言程序调用时软件堆栈的分配示意图,具体步骤如下:
①在C语言程序的局部帧后将汇编函数的参数依次压栈;
②程序指针(PC)跳转到汇编函数的代码段;
③保存出口地址;
④保存C语言程序局部帧指针;
⑤分配局部变量;
⑥调用结束前将以上所有内容弹出软件栈。
下面以具体例子来讲述这个操作过程。
(2)汇编语言程序调用C函数
汇编语言程序中调用C函数。被调用的C函数在C语言环境中需要用extern进行定义,在汇编程序中用.ref说明为外部标号,且函数名加"_"。在调用C函数之前应手工编程将参数以逆序写入当前运行任务所使用的任务堆栈中,压栈之前堆栈指针可不作调整。被调用的C函数即可正常访问调用者传递的参数,函数调用完毕后需要调整堆栈指针,清除函数调用中参数所占用的堆栈空间。C函数的返回值可以通过访问累加器获得。具体例子如下。
C语言模块中编写乘法函数:
3 注意事项
(1)中断的处理
LF240xA发生中断时,程序指针(PC)就指向相应的中断向量,并通过中断向量映射到相应的中断服务子程序。例如,在0004h~0005h处是INT2的中断向量,在此存储了1条跳转指令,跳转至INT2的服务子程序。LF240xA的C语言有interrupt修饰符可以用来定义中断服务子程序,如下所示:
将上述2个模块分别编译后链接,就能响应INT2中断了。
(2)字母大小写
在C语言环境中,对于字母大小写的区分是很严格的,因此在混合编程的过程中也应该严格遵守这一点。例如,在写命令文件时,误将".data"写成".daTA",此时系统将无法给初始化代码分配存储空间,导致程序无法执行。
(3)C语言库函数应用
TI的C编译器中内置了很多函数,包含在rts2xx.1ib的函数库中。库函数并不是C语言的一部分,它是由人们根据需要编制并提供给用户直接使用的。每一种C编译系统都提供了一批库函数,不同的编译系统所提供的库函数的数目、函数名及函数功能是不完全相同的。要使用库函数,只需在源文件中添加语句"#include"函数名.h"",就可使用相应的库函数了。
结 语
以上提到的LF240xA DSP的C语言和汇编语言混合编程技术已经在笔者参与开发的卷烟机重量控制系统的控制软件中得到应用。实践证明,采用混合编程的软件更加契合一般嵌入式系统对时问和空间的严格约束。设计良好的混合编程软件既能有效地满足嵌入式系统对功能与性能的需求,同时也可以为程序的扩展和移植预留足够的空间。混合编程是编制复杂的LF240xA控制软件的有效方法,同时也是嵌入式系统软件最优化的重要途径。
- 在采用FPGA设计DSP系统中仿真的重要性 (06-21)
- 基于 DSP Builder的FIR滤波器的设计与实现(06-21)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- FPGA的DSP性能揭秘(06-16)
- 用CPLD实现DSP与PLX9054之间的连接(07-23)
- DSP+FPGA结构在雷达模拟系统中的应用(01-02)