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.

[参考译文] TMS320F28069F:对于双索引阵列、CLA 比 CPU 慢得多

Guru**** 2253580 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/973718/tms320f28069f-cla-much-slower-than-cpu-for-double-index-array

器件型号:TMS320F28069F

我在 CLA 和 CPU 上运行了完全相同的代码:

uint16 CtrlStart = EPwm7Regs.TBCTR;
//传感器反向连接,正电压=负电流
CurrentMeasurement[1][0]= PhaseCurrentOffset[0]-(((Int32) AdcResult.ADCRESULT2)* MotorParameters.CurrentSensRange >> 12);
CurrentMeasurement[1][1]= PhaseCurrentOffset[1]-(((Int32) AdcResult.ADCRESULT3)* MotorParameters.CurrentSensRange >> 12);
CurrentMeasurement[1][2]= PhaseCurrentOffset[2]-(((Int32) AdcResult.ADCRESULT4)* MotorParameters.CurrentSensRange >> 12);
uint16 CtrlEnd = EPwm7Regs.TBCTR;
MotorOutputsCla.TempDebug = CtrlEnd - CtrlStart;

在 CPU 上、MotorOutputsCla.TempDebug 中的周期数为37、而在 CLA 上为1100 (!?!)。

电流测量、PhaseCurrentOffset 和 MotorParameters.CurrentSensRange 均为 Int32。

我不是很熟悉汇编程序、这是 CLA 的列表:

130 CurrentMeasurement[1][0]= PhaseCurrentOffset[0]-(((Int32) AdcResult.ADCRESULT2)* MotorParameters.CurrentSensRange >> 12);
00009062:78430000 MMOVIZ MR3、#0x0
00009064:78420000 MMOVIZ MR2、#0x0
128 uint16 CtrlStart = EPwm7Regs.TBCTR;
00009066:75806984 MMOVZ16 MR0、@0x6984
00009068:75C08800 MMOV16 @0x8800、MR0
130 CurrentMeasurement[1][0]= PhaseCurrentOffset[0]-(((Int32) AdcResult.ADCRESULT2)* MotorParameters.CurrentSensRange >> 12);
0000906a:75800B02 MMOVZ16 MR0、@b02
0000906c:7BC000ML3C SL32 MR0、16
0000906e:7B80003C MLSR32 MR0、16
00009070:73D0152C MMOV32 MR1、@0x152c、UNCF
C$L3:
00009072:78830001 MMOVXI MR3、#0x1
00009074:7C60001F MAND32 MR3、MR3、MR1
00009076:7FA00000 MNOP
00009078:7FA00000 MNOP
0000907a:7FA00000 MNOP
0000907c:7981000A MBCNDD 0xA、EQ
0000907e:7FA00000 MNOP
00009080:7FA00000 MNOP
00009082:7FA00000 MNOP
00009084:7CC0000A MADD32 MR2、MR2、MR0
C$L4:
00009086:7BC00000 MLSL32 MR0、1
00009088:7B800001 MLSR32 MR1、1
0000908a:7FA00000 MNOP
0000908c:7FA00000 MNOP
0000908e:7FA00000 MNOP
00009090:7980FFE2 MBCNDD 0xe2、NEQ
00009092:7FA00000 MNOP
00009094:7FA00000 MNOP
00009096:7FA00000 MNOP
00009098:7B40002E MASR32 MR2、12
0000909a:73C01542 MMOV32 MR0、@0x1542、UNCHF
0000909c:7CE00020 MSUB32 MR0、MR0、MR2
0000909e:74C01494 MMOV32 @0x1494、MR0
000090a0:7FA00000 MNOP
131. CurrentMeasurement[1][1]= PhaseCurrentOffset[1]-(((Int32) AdcResult.ADCRESULT3)* MotorParameters.CurrentSensRange >> 12);
000090a2:78430000 MMOVIZ MR3、#0x0
000090a4:78420000 MMOVIZ MR2、#0x0
000090a6:75800B03 MMOVZ16 MR0、@0xb03
000090a8:7BC0003C MLSL32 MR0、16
000090aa:7B80003C MLSR32 MR0、16
000090ac:73D0152C MMOV32 MR1、@0x152c、UNCF
C$L5:
000090ae:78830001 MMOVXI MR3、#0x1
000090b0:7C60001F MAND32 MR3、MR3、MR1
000090b2:7FA00000 MNOP
000090b4:7FA00000 MNOP
000090b6:7FA00000 MNOP
000090b8:7981000A MBCNDD 0xA、EQ
000090ba:7FA00000 MNOP
000090bc:7FA00000 MNOP
000090be:7FA00000 MNOP
000090c0:7CC0000A MADD32 MR2、MR2、MR0
C$L6:
000090c2:7BC00000 MLSL32 MR0、1
000090c4:7B800001 MLSR32 MR1、1
000090c6:7FA00000 MNOP
000090c8:7FA00000 MNOP
000090ca:7FA00000 MNOP
000090cc:7980FFE2 MBCNDD 0xce2、NEQ
000090ce:7FA00000 MNOP
000090d0:7FA00000 MNOP
000090d2:7FA00000 MNOP
000090d4:7B40002E MASR32 MR2、12
000090d6:73C01544 MMOV32 MR0、@0x1544、UNCHF
000090d8:7CE00020 MSUB32 MR0、MR0、MR2
000090da:74C01496 MMOV32 @0x1496、MR0
000090DC:7FA00000 MNOP
132. CurrentMeasurement[1][2]= PhaseCurrentOffset[2]-(((Int32) AdcResult.ADCRESULT4)* MotorParameters.CurrentSensRange >> 12);
000090de:78430000 MMOVIZ MR3、#0x0
000090e0:78420000 MMOVIZ MR2、#0x0
000090e2:75800B04 MMOVZ16 MR0、@b04
000090e4:7BC0003C MLSL32 MR0、16
000090e6:7B80003C MLSR32 MR0、16
000090e8:73D0152C MMOV32 MR1、@0x152c、UNCF
C$L7:
000090ea:78830001 MMOVXI MR3、#0x1
000090ec:7C60001F MAND32 MR3、MR3、MR1
000090ee:7FA00000 MNOP
000090f0:7FA00000 MNOP
000090f2:7FA00000 MNOP
000090f4:7981000A MBCNDD 0xA、EQ
000090f6:7FA00000 MNOP
000090f8:7FA00000 MNOP
000090fa:7FA00000 MNOP
000090fc:7CC0000A MADD32 MR2、MR2、MR0
C$L8:
000090fe:7BC00000 MLSL32 MR0、1
00009100:7B800001 MLSR32 MR1、1
00009102:7FA00000 MNOP
00009104:7FA00000 MNOP
00009106:7FA00000 MNOP
00009108:7980FFE2 MBCNDD 0xxe2、NEQ
0000910a:7FA00000 MNOP
0000910c:7FA00000 MNOP
0000910e:7FA00000 MNOP
00009110:7B40002E MASR32 MR2、12
00009112:73C01546 MMOV32 MR0、@0x1546、UNCHF
00009114:7CE00020 MSUB32 MR0、MR0、MR2
00009116:74C01498 MMOV32 @0x1498、MR0
133 uint16 CtrlEnd = EPwm7Regs.TBCTR;
00009118:73D08800 MMOV32 MR1、@0x8800、UNCHF
134 MotorOutputsCla.TempDebug = CtrlEnd - CtrlStart;
0000911a:7BC0003D MLSL32 MR1、16
0000911c:7B80003D MLSR32 MR1、16
133 uint16 CtrlEnd = EPwm7Regs.TBCTR;
0000911e:75806984 MMOVZ16 MR0、@0x6984
134 MotorOutputsCla.TempDebug = CtrlEnd - CtrlStart;
00009120:7BC0003C MLSL32 MR0、16
00009122:7B80003C MLSR32 MR0、16
00009124:7CE00010 MSUB32 MR0、MR0、MR1
00009126:7D800000 M32TOF32 MR0、MR0
00009128:74C014A4 MMOV32 @0x14a4、MR0

有人知道这里发生了什么吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    由于数组索引是常量的、因此它们的使用速度与非索引的纯变量的使用速度一样快。 每个数组元素的编译时间地址已知、不需要在运行时重新计算。

    是的。 CLA 和 CPU 是不同的。 您代码片段中最慢的是整数乘法。 尝试用 FP 乘法替换它

    Edward

     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢。 将所有值转换为浮点值可将其降低到27个周期、速度增益为40倍。