DSP-TSl01S嵌入式系统的混合编程

开发
ADSP-TSl01S是美国ADI公司推出的一款具有极高性能的数字信号处理器(DSP)芯片,其专为大信号处理任务和通信应用进行了结构上的优化设计,在嵌人式信号处理中得到广泛应用。ADSP-TSl01S的软件设计可以采用汇编语言、高级语言(C/C++)或高级语言与汇编语言混合编程。

ADSP-TSl01S是美国ADI公司推出的一款具有极高性能的数字信号处理器(DSP)芯片,其专为大信号处理任务和通信应用进行了结构上的优化设计,在嵌人式信号处理中得到广泛应用。ADSP-TSl01S的软件设计可以采用汇编语言、高级语言(C/C++)或高级语言与汇编语言混合编程。完全采用汇编编程,执行效率高,但对于复杂算法编写难度大,开发周期长,可读性和可移植性差;而完全采用C编程虽然可以弥补汇编的缺陷,但是程序的执行效率相对较低,大概只有汇编程序的10%~20%,对于实时性要求很高的处理,如雷达信号处理,很难满足要求。采用混合语言编程,用c语言构建框架,用汇编完成运算量较大的核心处理模块及硬件底层管理,就可以把两者的优点有效地结合起来。C和汇编语言的混合编程有三种形式:一是对C程序编译后形成的汇编程序进行手工修改与优化;二是直接在C代码中插入汇编语句,只需在汇编语句两边加上双引号和括号,在括号前面加上标识“asm,如asm(“汇编语句”);三是分别编写C程序和汇编程序,再独立编译成目标代码模块链接。***种方法对程序可读性负面影响较大。第二种方法适用于C与汇编效率差异较大的情况,如进入中断的中断子程序等。第三种方法最常用,需要遵循一些规定的接口规范和标准。

1 混合编程的接口规范和标准

①在C/C++环境下,TigerSHARC定义了一套严格的寄存器规则,它分为三类:

***类是保留寄存器,j16~j25、k16~k25、xr24~xr31、yr24~yr31,共40个,作为编译系统库函数专门使用的寄存器。编写程序时应避免使用这些寄存器,以免误改了系统库函数。若在子程序中使用到,必须在被调用时保存,调用完后释放。

第二类是堆栈专用寄存器,k26、27和j26、j27四个,这些寄存器在调用时都需要保护。
第三类是高速暂存寄存器,包括除了以上两类寄存器以外的所有寄存器。用法和汇编中的普通寄存器是一样的,使用前不需要保存寄存器内容。

在默认情况下,cjmp寄存器用作存放被调函数的返回地址,但在嵌套调用中,这个值会被修改。为了保证安全返回,一般把返回地址存放在堆栈顶偏移地址为0的地方。

函数调用有时需要参数传递,通常,若参数少于5个,则通过寄存器传递,如表1所列。

 

如果在C/C++调用函数中作了正确的函数返回声明,则被调用的汇编函数可使用寄存器j8、xr8和xr9返回有效值。j8用于返回整数或地址;xr9:8可提供双字结果返回。若返回值大于2个字长,则必须为它们分配存储空间,令j8为返回值,指向该空间的首地址即可。

②在C/C++中声明的全局变量及函数,汇编中加“一”前缀才能使用;在汇编中的对象必须用”一”前缀命名,并用.g10bal声明为全局变量,才可在C/C++中访问到。具体格式如表2所列。

 

2 混合编程的调用和中断

2.1 函数调用

C编译器对函数调用有一系列严格的规则。除了特殊的运行支持函数外.任何函数与c函数互调都必须遵循这些规则。函数调用的标准运行模式为:①调用者将参数庄人堆栈。压入时按照反序进行,即最右边的参数位于堆栈的顶部。②调用函数。③调用结束时,调用者将参数弹出堆栈并返回。整个过程离不开堆栈操作。函数调用中的堆栈结构示意图如图1所示。

①保护函数的返回地址及相关寄存器:把函数返回地址保存在j27+0的位置(栈顶),同时设置jZ6为j27-0x40(栈底),得到长度为64的栈区,并在栈区内保护相关寄存器。

②分配局部变量:在局部变量赋初值的时候,系统在堆栈内给它分配一个空间。

③传递函数参数:前4个参数传递给相应寄存器(见表1),后续参数按顺序装载到堆栈j27+0xC起始的空间中。注意,如果传递的参数是结构类型,则其所有元素将入栈。例:第五个参数是两元素的结构体,则元素一放于jZ7+0xC,元素二放于j27+0xD,汇编子程序在使用参数时只需从对应的位置上读取即可。

C环境在调用C函数时自动管理这些操作,当汇编与C接口时,必须采用与C一样的方式进行操作。这个过程可用图1详细描述。特别需要注意的是,由于C编译器不提供检查堆栈溢出的任何手段,因此必须保证有足够的空间用于堆栈;否则若发生溢出现象,将破坏程序的运行环境,从而导致程序的瘫痪。

2.2 中 断

中断是DSP控制程序执行的重要方式。通常,DSP工作在包含多个外部异步事件的环境中,这些异步事件的随机发生要求DSP能中断当前的处理程序并转向执行该事件处理程序,执行完后又要求返回被中断的原程序继续处理步骤,这一过程就是中断。中断源可以来自片内或片外的设备,例如时钟、A/D等。中断的设置包含两步——①打开中断屏蔽寄存器的相应中断位,②设置中断服务程序的入口地址,这样就能实现中断的正常运行。中断服务程序是特殊的函数,不能带返回值,不能传递参数,内容须短而有效。标准运行模式为:①保存断点地址并保护所有用到的寄存器,②执行中断服务程序,③释放寄存器并返回。

3 程序优化

程序优化包括汇编优化和C优化。手写汇编程序的优化空间相当大,可以产生非常高效的程序代码。由于许多相关书籍都有介绍,就不再赘述,这里主要介绍C程序的优化。

一般DSP的C编译器都会提供优化编译器,采用优化编译就可以生成效率更高的汇编代码,在某些情况下,执行优化的程序代码要快10~20倍。从某种程度上说,C程序的效率主要取决于C编译器所能进行优化的范围和数量。应说明的是,TSl01S编译器的默认设置是不使用优化器,它可以进行以下几个不同级别的优化,优化程度由低到高:

 

 

 

【编辑推荐】

  1. 让Perl成为你的嵌入式开发工具
  2. 嵌入式设备上的 Linux 系统开发
  3. 几种Linux下嵌入式开发环境的简单介绍
责任编辑:张燕妮 来源: cnemb.com
相关推荐

2020-04-22 11:51:41

物联网嵌入式编程IOT

2011-05-24 17:34:38

嵌入式系统

2023-11-28 09:17:05

Linux编程

2022-01-03 23:33:40

Linux组件系统

2020-07-03 07:00:00

Linux组件

2009-06-26 16:18:40

Windows Emb

2022-02-19 22:47:46

编程语言开发C++

2021-12-19 22:34:45

Linux容器系统

2011-04-14 15:14:36

嵌入式操作系统嵌入式

2009-07-20 09:53:43

Java混合编程

2012-07-30 14:13:11

Linux 2.6内核嵌入式

2009-06-26 16:05:04

嵌入式Linux

2012-03-09 09:45:29

Windows嵌入式操作系统

2011-04-25 10:25:43

OpenEmbedde嵌入式Linux

2011-01-06 15:11:09

嵌入式linux

2017-12-21 10:43:44

Linux嵌入式终端

2023-09-18 14:39:39

2010-01-07 10:18:44

嵌入式Linux系统构

2020-06-15 07:00:00

Linux嵌入式系统

2009-04-11 15:22:24

Linux 2.6内核应用
点赞
收藏

51CTO技术栈公众号