TI中文支持网
TI专业的中文技术问题搜集分享网站

CLA 汇编问题

 MMOV32    MR0,@_ClatoCpuVar._f32AdVacA,UNC
 MUI16TOF32  MR2,@_CputoClaVar._u16AcVoltOffset
 MCMPF32  MR0,MR2
 MNOP
 MNOP
 MNOP
 MBCNDD  IcurrAneg,LEQ                            ;//NEED TEST  MBCNDD-函数调用
 MNOP                                                          ;如果 MR0 <= MR2   执行IcurrAneg()函数    MNOP
 MNOP
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysa
IcurrAneg:
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysNa
 MMPYF32  MR3,MR2,MR1;//(Ia-IasamplesysNb)*IasamplesyNsa
 MMOVI32  MR2,#0x38800000 ;1/(2^14)
 MMPYF32  MR3,MR2,MR3
 MUI16TOF32 MR0,@_CputoClaVar._u16PfcCurrSampOffseta
 MSUBF32  MR3,MR3,MR0;//(Ia-Iasamplesysb)*Iasamplesysa-Ioffset 
 MMAXF32  MR3,#0.0
 MMOV32  @_ClatoCpuVar._f32AcACurr,MR3
关于MBCNDD  使用还是没完全搞清楚,请关以上语句的意思 ,如果 MR0<=MR2  就执行IcurrAneg这个函数么?  如果这个函数执行完成之后 ,是跳出MR0<=MR2 这个判断条件 往下执行?  还是继续判断MR0是否小于MR2 ,如果小于再执行IcurrAneg这个函数?     这个语句相当于C语言的if判断?  还是if_else判断? 另外IcurrAneg这个函数,如何看函数的结尾呢,是否有什么标志?  C语言函数完成后都会有大括号–}的   这个语句也没有啊!

Susan Yang:MBCNDD 16BitDest {, CNDF} :

如果指定的条件为真,则通过将带符号的16Bit目标值添加到MPC值进行分支.否则,继续而不分支。如果地址溢出,则返回。

if (CNDF == TRUE) MPC += 16BitDest;

在您的代码中CNDF为 LEQ :Less than or equal to zero ZF == 1 OR NF == 1 即小于等于0

*******************************************************************************************
MCMPF32MR0,MR2 来比较MR0,MR2的值,这会影响MSTF寄存器内的标志 ZF和 NF

MCMPF32 MRa, MRb

If(MRa == MRb) {ZF=1; NF=0;}
If(MRa > MRb) {ZF=0; NF=0;}
If(MRa < MRb) {ZF=0; NF=1;}

*******************************************************************************************
MBCNDDIcurrAneg,LEQ

根据上面的MCMPF32的结果进行判断是否执行IcurrAneg

 MMOV32    MR0,@_ClatoCpuVar._f32AdVacA,UNC
 MUI16TOF32  MR2,@_CputoClaVar._u16AcVoltOffset
 MCMPF32  MR0,MR2
 MNOP
 MNOP
 MNOP
 MBCNDD  IcurrAneg,LEQ                            ;//NEED TEST  MBCNDD-函数调用
 MNOP                                                          ;如果 MR0 <= MR2   执行IcurrAneg()函数    MNOP
 MNOP
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysa
IcurrAneg:
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysNa
 MMPYF32  MR3,MR2,MR1;//(Ia-IasamplesysNb)*IasamplesyNsa
 MMOVI32  MR2,#0x38800000 ;1/(2^14)
 MMPYF32  MR3,MR2,MR3
 MUI16TOF32 MR0,@_CputoClaVar._u16PfcCurrSampOffseta
 MSUBF32  MR3,MR3,MR0;//(Ia-Iasamplesysb)*Iasamplesysa-Ioffset 
 MMAXF32  MR3,#0.0
 MMOV32  @_ClatoCpuVar._f32AcACurr,MR3
关于MBCNDD  使用还是没完全搞清楚,请关以上语句的意思 ,如果 MR0<=MR2  就执行IcurrAneg这个函数么?  如果这个函数执行完成之后 ,是跳出MR0<=MR2 这个判断条件 往下执行?  还是继续判断MR0是否小于MR2 ,如果小于再执行IcurrAneg这个函数?     这个语句相当于C语言的if判断?  还是if_else判断? 另外IcurrAneg这个函数,如何看函数的结尾呢,是否有什么标志?  C语言函数完成后都会有大括号–}的   这个语句也没有啊!

user6106831:

回复 Susan Yang:

请问,假设条件成立,执行IcurrAneg,如何判断是否执行完成呢(怎么判断哪个是这个函数的最后一条指令)?假设执行完成后,是再跳回到原位置,还是顺序执行IcurrAneg下面语句?

 MMOV32    MR0,@_ClatoCpuVar._f32AdVacA,UNC
 MUI16TOF32  MR2,@_CputoClaVar._u16AcVoltOffset
 MCMPF32  MR0,MR2
 MNOP
 MNOP
 MNOP
 MBCNDD  IcurrAneg,LEQ                            ;//NEED TEST  MBCNDD-函数调用
 MNOP                                                          ;如果 MR0 <= MR2   执行IcurrAneg()函数    MNOP
 MNOP
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysa
IcurrAneg:
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysNa
 MMPYF32  MR3,MR2,MR1;//(Ia-IasamplesysNb)*IasamplesyNsa
 MMOVI32  MR2,#0x38800000 ;1/(2^14)
 MMPYF32  MR3,MR2,MR3
 MUI16TOF32 MR0,@_CputoClaVar._u16PfcCurrSampOffseta
 MSUBF32  MR3,MR3,MR0;//(Ia-Iasamplesysb)*Iasamplesysa-Ioffset 
 MMAXF32  MR3,#0.0
 MMOV32  @_ClatoCpuVar._f32AcACurr,MR3
关于MBCNDD  使用还是没完全搞清楚,请关以上语句的意思 ,如果 MR0<=MR2  就执行IcurrAneg这个函数么?  如果这个函数执行完成之后 ,是跳出MR0<=MR2 这个判断条件 往下执行?  还是继续判断MR0是否小于MR2 ,如果小于再执行IcurrAneg这个函数?     这个语句相当于C语言的if判断?  还是if_else判断? 另外IcurrAneg这个函数,如何看函数的结尾呢,是否有什么标志?  C语言函数完成后都会有大括号–}的   这个语句也没有啊!

Susan Yang:

回复 user6106831:

您可以使用MSTOP停止任务.放置MSTOP指令以表示每个任务的结束。

 MMOV32    MR0,@_ClatoCpuVar._f32AdVacA,UNC
 MUI16TOF32  MR2,@_CputoClaVar._u16AcVoltOffset
 MCMPF32  MR0,MR2
 MNOP
 MNOP
 MNOP
 MBCNDD  IcurrAneg,LEQ                            ;//NEED TEST  MBCNDD-函数调用
 MNOP                                                          ;如果 MR0 <= MR2   执行IcurrAneg()函数    MNOP
 MNOP
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysa
IcurrAneg:
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysNa
 MMPYF32  MR3,MR2,MR1;//(Ia-IasamplesysNb)*IasamplesyNsa
 MMOVI32  MR2,#0x38800000 ;1/(2^14)
 MMPYF32  MR3,MR2,MR3
 MUI16TOF32 MR0,@_CputoClaVar._u16PfcCurrSampOffseta
 MSUBF32  MR3,MR3,MR0;//(Ia-Iasamplesysb)*Iasamplesysa-Ioffset 
 MMAXF32  MR3,#0.0
 MMOV32  @_ClatoCpuVar._f32AcACurr,MR3
关于MBCNDD  使用还是没完全搞清楚,请关以上语句的意思 ,如果 MR0<=MR2  就执行IcurrAneg这个函数么?  如果这个函数执行完成之后 ,是跳出MR0<=MR2 这个判断条件 往下执行?  还是继续判断MR0是否小于MR2 ,如果小于再执行IcurrAneg这个函数?     这个语句相当于C语言的if判断?  还是if_else判断? 另外IcurrAneg这个函数,如何看函数的结尾呢,是否有什么标志?  C语言函数完成后都会有大括号–}的   这个语句也没有啊!

user6106831:

回复 Susan Yang:

程序结构是这样:

_Cla1Task5:
MDEBUGSTOP::::表省略很多语句::MCMPF32MR0,MR2MNOPMNOPMNOPMBCNDDIcurrAneg,LEQMNOPMNOPMNOPMMOV32MR2,@_CputoClaVar._f32IacaSampSysaMMPYF32MR3,MR2,MR3::::表省略很多语句::MNOPMNOPMNOPMBCNDDCacuPIA,UNC;MBCNDD-函数调用MNOPMNOPMNOP

IcurrAneg:MMOV32MR2,@_CputoClaVar._f32IacaSampSysNaMMPYF32MR3,MR2,MR1;//(Ia-IasamplesysNb)*IasamplesyNsaMMOVI32MR2,#0x38800000 ;1/(2^14)MMPYF32MR3,MR2,MR3MUI16TOF32 MR0,@_CputoClaVar._u16PfcCurrSampOffsetaMSUBF32MR3,MR3,MR0;//(Ia-Iasamplesysb)*Iasamplesysa-Ioffset MMAXF32MR3,#0.0MMOV32@_ClatoCpuVar._f32AcACurr,MR3

CacuPIA:MI16TOF32 MR0,@_CputoClaVar._i16PfcCurrOffset;i_Pfc_Iin_OffsetMMOV32MR1,@_ClatoCpuVar._f32PfcACurrRef;i_Pfc_Ref_CurraMADDF32MR1,MR1,MR0MMOV32MR2,@_ClatoCpuVar._f32AcACurr::::表省略很多语句:: MSTOPMNOPMNOPMNOP
_Cla1T5End:

只有最后的_Cla1Task5:有一个MSTOP

请问IcurrAneg的最后一条语句应该是MMOV32@_ClatoCpuVar._f32AcACurr,MR3
那执行完这条语句后,程序跳到哪里?接下来如何执行?

 MMOV32    MR0,@_ClatoCpuVar._f32AdVacA,UNC
 MUI16TOF32  MR2,@_CputoClaVar._u16AcVoltOffset
 MCMPF32  MR0,MR2
 MNOP
 MNOP
 MNOP
 MBCNDD  IcurrAneg,LEQ                            ;//NEED TEST  MBCNDD-函数调用
 MNOP                                                          ;如果 MR0 <= MR2   执行IcurrAneg()函数    MNOP
 MNOP
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysa
IcurrAneg:
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysNa
 MMPYF32  MR3,MR2,MR1;//(Ia-IasamplesysNb)*IasamplesyNsa
 MMOVI32  MR2,#0x38800000 ;1/(2^14)
 MMPYF32  MR3,MR2,MR3
 MUI16TOF32 MR0,@_CputoClaVar._u16PfcCurrSampOffseta
 MSUBF32  MR3,MR3,MR0;//(Ia-Iasamplesysb)*Iasamplesysa-Ioffset 
 MMAXF32  MR3,#0.0
 MMOV32  @_ClatoCpuVar._f32AcACurr,MR3
关于MBCNDD  使用还是没完全搞清楚,请关以上语句的意思 ,如果 MR0<=MR2  就执行IcurrAneg这个函数么?  如果这个函数执行完成之后 ,是跳出MR0<=MR2 这个判断条件 往下执行?  还是继续判断MR0是否小于MR2 ,如果小于再执行IcurrAneg这个函数?     这个语句相当于C语言的if判断?  还是if_else判断? 另外IcurrAneg这个函数,如何看函数的结尾呢,是否有什么标志?  C语言函数完成后都会有大括号–}的   这个语句也没有啊!

user6106831:

回复 Susan Yang:

另外,请问目前CLA支持C语言编写么?

 MMOV32    MR0,@_ClatoCpuVar._f32AdVacA,UNC
 MUI16TOF32  MR2,@_CputoClaVar._u16AcVoltOffset
 MCMPF32  MR0,MR2
 MNOP
 MNOP
 MNOP
 MBCNDD  IcurrAneg,LEQ                            ;//NEED TEST  MBCNDD-函数调用
 MNOP                                                          ;如果 MR0 <= MR2   执行IcurrAneg()函数    MNOP
 MNOP
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysa
IcurrAneg:
 MMOV32  MR2,@_CputoClaVar._f32IacaSampSysNa
 MMPYF32  MR3,MR2,MR1;//(Ia-IasamplesysNb)*IasamplesyNsa
 MMOVI32  MR2,#0x38800000 ;1/(2^14)
 MMPYF32  MR3,MR2,MR3
 MUI16TOF32 MR0,@_CputoClaVar._u16PfcCurrSampOffseta
 MSUBF32  MR3,MR3,MR0;//(Ia-Iasamplesysb)*Iasamplesysa-Ioffset 
 MMAXF32  MR3,#0.0
 MMOV32  @_ClatoCpuVar._f32AcACurr,MR3
关于MBCNDD  使用还是没完全搞清楚,请关以上语句的意思 ,如果 MR0<=MR2  就执行IcurrAneg这个函数么?  如果这个函数执行完成之后 ,是跳出MR0<=MR2 这个判断条件 往下执行?  还是继续判断MR0是否小于MR2 ,如果小于再执行IcurrAneg这个函数?     这个语句相当于C语言的if判断?  还是if_else判断? 另外IcurrAneg这个函数,如何看函数的结尾呢,是否有什么标志?  C语言函数完成后都会有大括号–}的   这个语句也没有啊!

Susan Yang:

回复 user6106831:

支持的

赞(0)
未经允许不得转载:TI中文支持网 » CLA 汇编问题
分享到: 更多 (0)