This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F280039C: 加上一句赋值语句,CLA执行时间过长

Part Number: TMS320F280039C
Other Parts Discussed in Thread: C2000WARE

CLA任务task1中,进行乘法运算,将运算结果赋值一个全局变量(属于CLAdata区),增加了这句话,一下子增加了CLA任务执行时间,代码如下:

附图1,加上这句话:执行时间为200us

附图2,未加上这句话:执行时间80ns

  • 附图1,加上这句话:执行时间为200us

    附图2,未加上这句话:执行时间80ns

    这两张图片不清晰,请重新上传一下。

  • 就是执行的时间:任务进入IO拉高,任务退出前IO拉低。加上那句话,差别很大。

    现在发现是这样的

    1、未加那句话的时候,乘法的运算,在汇编里就默认未进行,导致时间很短

    2、加上那句话,乘法的运算,汇编里正常,导致时间长。

    请问,这个乘法运算这么占时间吗?怎么解决呢

  • 把你的运算变量全部改成float型,再测试一下。

  • 1、未加那句话的时候,乘法的运算,在汇编里就默认未进行,导致时间很短

    因为编译器检测到最终的运算结果并没有被引用,所以相关运算就被优化掉了。你可以检查一下编译器控制台有没有输出相关警告;

    附图1,加上这句话:执行时间为200us

    就是执行的时间:任务进入IO拉高,任务退出前IO拉低。
    这个乘法运算这么占时间吗?

    其实是没有任何问题的。

    根据你的设计,这个乘法在for()循环中要执行1000次,粗略的算一下,假设系统时钟是100MHz,1个时钟周期就是10ns。for()循环之外的声明定义、赋值以及翻转IO的操作,相比之下可以忽略不记,那么每次for()循环的执行时间大概就是200ns,即20个时钟周期;如果按一条汇编指令需要2~3个时钟周期来算,这么长时间大概就有6~10条汇编指令,这个是在合理的范围之内的。更何况0039最大能跑到120MHz。

    综上。

    (另外,你上传的所有图片,除了第一张正常外,其余的都是类似于缩略图的样子,不清晰,你可以自己看下)

  • 请问 相同的乘法运算,在CPU里和CLA任务里花费的时间是否不同?CLA里花费的时间更长?为什么?有什么方法可以解决?

    比如,我原本是想减小CPU的负载,把复杂的算法放到CLA里,可现在把算法从CPU挪到CLA后,在CLA中消耗 的时间更长(任务周期拉长了,无法满足实际需求)。

    以下算法:在CPU里算法占用20us ,

    而在CLA中占用336us

    算法:

    int32 sumSin = 0;
    int32 sumCos = 0;
    unsigned char i = 0;

    for(i = 0;i<8;++i)
    {
    sinQue.U16[32+i] = ADCSinCosData[i];
    cosQue.U16[32+i] = ADCSinCosData[i + RESH_AD_GAP];

    }

    for(i = 0;i<16;++i)
    {
    sinQue.U32[i] = sinQue.U32[4+i];
    cosQue.U32[i] = cosQue.U32[4+i];
    }

    if((rdcVar.calCnt&0x1) == 1)
    {
    for(i=0;i<32;++i)
    {
    sumSin = sumSin + (signed long)((signed long)sinQue.U16[i] * (signed long)Rdc_CoeBuf_Pos[i]);
    sumCos = sumCos + (signed long)((signed long)cosQue.U16[i] * (signed long)Rdc_CoeBuf_Pos[i]);
    }
    }
    else
    {
    for(i=0;i<32;++i)
    {
    sumSin = sumSin + (signed long)((signed long)sinQue.U16[i] * (signed long)Rdc_CoeBuf_Neg[i]);
    sumCos = sumCos + (signed long)((signed long)cosQue.U16[i] * (signed long)Rdc_CoeBuf_Neg[i]);
    }

    }

    rdcVar.sinEnv = (int16)(sumSin>>15);
    rdcVar.cosEnv = (int16)(sumCos>>15);

  • CLA有自己的数学库CLAmath:

    C:\ti\c2000\C2000Ware_4_03_00_00\libraries\math\CLAmath\c28