器件型号:LAUNCHXL-F28377S
工具/软件:TI C/C++编译器
你(们)好
我必须调节通过 TMM320F28377S DSP 的 PWM 驱动的多个 H 桥的输出电压。 我使用的是 TI DCL 库版本2.01.0。
起初我想使用 PI 控制器的汇编版本(DCL_runPI_C1),但我发现它对我来说并不是很实用。 我不知道如何从 C 代码调用汇编函数、或者我的一些编译器设置错误。 问题是汇编函数似乎没有正确保存寄存器上下文。 这是从 DCL 库复制的汇编器函数。 您可以看到、在某个时候、它使用0xA 加载寄存器 AR1。 该寄存器不会保存在函数开始时的上下文保存中。
问题是、我的调用 C 函数使用 XAR1将索引保存到数组中、以保存汇编 PI 控制器的计算结果。 这意味着从汇编函数返回后、索引会丢失、并且始终指向错误的数组元素。
_DCL_runPI_C1: .asmfunc ;上下文保存 MOV32* SP++、R4H MOV32* SP++ 、R6H ;伺服错误 SUBF32R4H、R0H、R1H;R4H = KP;比例路径 MOV32 R5H、R6H = R32 ;R5H = R4H、R32+ R32];R5H = R4ARV2;R4ARV+ R32+ R4V2、R32[积分路径 R32] R5H = Ki MPYF32R4H、R5H、R6H;R4H = v3 MOVAR1、#0xA;AR1 = 10 MOV32R5H、*+ XAR4[AR1];R5H = i6 MPYF32R3H、R4H、R3H = 10 、R4H、R4V4V4、R32[ARV4V]R5H = v4 零R1H;R1H = 0.0f MOV32*+XAR4[4]、R5H;保存 I10 ;控制 ADDF32R0H、R5H、 R6H;R0H = v5 ADDF32R5H、R1H、#1.0;R5H = 1.0f MOV32R3H、*+ XAR4[6];R3H = Umax MINF32R0H、R3H;如果(v5 > Umax) R0H = Umax 否则 R0H =|||RM32 R0H、R3H;如果(v5 > Umax) R0H = Umax; R5ARV = 0H = 0H = Umax;R5V、R5H = R5H = R5H;R5AR0 = 8 MOV32R3H、*+ XAR4[AR0];R3H = Umin MAXF32R0H、R3H;if (v5 < Umin) R0H = Umin 否则 R0H = v5 ||MOV32R5H、R1H;R5H = 0.0f ;anti-wdup * ARV3H;RESTOR-32+ MOV32[开槽 2、R32];RESTORE + ARV3+ AR32]保存 i6 MOV32R5H、*- SP、UNCF MOV32R4H、*- SP、UNCF LRETR .endasmfunc .end
void clcCalcControl (const uint16_t c、float ref、float fb) { 浮点 pContraut; pConttrOut = DCL_runPI_C1 (&piController[c]、ref、fb); 控制[c] =(ref + piContrOut)/ ref; }
如果我在 汇编函数的开头添加一个 MOVL *SP++、XAR1、在 末尾添加一个 MOVL XAR1、*--SP、它就可以正常工作。
这是汇编函数中的错误、还是我可以通过设置编译器选项或优化级别来解决的问题?
谢谢、
Jens