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.
I ran the exact same code on the CLA and the CPU:
Uint16 CtrStart = EPwm7Regs.TBCTR; // Sensor is reverse-connected, positive voltage = negative current 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 CtrEnd = EPwm7Regs.TBCTR; MotorOutputsCla.TempDebug = CtrEnd - CtrStart;
On the CPU, number of cycles in MotorOutputsCla.TempDebug is 37, while on the CLA it is 1100 (!?!).
CurrentMeasurement, PhaseCurrentOffset and MotorParameters.CurrentSensRange are all int32.
Im not very well versed in assembler, this is the listing for the 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 CtrStart = 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, @0xb02 0000906c: 7BC0003C MLSL32 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 0xffe2, NEQ 00009092: 7FA00000 MNOP 00009094: 7FA00000 MNOP 00009096: 7FA00000 MNOP 00009098: 7B40002E MASR32 MR2, 12 0000909a: 73C01542 MMOV32 MR0, @0x1542, UNCF 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 0xffe2, NEQ 000090ce: 7FA00000 MNOP 000090d0: 7FA00000 MNOP 000090d2: 7FA00000 MNOP 000090d4: 7B40002E MASR32 MR2, 12 000090d6: 73C01544 MMOV32 MR0, @0x1544, UNCF 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, @0xb04 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 0xffe2, NEQ 0000910a: 7FA00000 MNOP 0000910c: 7FA00000 MNOP 0000910e: 7FA00000 MNOP 00009110: 7B40002E MASR32 MR2, 12 00009112: 73C01546 MMOV32 MR0, @0x1546, UNCF 00009114: 7CE00020 MSUB32 MR0, MR0, MR2 00009116: 74C01498 MMOV32 @0x1498, MR0 133 Uint16 CtrEnd = EPwm7Regs.TBCTR; 00009118: 73D08800 MMOV32 MR1, @0x8800, UNCF 134 MotorOutputsCla.TempDebug = CtrEnd - CtrStart; 0000911a: 7BC0003D MLSL32 MR1, 16 0000911c: 7B80003D MLSR32 MR1, 16 133 Uint16 CtrEnd = EPwm7Regs.TBCTR; 0000911e: 75806984 MMOVZ16 MR0, @0x6984 134 MotorOutputsCla.TempDebug = CtrEnd - CtrStart; 00009120: 7BC0003C MLSL32 MR0, 16 00009122: 7B80003C MLSR32 MR0, 16 00009124: 7CE00010 MSUB32 MR0, MR0, MR1 00009126: 7D800000 MI32TOF32 MR0, MR0 00009128: 74C014A4 MMOV32 @0x14a4, MR0
Does anyone has a clue as to what's going on here?
Hi,
Since array indexes are constant, their usage is as fast as usage of nonindexed plain variables. Compile time address of each array element is known and doesn't need to be recalculated at runtime.
Yes. CLA and CPU are different. The most slow in you snippet is integer multiply. Try replacing it with FP multiply
Edward
Thanks a lot. Converting everything to floats got it down to 27 cycles, a 40 fold speed gain.