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 汇编问题



 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语言函数完成后都会有大括号--}的   这个语句也没有啊!
  • MBCNDD 16BitDest {, CNDF} :

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

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

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


    *******************************************************************************************
    MCMPF32 MR0,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;}

    *******************************************************************************************

    MBCNDD IcurrAneg,LEQ

    根据上面的MCMPF32的结果进行判断是否执行IcurrAneg
  • 请问,假设条件成立,执行IcurrAneg,如何判断是否执行完成呢(怎么判断哪个是这个函数的最后一条指令)? 假设执行完成后,是再跳回到原位置,还是顺序执行IcurrAneg下面语句?
  • 您可以使用MSTOP停止任务.放置MSTOP指令以表示每个任务的结束。
  • 程序结构是这样:

    _Cla1Task5:

    MDEBUGSTOP
    ::
    :: 表省略很多语句
    ::
    MCMPF32 MR0,MR2
    MNOP
    MNOP
    MNOP
    MBCNDD IcurrAneg,LEQ
    MNOP
    MNOP
    MNOP
    MMOV32 MR2,@_CputoClaVar._f32IacaSampSysa
    MMPYF32 MR3,MR2,MR3
    ::
    :: 表省略很多语句
    ::
    MNOP
    MNOP
    MNOP
    MBCNDD CacuPIA,UNC ;MBCNDD-函数调用
    MNOP
    MNOP
    MNOP

    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

    CacuPIA:
    MI16TOF32 MR0,@_CputoClaVar._i16PfcCurrOffset ;i_Pfc_Iin_Offset
    MMOV32 MR1,@_ClatoCpuVar._f32PfcACurrRef ;i_Pfc_Ref_Curra
    MADDF32 MR1,MR1,MR0
    MMOV32 MR2,@_ClatoCpuVar._f32AcACurr
    ::
    :: 表省略很多语句
    ::
    MSTOP
    MNOP
    MNOP
    MNOP
    _Cla1T5End:


    只有最后的_Cla1Task5: 有一个MSTOP

    请问IcurrAneg的最后一条语句应该是MMOV32 @_ClatoCpuVar._f32AcACurr,MR3
    那执行完这条语句后,程序跳到哪里?接下来如何执行?
  • 另外,请问目前CLA支持C语言编写么?