当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读] TMS320C62X是美国德州仪器公司(TI)的新一代高性能定点数字信号处理器(DSP)芯片。基于DSP的软件设计问题,就是采用编程语言进行算法实现并使程序效率尽量满足实时性要求。TI DSP的软件设计可以采用汇编语言、高级语言(C/C++)以及C语言与汇编语言的混合编程。完全采用汇编语言编程复杂性高、开发周期长,而完全采用C语言编程则程序的执行效率相对较低,不能满足实时性的要求。

TMS320C62X是美国德州仪器公司(TI)的新一代高性能定点数字信号处理器(DSP)芯片。基于DSP的软件设计问题,就是采用编程语言进行算法实现并使程序效率尽量满足实时性要求。TI DSP的软件设计可以采用汇编语言、高级语言(C/C++)以及C语言与汇编语言的混合编程。完全采用汇编语言编程复杂性高、开发周期长,而完全采用C语言编程则程序的执行效率相对较低,不能满足实时性的要求。为了设计出性价比最好、开发周期较短、比较复杂的DSP系统,可以采用混合语言编程,把C语言和汇编语言的优点有效地结合起来。C语言和汇编语言的混合编程有三种形式:在编写C语言代码中插入汇编语句,只需在汇编语句两边加上双引号和括号,在括号前面加上标识asm,如asm(“汇编语句”);在编写C代码的过程中调用内联函数,TMS320C62X中有一些直接映射为内联的C6000指令的特殊函数,内联函数用前下划线(_)表示,使用时同调用C语言的库函数一样调用它,如b=_nassert(N>=10);汇编代码以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中返回。

(4)编译器为所有的外部对象指定一个链接时的名字。当写汇编语言代码时,必须用与这个名字相同的名字。对于只在汇编语言模块中用到的变量的标识符,不能从下划线开始。任何一个在汇编语言中声明的对象都要使其在C/C++中是可访问的,那么在汇编语言中必须用.def 或.global将其声明为外部变量。同样在汇编语言中要引用C/C++函数或对象时,必须用.ref 或.global将C/C++对象声明,这将产生一个在汇编语言函数中没有定义的由链接器辨识的外部引用。

还有一些细节也需要注意,如中断子程序必须把该子程序将要用到的所有寄存器进行入栈处理;除了全局变量的初始化外,汇编语言的模块不得因为任何目的而使用.cinit段;汇编代码的结束需用指令B.s2 B3将程序执行从被调用函数返回到C语言调用函数中。


2 并行汇编代码的编写

C6000的汇编代码格式如下:

标号: 并行标记 [条件寄存器]指令助记符 功能单元 操作数 ;注释。如:

LDW .D2 *B4,B2

|| [A1]SHL .S2X A4,B4 ;用到了交叉数据通道

TMS320C62X片内有8个并行的处理单元,分为相同的两组。其体系结构采用超长指令字(VLIW)结构,一个指令包里的8条并行指令可同时分配到8个处理单元并行运行。这种一个指令包里有8条指令并行执行也给并行汇编代码的编写带来很多要考虑的问题,具体如下:

(1)TMS320C62X指令的执行可以用延迟间隙来说明。延迟间隙在数量上等于从指令的源操作数被读取到执行的结果可以被访问所用的指令周期。如对于乘法指令(MPY),源操作数从第i个周期被读取,则其计算结果在第(i+2)个周期才可用。

(2)使用相同功能单元的两条指令不能被安排为并行指令。

(3)使用同一条交叉通路的两条指令不能被安排在同一个执行指令包中,这是因为从寄存器组A~B或者从B~A都只有一条交叉通路。

(4)将数据读入到(或存储自)相同寄存器组的两条读(写)指令不能被安排在同一个执行包中。

(5)每一个执行包里只能允许每一寄存器组处理一个长定点类型数据。

(6)在一个指令周期内对同一寄存器读取多于四次是不允许的,但条件寄存器不在此限制之列。在一个指令周期内,不能 同时存在两条写入同一寄存器的指令,只有在写操作不是在同一个指令周期发生时,才可以将具有同一目的地址的两条指令安排并行。

3 基于TMS320C62X的运动补偿的混合编程设计实例

运动补偿是MPEG-4标准中的一种重要算法。运动补偿是指根据运动矢量在参考帧中找出参考块。如果运动矢量的X分量和Y分量都是整象素长度,则直接在参考帧中找出参考块。如果为半象素长度,则需要通过内插运算计算出参考块,计算出的参考块需要加上解码得出的误差块才能得到当前参考块。本文给出了运动矢量的X分量和Y分量都是整象素长度时的运动补偿方法。根据运动矢量可直接在参考帧中找到参考块(8×8)。完成此功能的C语言函数如下:

void mc_case_a2(unsigned char *pSrc, short SrcOffset, short SrcWidth, unsigned char *pDst, short RoundCtrl)

{ ……

for (i=0; i<8; i++)

{

*(tmp_P_Dst+i) = *(tmp_P_Src+i);

......

}

}

参数运动矢量SrcOffset对4(4个字节为一个字,长32位)的余数可能是0、1、2、3。当余数是0的时候,编译后执行代码是按字读取(LDW)的,这充分体现了TMS320C62X的优点,也使程序的运行效率比较高。而当余数不为0的时候,则可能是按字节读取(LDB)或是按半字读取(LDH),这使程序的运行效率较低。视频的编码和解码都要用到运动补偿来重构图像,这是一个很费时的操作,而且其代码也是图像处理中的核心代码,这样就要求编写高效的程序来完成此操作。为了使代码的运行效率更高,且结合TMS320C62X的硬件特点,希望对于不同的运动矢量,做运动补偿的时候都能采用按字读取和存储的方式。这需要对运动矢量参数除以4,根据余数调整指针,使指针始终指向字对齐方式(而在C程序中当前块是char型的以字节方式存储的,对其进行移位处理只能是一个字节一个字节地进行移位,这就使得在C程序中不能用和汇编程序同样的方法来对程序进行优化),如运动矢量除以4以后的余数为1,为了使要取的8个象素对准字访问方式,则要按图1进行操作。

根据运动矢量参数进行移位使其对准字访问的核心代码的程序为:

MVK .S2 0xFFFC,temp;获得地址的LSB位

ADD .L1X pSrc,offset,pSrc ;参考块第一个元素的地址

AND .L2X pSrc,temp,tmp_pSrc ;字对准访问的地址

AND .S1 0x0003,pSrc,rshiftA ;用两个LSB位得

;到了需右移几个字

SUB.L1 0x04,rshiftA,lshiftA ;需左移几个字

MPY.M1 rshiftA,8,rshiftA ;需右移的#bit数

MPY .M1 lshiftA,8,lshiftA ;需左移的#bit数

作为一个说明C语言与汇编程序混合编程的设计例子,采用并行汇编实现了这个函数的优化。这里只给出部分汇编程序:

.text;将该段汇编代码安排在.text

段,当然通过在C语言中用

#program_section也可以将其安排在其它自己命名的段中。

.global mc_case_a;函数名,用.def或.gloal对其进行

声明,使得C代码调用该函数

_mc_case_a:;标号,是C调用函数和汇编

被调用函数的接口处

……


.asg B10,ocsr

.asg B11,rw_4

STW.D2 ocsr,*stack--[1] ;被调用函数用到了B10~B15,A10

STW.D2 r_w4,*stack--[1] ;~A15的寄存器,则需对它们保护

MVC.S2 CSR,ocsr

AND.S2 -2,ocsr,ocsr

MVC.S2 ocsr,CSR ;关闭某些中断 ……

loop:

LDW.D2 *tmp_pSrc++[src_width1],r_w1

;读取第一个字

LDW.D1 *pSrc++[1],r-w2 ;读取第二个字

LDW.D1 *pSrc++[src_width2],r-w3 ;读取第三个字

SHRU .S2 r_w1,rshiftB, r-w1

SHL.S1 r_w3,lshiftA, r_w3

SHL .S2X r_w2,rshiftB,r_w4

SHRU .S1 r_w2,rshiftA, r_w2

OR .L2 r_w1,r_w4, r_w1

OR .L1 r_w1,r_w3,r_w2 ;这几步作了图a中的操作过程

STW .D2 r_w1,*pDst++[2]

STW .D1 r_w2,*tmpDst++[2];存储取得的两个字

B .S2 loop ;延迟跳转到标号loop处,实现循环 ……

LDW .D2T2 *++stack[1],r_w4

LDW .D2T2 *++stack[1],ocsr;对被调用函数中自己保护的寄存器作恢复处理

MVC .S2 ocsr, CSR;恢复中断环境

B .S2 B3 ;返回到调用函数处

……

在TI CCS上用其库函数CLOCK()对这个算法的C语言程序和并行汇编程序分别进行了性能测试。在纯C语言中,运动矢量对4的偏移量的余数为0 时,约为33个指令周期, 余数为1时约为93个指令周期, 余数为2 时约为 51个指令周期,余数为3 时约为 93个指令周期,平均约耗时 67个周期。而将其用并行汇编代码编写,其周期数恒定为33个指令周期。33个指令周期的执行时间,对于这个函数基本上是达到了函数的最大优化。

由此可见,程序的核心算法的代码用并行汇编程序编写,而主体的C语言程序则以函数调用的形式调用这些核心算法的并行汇编函数,是提高程序代码执行效率的一种有效方法。

参考文献

1 TMS320C6000 CPU and Instruction Set Reference Guide. Texas Instruments Incorprated,2000

2 TMS320C600 Programmer’s Guide. Texas Instruments Incorporated, 2001

3 MS320C6000 Optimizing Compiler User’s Guide. Texas Instruments Incorporated,2001

4 任丽香,马淑芬,李方慧. TMS320C6000系列DSPs的原理与应用.北京:电子工业出版社,2000.7

5 钟玉琢, 王 琪, 贺玉方.基于对象的多媒体数据压缩编码国际标准-MPEG-4及其校验模型.北京:科学出版社,2000

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

数字信号处理器(DSP)在通信、控制、图像处理等多个领域扮演着越来越重要的角色。TMS320F2808PZA作为德州仪器(Texas Instruments)推出的一款高性能DSP控制器,其独特的架构和强大的功能使其在众...

关键字: tms320f2808pza 数字信号处理器 DSP

从世界上第一颗DSP诞生至今30年来,国际一线老牌芯片厂商长期占据领先技术和市场地位,国内芯片厂商在DSP上的声量很小。然而经过了6年的沉心打磨之后,湖南进芯电子开始在这一领域崭露头角。凭借着更贴近中国本土特色的差异化产...

关键字: DSP MCU 电机控制 进芯电子

嵌入式开发作为信息技术领域的重要分支,其涉及的语言种类繁多,各具特色。这些语言的选择取决于目标平台的特性、性能需求、开发者的熟练程度以及项目的具体要求。本文将详细介绍几种常见的嵌入式开发语言,包括C语言、C++、汇编语言...

关键字: 嵌入式开发 C语言

今天,小编将在这篇文章中为大家带来数字信号处理器DSP的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: DSP 数字信号处理器

DSP的国产替代不会是一件很容易的事情,但受到当前国际竞争态势的影响,本土开发者亟需拥有降本优势、供应链安全保证,以及能协助打造极高竞争力产品的DSP芯片。也就是说,发展国产DSP是不二选择。

关键字: DSP

嵌入式处理器是一种特殊的计算机处理器,它被设计用于嵌入到各种设备和系统中,以实现特定的功能。由于其低功耗、高性能和可靠性等特点,嵌入式处理器在许多领域都有广泛的应用,如汽车电子、工业控制、医疗设备等。本文将对嵌入式处理器...

关键字: 嵌入式处理器 嵌入式系统

将DSP和单片机构成双CPU处理器平台,可以充分利用DSP对大容量数据和复杂算法的处理能力,以及单片机接口的控制能力。而DSP与单片机之间快速正确的通信是构建双CPU处理器的关键问题。

关键字: 单片机 spi通信 DSP

随着科技的不断发展,微控制器(MCU)和数字信号处理器(DSP)已经成为了电子行业中不可或缺的重要组成部分。它们在各种电子设备中发挥着关键作用,如智能手机、平板电脑、家用电器等。然而,尽管它们都是用于处理数字信号的集成电...

关键字: MCU DSP 数字信号处理器 微控制器

2023年10月10日, [恩智浦创新技术论坛] 在深圳湾万丽酒店举行,众多工业、物联网、新能源和医疗等行业的企业出席论坛,深入交流市场趋势与行业洞察,一同讨论如何协同面对市场的机遇与挑战,共同促进未来市场的发展。米尔电...

关键字: NXP 嵌入式处理器

随着环境保护和能源可持续性的日益关注,电动汽车作为一种清洁、高效的交通工具逐渐成为全球汽车行业的热点。与传统的内燃机驱动汽车相比,电动汽车具有零排放、低噪音和高能量利用效率等显著优势。

关键字: DSP 芯片 混合动力汽车
关闭
关闭