社区导航

 

搜索
查看: 121|回复: 0

[资料分享] TMS320C6000嵌入式系统优化编程的分析

[复制链接]

5110

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-6-17 22:09 | 显示全部楼层 |阅读模式

       嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。简单的说就是系统的应用软件与系统的硬件一体化,类似与BIOS的工作方式。具有软件代码小,高度自动化,响应速度快等特点。特别适合于要求实时的和多任务的体系。本文分析了TMS320C6000的硬件设计和指令系统的特点,结合应用开发过程中遇到的问题,对这种高速并行DSP器件开发方法进行了总结。

  1 TMS320C6000的硬件设计与指令系统

  TMS320C6000系列DSP是TI公司最新推出的一种并行处理的数字信号处理器。它是基于TI的VLIW技术的,其中,TMS320C62xx是定点处理器,TMS320C67xx是浮点处理器。本文主要讨论TMS320C6201。该处理器的工作频率最高可以采用50MHz,经内部4倍频后升至200MHz,每个时钟周期最多可以并行执行8条指令,从而可以实现1600MIPS的定点运算能力,而且完成1024定点FFT的时间只需70μs。

  1.1 TMS320C6000的硬件结构

  TMS320C6000 CPU的结构图如图1所示。

  TMS320C6000的CPU有两个数据通道A和B,每个通道有16个32位字长的寄存器(A0~A15,B0~B15),四个功能单元(L,S,M,D),每个功能单元负责完成一定的算术或者逻辑运行。A、B两通道的寄存器并不是完全共享,只能通过TM320C6000提供的两个交换通道1X、2X,才能实现处理单元从不同通道的寄存器堆那里获取32位字长的操作数。

  TMS320C6000的地址线为32位,存储器寻址空间是4G。C6201片内集成有1Mbit SRAM——512Kbit的程序存储器(根据需要可全部配置成Cache)和512Kbit的数据存储器。通过片内的程序存储空间控制器,CPU一次可以取出256bit,即一次最多可以取出8条32位指令。

  C6201有32位的外部存储接口EMIF为CPU访问外围设备提供了无缝接口。外围设备可以是同步动态存储器(SDRAM)、同步突发静态存储器(SBSRAM)、静态存储器(SRAM)、只读存储器(ROM),也可以是FIFO寄存器。

  DSP器件一般都带有DMA控制器,可以在CPU操作的后台进行数据传输。TMS320C6201的DMA控制器有4个独立的可编程通道,可以同时进行四个不同的DMA操作,每个通道的优先级可以通过编程设定。每个通道可以根据需要传输8/16/32bit的数据,并且DMA控制器可以访问全部32位的地址空间。此外,还有一个辅助通道允许DMA控制器响应主机通过HPI口发来的请求。

  1.2 指令系统

  C62xx和C67xx共享同一个指令集。C67xx可以使用所有的C62xx指令,但因为C67xx是浮点芯片,怕以C67xx的指令集中有一些指令只能用于浮点运算。TMS320C6201CPU的设计采用了类似于RISC的结构,指令集简单、运算速度快。8个功能单元负责不同功能的运算,指令和功能单元之间存在一个映射关系。其中,L单元有23条指令,M单元有20条指令,S单元29有条指令,D单元有26条指令。

  TMS320C6201指令集针对数字信号处理算法提供了一引起特殊指令:为复杂计算提供的40bit的特殊操作的加法运算;有效的溢出处理和归一化处理;简洁的位操作功能等。TMS320C6201中最多可以有8条指令同时并行执行;所有指令均可条件执行。以上所有特点提高了指令的执行效率、减小了代码长度、大大减少了因跳转引起的开销、提高了编码效率。

  流水线操作是DSP实现高速度、高效率的关键技术之一。C6000的流水线分为三个阶段:取指、解码、执行、总共11级。和以前的C3x、C54x相比,有非常大的优势,主要表现在:简化了流水线的控制以消除流水线互锁;增加流水线的深度以消除传统流水线结构在取指、数据访问和乘法操作上的瓶颈。其中取指、数据访问分为多个阶段,使得C6000可以高速地访问存储空是。

  2 优化编程的几个方法

  C6000在设计时采用了一种类RISC机的结构,运算速率特别快,但是指令集却非常简单。象DSP算法中常用的乘加指令、循环操作指令等,在C54x和C3x中两条指令就可以完成的功能,而在C6000中却需要一个循环体,所以它的程序设计一般比较复杂。要想充分发挥C6000的运算能力,必须从它的硬件结构出去,最大限度地利用八个功能单元,使用软件流水线,尽量让程序无冲突的并行执行。

  线性汇编语言的指令系统和汇编语言的指令系统完全相同,但是它有自己的汇编优化器指令系统,用于和汇编性汇编语言时不需要考虑指令的延时、寄存器的使用和功能单元的分配,完全可以按照高级语言的方式进行编写。另外计数顺只能使用减计数,如果使用加计数,优化器将不能工作等等。但总的说来,它的代码效率远远高于高级语言,而且开发难度和开发周期比汇编语言要小得多。

  在实际开发过程中需要具体情况具体分析,选择一种高效、快捷的开发方法。以下结合应用开发中的几个模块来简述我们使用的优化方法。

  2.1 使用汇编语言进行

  使用汇编语言进行并行编程难度比较大。但在有些情况下,程序中数据有非常强的承接关系,并且该程序体逻辑关系清楚,使用的寄存器不超过32个,这时直接使用汇编语言实现,效率会更高。另外,有些使用C语言比较难实现的运算函数,在C6000的汇编指令集中可能有专用DSP指令,这时就可以直接使用汇编语言实现。

  使用汇编语言进行编程时特别需要注意的是C6000指令的延迟情况,有些指令并不是立刻就能得到结果。C6000指令集中有延迟的指令如表1所示。

表1 C6000的有延迟指令

  例1 32位归一化函数morm_1()

  short morm_1(long L_var1)

  {short var_out;

  if (L_var1= = 0L){

  var_out = (short)0;

  }

  else {

  if (L_var1= = (logn)0xffffffffL{

  var_out = (short)31;

  }

  else {

  if (L_var1< 0L) {

  L_var1 = ~L_var1;

  }

  for(var_out=(short)0;L_var1<(long)0x40000000L;

  var_out++){

  L_var1 《= 1L;

  }}}

  return(var_out);

  }

  使用汇编语言进行优化;

  .global norm_1

  _norm1:

  B B3

  CMPEQ 0,A4,B0

  [!B0] NORM A4,A4

  NOP 3

  消耗时间(时钟周期):C语言norm_1()为723;汇编语言为11。

  2.2 使用线性汇编语言重写整个函数

  对于某些以循环体为主的函数可以使用线性汇编语言重写整个函数。使用汇编优化器进行优化之后,效率是非常高的。

  下面例子是算法中计算帧能量的函数,其中包含两个单循环体。进行优化时,首先要确定循环的次数。其次尽量减少数据存取次数。仔细观察C代码,会发现两次循环次数相同。第二个循环要用到第一个循环的结果,因此可以将两个循环合并在一起,这样就避免了在第二个循环中再从存储器中取结果,减少了一半的Load操作。

  Long Comp_En(short *Dpnt)

  { int i;

  long Rez;

  short Temp[60];

  for (i=0;i<60;i ++) Temp [i] = shr(Dpnt[i],(short) 2);

  Rez=(long) 0;

  for (i=0; i <60; i ++) Rez=L_mac(Rez,Temp[i],Temp[i]);

  return Rez;

  }

  相应的线性汇编程序如下:

  .global _Comp_En ;函数名定义,对c变量前加_

  _Comp_En .cproc Dpnt;函数头定义,Dpnt是参数

  .reg Rez,Rez1,Rez2,1 ;寄存器定义,不必考虑实际的寄存器分配

  .reg t1,t2,x1,c1,m1,m2

  zero Rez

  zero Rez1

  zero Rez2

  mv Dpnt,c1

  mvk 30,i ;确定循环次数。因为用LDW代替LDH,循五环次数减少一半。

  loop1 .trip 30

  ldw *c1++,x1

  sh1 x1,16,t1

  shr t1,2,t1

  shr x1,2,t2 ;将两个循环合在一起,又减少了一半的从内存取数据的时间。

  smpyh t1,t1,m1

  smpyh t2,t2,m2

  sadd Rez1,m1,Rez1

  sadd Rez2,m2,Rez2

  [i] sub i,1,i ;循环计数器从30递减

  [i] b loop1

  sadd Rez1,Rez2,Rez

  .return Rez

  .endproc

  消耗时间(时钟周期):C语言为32971;线性汇编语言为93。

  2.3 使用线性汇编改写复杂函数中的循环体

  当函数的逻辑关系复杂,判断、跳转、函数调用情况特别多时,上面方法的效果就会在打折扣。这时可以使用线性汇编将其中的循环部分改写成一个函数,以优化后的函数调用代替环部分,而不是优化整个复杂函数。

  高速数字信号处理器件的应用范围越来越广,特别是在移动通信领域中,软件无线电、智能天线等新技术的实都需要强大的实时数字信号处理的支持。TMS320C6000系列DSP完全可以满足此类要求。但目前对于并行DSP技术的软硬件开发还处在摸索阶段,如何充分利用高速DSP的资源,是这方面的研究重点。本文研究了最新推出的TMS320C6000的优化策略,从工程和系统的角度总结出一套既能满足实时性又能保证开发时效性的实用的优化编程方法,以供分飨。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /1 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-7-19 12:15 , Processed in 0.094399 second(s), 16 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表