电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 华强电子网公众号

    电子元器件

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

C6000软件优化经验总结(3)

来源:-- 作者:-- 浏览:422

标签:

摘要: 八、 1、源程序 for (k = 0; k < NB_PULSE; k++) { i = codvec[k]; j = sign[i]; index = mult(i, Q15_1_5); track = sub

八、

       1、源程序

 for (k = 0; k < NB_PULSE; k++)

 {

  i = codvec[k];

  j = sign[i];

 

  index = mult(i, Q15_1_5);

  track = sub(i, extract_l(L_shr(L_mult(index, 5), 1)));

  if (j > 0)

  {

   if (i < l_subfr) code[i] = add(code[i], 4096);

   codvec[k] += (2 * L_SUBFR);

  }

  else

  {

   if (i < l_subfr) code[i] = sub(code[i], 4096);

   index = a

dd(index, 16);

  }

  if (indx[track] < 0)

  {

   indx[track] = index;

  }

  else

  {

   if (((index ^ indx[track]) & 16) == 0)

   {

    if (sub(indx[track], index) <= 0)

    {

     indx[track] = shl((indx[track] & 16), 3)

                + shr(extract_l(L_mult((indx[track] &                 15), NB_POS)), 1) + (index & 15);

    }

    else

    {

     indx[track] = shl((index & 16), 3)

               + shr(extract_l(L_mult((index & 15),                  NB_POS)), 1) + (indx[track] & 15);

    }

   }

   else

   {

    if (sub((indx[track] & 15), (index & 15)) <= 0)

    {

     indx[track] = shl((index & 16), 3)

                + shr(extract_l(L_mult((index & 15),   NB_POS)), 1) + (indx[track] & 15);

    }                

 

    else

    {

     indx[track] = shl((indx[track] & 16), 3)

               + shr(extract_l(L_mult((indx[track] & 15),                NB_POS)), 1) + (index & 15);

    }

   }

  }

 }

       2、优化后的程序

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

 {

  i        = codvec[k];

  j        = sign[i];

  index           = _smpy(i, 6554)>>16;

  track        = i - index*5;

  con              = (j > 0);

          codvec[k]    = codvec[k] + 110*con;

                           index     = index + (!con)*16;

  conn      = (i < l_subfr);

  cono = (j > 0)? 1:-1;

  code[i]  = code[i] + 4096*conn*cono;

                           n0  = index;

                           t0 = indx[track];

                           n1  = n0&16;

                          t1  = t0&16;

 

                          n2  = n0&15;

                        

  t2  = t0&15;

  tmp0  = (_sshl(n1,19)>>16) + n2*NB_POS + t2;

  tmp1  = (_sshl(t1,19)>>16) + t2*NB_POS + n2;

  conp  = (((n1 == t1)&&(t0 > n0))||((n1 != t1)&&(t2 <= n2)));

                           tmp   = conp*tmp0 + (!conp)*tmp1;

  if (t0 < 0)

   indx[track] = n0;

  else

   indx[track] = tmp;

 }

       3、优化说明

        源程序中在循环中含有许多的if结构,在优化时对if结构首先进行化简,再将化简后的if结构用条件运算表达式进行改写,最后使循环可以Pipeline。

       九、

       1、源程序

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

 {

         max = -32767;

         for (j = 0; j < n; j++)

         {

              if (sub (tmp2[j], max) >= 0)

                      {

                       max = tmp2[j];

                        ix = j;

                      }

 

                  }

                  tmp2[ix] = -32768;

               

  tmp[i] = ix;

     }

       2、优化后的程序

       if (n0>n1) {temp=n0;n0=n1;n1=temp;}

       if (n1>n2) {temp=n1;n1=n2;n2=temp;}

     if (n2>n3) {temp=n2;n2=n3;n3=temp;}

     if (n3>n4) {temp=n3;n3=n4;n4=temp;}

     if (n0>n1) {temp=n0;n0=n1;n1=temp;}

     if (n1>n2) {temp=n1;n1=n2;n2=temp;}

     if (n2>n3) {temp=n2;n2=n3;n3=temp;}

     if (n0>n1) {temp=n0;n0=n1;n1=temp;}

     if (n1>n2) {return n1;}

       3、优化说明

        源程序也为一个求中值的问题,由于已知循环次数固定为5,因此将循环展开使用if语句直接求取中值。

十、

       1、源程序

statIC Word16 Bin2int (Word16 no_of_bits,  Word16 *bitstream)

{

    Word16 value, i, bit;

 

    value = 0;

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

    {

        value = shl (value, 1);

        bit = *bitstream++;

        if (sub (bit, BIT_1) == 0)

        value = add (value, 1);

    }

    return (value);

}

    for (i = 0; i < prmno[mode]; i++)

    {

        prm[i] = Bin2int (bitno[mode][i], bits);

 

        bits += bitno[mode][i];

    }

       2、优化后的程序

  value = 0;

 bitsp = bits;

 bitnop= &bitno[mode][0];

    j  = *bitnop++;

    j1 = *bitnop++;

    j2 = *bitnop++;

    j3 = *bitnop++;

    j4 = *

bitnop++;

    _nassert(loop[mode]>=35);

    for (i = 0; i < loop[mode]; i++)

    {

        value = value*2 + *bitsp++;

        j--;

        if (j == 0)

        {

           *prm++ = value;

           value = 0;

           j  = j1;

           j1 = j2;

           j2 = j3;

           j3 = j4;

           j4 = *bitnop++;

        }

    }

       3、优化说明

        源程序按照数据位流定义取出参数,为双重循环结构,优化中采用重新根据位流的bit长度定义循环次数,化简为单重循环,然后优化循环,去除boundary,使pipeline的数目最小。

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67