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.
我在 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倍。