新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于TMS320C62X DSP的混合编程研究

基于TMS320C62X DSP的混合编程研究

作者:时间:2008-08-12来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/258049.htm
  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)。完成此功能的函数如下:

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

  { ……

  for (i=0; i8; 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数

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

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

  段,当然通过在中用

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

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

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

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

  被调用函数的接口处

  ……


评论


相关推荐

技术专区

关闭