在C/C++运行模式中,对寄存器的访问有限制,即编译器寄存器和堆栈寄存器属于专用寄存器,不能作为其他用途,寄存器的值不能改变。预保留寄存器和用户寄存器在使用前要先保留这些寄存器的内容,并在程序返回时恢复其内容。使用可擦写寄存器时不必考虑以前的内容,不用保存和恢复寄存器的内容。
C/C++运行环境要求指定段名的存储器来放置程序代码,并和链接描述文件的输出段名相对应,在Visual DSP++环境中有默认的存储器段名。
堆栈在高级语言程序设计中比较重要,C/C++运行时使用堆栈自动保存变量和返回地址,系统使用帧指针和堆栈指针管理堆栈。
3.2C/C++和汇编语言的接口
在C/C++程序设计中,如果要调用汇编子程序,可以有2种方式:一是直接在C/C ++中嵌入汇编语句;二是编写汇编子程序,在C/C++中调用该汇编子程序。调用汇编子程序先要创建一个接口标准,定义汇编语言子程序和C/C++语言的接口和参数传递标准。系统头文件asm_sprth中包括了支持高级语言和汇编语言接口的宏定义,entry, exit, leaf_entry, leaf_exit, ccall(x),read(x),puts,gets(x) alter(x), sav_reg, restore_reg,使用这些宏定义可以从C/C++进入汇编子程序,执行完汇编程序后恢复堆栈和帧指针并跳转到主程序。
C/C++的运行环境中函数的参数是通过寄存器和运行时的堆栈来传递的,使用寄存器传递参数最有效,默认函数的前3个参数依次传给R4,R8和R12寄存器,其余的参数通过堆栈来传递。如果参数的数据长度超过32 b则不能直接传递给R4,R8和R 12寄存器,而要通过堆栈来传递,函数的返回值存放在R0寄存器中。
4提高MUSIC算法效率的途径
在实际应用中,对测向时间的要求很严格。MUSIC算法中复信号特征值分解的程序复杂,而 谱峰搜索所涉及的计算量大,用ADSP21160实现MUSIC算法,其难点在于如何充分利用芯片的 结构特点提高程序效率。为了满足系统设计的要求,同时从开发程序的简化考虑,总体框架用C/C++语言来实现,复信号的特征值用C语言实现,同时为了缩短程序运行时间,采用了以下措施:
4.1充分利用C/C++语言和汇编混合编程
MUSIC算法中特征值分解的程序比较复杂,用C/C++实现比较方便,在谱峰搜索中 涉及到大量计算cos(x)和sin(x)值,耗用的时间多,采用了查 表法,在C语言中插入汇编来实现。在C/C++中计算一个cos(x)的值需要57个指令周期,采用汇编子程序,同时计算出cos(x)和sin(x )只需要37个指令周期,整个程序执行效率提高了30%左右。
4.2尽可能使用ADSP专门的库函数
ADSP除了支持标准的C/C++库函数外,还有专门的库函数,可以实现向量和矩阵运算 、矩阵转置、滤波器等,这些库函数大多数是用汇编实现的,效率较高,可以直接调用,在谱峰搜索中有大量的矩阵运算,用DSP专门的库函数实现减少了指令周期。
4.3利用Visual DSP++中有功能强大的优化器
Visual DSP++中优化器充分利用硬件特性对C/C++程序进行优化,ADSP21160内部具有多总线结构、多运算器结构、指令缓冲与程序流水结构以及长指令结构,优化器 尽量利用这些
结构资源来优化程序,提供最小的代码空间和最大的运行速度,优化器特别对循环语句的优化效率高,可将效率提高10~20倍。
4.4利用ADSP21160的SIMD模式工作
ADSP21160内部有两个完全相同的处理单元(PEx和PEy),通过设置系统控制寄存器,他既 可以工作于SISD模式下,也可以工作于SIMD模式下,当处在SIMD模式下处理器执行以下并行操作:
将同一条指令同时发送到两个处理单元。
从存储器载入两组操作数分别送到两个处理单元。
同时在两个处理单元里执行同一条指令。
将两个运算输出结果同时保存到存储器中。
虽然两个处理单元共用一套地址发生器,但是在两个处理单元中有独立的“内存访问路径逻 辑单元”,所以在进行内存访问时,对于地址发生器产生的同一地址,两个处理单元可以访问到不同地址中的数据,使得单指令多数据得以实现。
SIMD模式下的指令操作得以扩展,一方面是数据传送指令的扩展,数据传送的SIMD模式是 基于64位宽的数据线基础上,在对第一个处理单元PEx的寄存器堆中的内容执行某个操作的同时,自动对第二个处理单元PEy的寄存器堆执行与第一个处理单元相同的操作;第二个处理单元是隐含操作,在SIMD模式下自动执行。两个单元可并行执行同一条指令,而操作数不同,这就使处理器的计算能力提升了一倍,效率得以提高;另一方面是条件指令的扩展
,两个处理单元的条件指令并不是完全复制的,而是由两个处理单元的状态共同决定,其规则如表1所示。
在汇编程序中实现SIMD模式主要通过指令体现,在C/C++运行环境中要实现SIMD的工作模式有特定的条件限制,必须对数据的大小和在存储器中的位置做合理的安排,然后在指令前标注#pragma SIMD_for即可实现SIMD工作模式。
5
本文关键字:暂无联系方式综合-其它,单片机-工控设备 - 综合-其它