您当前的位置:五五电子网电子知识单片机-工控设备DSP/FPGA技术基于DSP混合编程关键问题的研究(二) 正文
基于DSP混合编程关键问题的研究(二)

基于DSP混合编程关键问题的研究(二)

点击数:7498 次   录入时间:03-04 11:41:32   整理:http://www.55dianzi.com   DSP/FPGA技术

混合编程中程序运行环境的改变与保持
    不管采用哪种混合编程方式,运行环境的改变与保持对程序运行正常与否有着重要影响。正常的运行环境不仅关系到DSP状态寄存器的各状态位,也关系到编译器的函数调用规则,寄存器和堆栈的使用规则。尤其在使用第三方提供的函数时,应该特别注意这个问题。在允许的情况下函数调用前后也可采用保存与恢复现场的手段。这样做不利于提高耦合性和减少冗余,但有利于增加可移植性。此外,对运行环境的关注也有利于提高程序的扩展性。

mC/OS-II及应用程序在DSP上运行关键问题的解决

堆栈的使用。I$$SAVE,I$$REST函数
函数调用是否正常,任务调度与中断是否正常,在很大程度上都取决于堆栈的使用正确与否。对于240xA系列, TI提供了保存与恢复堆栈的函数I$$SAVE、I$$REST,这两个函数都位于rts2xx.lib库中,所在的源文件是saverest.asm。它们在发生任务调度和中断的时候使用,保存或恢复了所有编译器所使用的寄存器以及硬件堆栈。I$$SAVE函数的代码如下:
I$$SAVE:
MAR *, AR1  AR1存放堆栈指针
ADRK #1h
SST #1, *+  保存状态寄存器
SST #0, *+
SACH *+, 0  保存ACC内容
SACL *+, 0
CLRC OVM
SPM
SPH *+  保存PREG
SPL *+
MPY #1h  保存TREG
SPL *+
SAR AR0, *+  保存辅助寄存器
SAR AR2, *+
SAR AR3, *+
SAR AR4, *+
SAR AR5, *+
SAR AR6, *+
SAR AR7, *+
POPD *  I$$SAVE的返回
  地址压入任务堆栈
LACC *, 0
RPT #6h  硬件堆栈其它内容
  压入任务堆栈
POPD *+
BACC
与I$$SAVE函数相反,I$$REST恢复各寄存器与硬件堆栈的值。但是现场恢复的顺序与保存有所不同,其中利用了TREG将PREG的低16位弹出堆栈,再弹出TREG本身,这里弹栈的过程相对于压栈而言不是顺序的。另外,I$$SAVE函数将8级硬件堆栈全部压入任务栈,但栈顶内容被其下的内容覆盖,同时最后使用了跳转指令,因此调用I$$SAVE函数必须使用CALL指令,而I$$REST函数只需恢复除了原栈顶以外其它7级硬件堆栈的内容。
   AR1自始至终存放着堆栈指针。在I$$SAVE与I$$REST函数的首尾对堆栈指针作了调整。两个函数对指针的调整是相互对应的,确保了堆栈指针位置正确。
   在现场保存要求较高情况下,这两个函数可以用修改库文件的方法改进,添加某些用户希望在调度与中断过程中保存的量,特别是对于大型嵌入式软件中具有类似C语言volatile属性的量。当堆栈空间紧张时,也可以用同样的方式去除某些不必保存的量。
   对操作系统的移植而言,堆栈在初始化中必须模仿被中断时保存堆栈的情形,只是在任务返回地址处不使用硬件堆栈中的值,而是使用任务的入口地址。
   某些DSP并不具有硬件堆栈,因而保存与恢复寄存器的方式有较大的不同,给编程带来了更大的灵活性。他们通常采用了TRAP与IRET这样的保存恢复现场的指令,在执行这些指令前需要对堆栈指针进行调整。
程序及数据的ROM初始化
   混合编程的程序在DSP中的固化涉及到程序是否能够彻底脱机运行。其内容包括设置微处理器/微控制器位,合理的编写.cmd文件等。而程序固化的关键问题是如何在程序存储器中分配存储空间给常量和用const关键字定义的静态、全局变量。
   上述这些量被分配到存储空间中的.const段。它在DSP中的初始化一般有三种方式,一种是去除const关键字,在程序中赋初值使用。并且需要在.cmd文件中将.cinit段分配到程序区FLASH存储空间,然后在编译器的编译选项中选中“-C”,即ROM初始化。第二种方法不对定义作修改,.const段保存在FLASH存储器中,数据不向数据存储器移动,程序运行时直接在程序存储空间中访问这些量。由于C语言缺乏访问程序区数据的有效手段,因此这些语句只能使用汇编语言编写。由于在每一处访问这些常量时都必须使用这些语句,因此这样编写程序改动量较大。
    第三种方法较之前两种,运用起来要方便得多。它不需要修改常量定义,也不必编写专门的程序。主要的工作是修改.cmd文件并对工程中使用的库文件作简单的修改,修改工作量小而且集中,极大地方便了程序的编写。同前两种方式不同,这种方式需要设置.const段的装载地址和运行地址。其表达式如下。
.const : LOAD = FLASH PAGE 0 , RUN = EXT PAGE 1
{
__const_run = .;      /* 获取运行地址 */
*(.c_mark)        /* 标志装载地址 */
*(.const)          /* 分配.const段 */
__const_length = .- __const_run;  /* 计算段长 */
}




本文关键字:暂无联系方式DSP/FPGA技术单片机-工控设备 - DSP/FPGA技术