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.

[参考译文] TMS320F28069:编译器错误:寄存器优化导致位错误和

Guru**** 2558250 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1070953/tms320f28069-compiler-bug-register-optimisations-causing-incorrect-bitwise-and

部件号:TMS320F28069


微控制器:ARM f2806x

我和我的同事克里斯认为我们在 cl2000编译器中发现了一个错误。 如果您打开“注册优化”,则在执行按位操作和时会出现错误行为。

例如:

   无符号字符 i = se_function_that_returns_Zero ();

   如果(I 和1)
   {
       //控制绝不能在这里实现
       //但确实如此!
   }

运行调试器时,它会显示“i”的值为0,并且存储在 AL 寄存器中,但仍会输入“IF”语句的真列。 如果我在调试器中检查 AL 寄存器的值,我确认它是0。

要解决这种不良行为,我必须:

   无符号字符 i = se_function_that_returns_Zero ();

   I &= 1;

   如果(i)
   {
       //控制从未到达此处
   }

我的同事 Chris 评论了 C++代码(第148至163行):

无效的 CTLC59116LedDriverControl::SetupRegisterMap()

   CTLC59116LedDriverControl 探头(0b1100101);

   无符号字符临时= 0x7f;

 

  probe.ReadReg (0x1,temp); //此函数通过引用获取“temp”并将其设置为0

 

  内部 r =温度和0x1;

 

  温度&= 0x1;

 

  //这里有龙。 如果将&放入 IF (),则存在编译器错误,它知道它是0,但认为0是真的。

   //所以不要这样做。 哦,只有在注册优化打开的情况下...

   如果(r)为{

       registerMap =&PCA9955BRegisterMap; //此行不应执行,但它是!

   }否则{

       registerMap =&TLC59116RegisterMap

   }

}

 

下面是由 cl2000生成的婴儿车组装程序:

 

_SetupRegisterMap__25CTLC59116LedDriverControlSFv:

      .dwcfi CFA_OFFSET,-2

      .dwcfi save_reg_to_mem, 26, 0

       ADB     SP,#6                ;[CPU_ARAU]

      .dwcfi CFA_OFFSET,-8

$C$DW$97    .dwtag DW_tag 变量

      dwattr $C$DW$97,DW_AT_NAME (“探测”)

      dwattr $C$DW$97,DW_AT_TI_SYMBOL_NAME ("_PROB")

      dwattr $C$DW$97,DW_AT_TYPE ($C$DW$T$41)

      dwattr $C$DW$97,DW_AT_location [DW_OP_Breg20 -4]

 

$C$DW$98    .dwtag DW_tag_variable

      dwattr $C$DW$98,dW_AT_NAME ("temp")

      dwattr $C$DW$98,DW_AT_TI_SYMBOL_NAME (“临时”)

      dwattr $C$DW$98,DW_AT_TYPE ($C$DW$T$6)

      dwattr $C$DW$98,DW_AT_location [DW_OP_Breg20 -5]

 

;* AL   分配给_r

$C$DW$99    .dwtag DW_tag 变量

      dwattr $C$DW$99,dW_AT_NAME ("r")

      dwattr 99美元,DW_AT_TI_SYMBOL_NAME ("_r")

      dwattr $C$DW$99,DW_AT_TYPE (*$C$DW$T$10)

      dwattr 99美元,DW_AT_location [DW_OP_reg0]

 

      .dwpsn 文件"./DeviceController/TLC59116LedDriverControl.CPP",第150行,第31列,is_stmt,ISA 0

       MOVZ     AR4,SP               ;[CPU_ALU]|150|

        MOVB     AL,#101              ;[CPU_ALU]|150|

        子 B     XAR4,#4              ;[CPU_ARAU]|150|

        MOVZ     AR4,AR4              ;[CPU_ALU]|150|

$C$DW$100   .dwtag DW_tag TI_BRANCH

      dwattr $C$DW$100,dW_AT_LOW_PC (0x00)

      dwattr $C$DW$100,DW_AT_NAME (“_CT___25CTLC59116LedDriverControlFUc”)

      dwattr $C$DW$100,DW_AT_TI_CALL

 

       LCR      #__CT__25CTLC59116LedDriverControlFUc;[CPU_ALU]|150|

        ;呼叫发生[#__CT__25CTLC59116LedDriverControlFUc];[]|150|

      .dwpsn 文件"./DeviceController/TLC59116LedDriverControl.CPP",第151行,第24列,is_stmt,ISA 0

       MOVB     *-SP[5],#127,UNC     ;[CPU_ALU]|151|

      .dwpsn 文件"./DeviceController/TLC59116LedDriverControl.CPP",第153行,第5列,is_stmt,ISA 0

       MOVZ     AR4,SP               ;[CPU_ALU]|153|

        MOVZ     AR5,SP               ;[CPU_ALU]|153|

        MOVB     AL,#1                ;[CPU_ALU]|153|

        子 B     XAR4,#4              ;[CPU_ARAU]|153|

        子 B     XAR5,#5              ;[CPU_ARAU]|153|

        MOVZ     AR4,AR4              ;[CPU_ALU]|153|

        MOVZ     AR5,AR5              ;[CPU_ALU]|153|

$C$DW$101   .dwtag DW_tag TI_BRANCH

      dwattr $C$DW$101,DW_AT_LOW_PC (0x00)

      dwattr $C$DW$101,DW_AT_NAME ("_ReadReG__25CTLC59116LedDriverControlFUcRUc")

      dwattr $C$DW$101,DW_AT_TI_CALL

 

       LCR      #_ReadRe__25CTLC59116LedDriverControlFUcRUc;[CPU_ALU]|153|

        ;呼叫发生[#_ReadRe__25CTLC59116LedDriverControlFUcRUc];[]|153|

      .dwpsn 文件"./DeviceController/TLC59116LedDriverControl.CPP",第154行,第11列,is_stmt,ISA 0

             AL,*-SP[5],#0x0001   ;[CPU_ALU]|154|

      .dwpsn 文件"./DeviceController/TLC59116LedDriverControl.CPP",第155行,第5列,is_stmt,ISA 0

             *-SP[5],#0x0001      ;[CPU_ALU]|155|

      .dwpsn 文件"./DeviceController/TLC59116LedDriverControl.CPP",第159行,第9列,is_stmt,ISA 0

       CMPB     AL,#0                ;[CPU_ALU]|159|

        b        $C$L9, EQ             ;[CPU_ALU]|159|

        ;出现分支 cc;[]|159|

        MOVL     XAR4,#_PCA9955B 注册表 Map__25CTLC59116LedDriverControl;[CPU_ARAU]|159|

        b        $C$L10, UNC           ;[CPU_ALU]|159|

        ;分支发生;[]|159|

$C$L9:    

        MOVL     XAR4,#_TLC59116RegisterMap__25CTLC59116LedDriverControl;[CPU_ARAU]|159|

$C$L10:    

        MOVW     DP,#_registerMap__25CTLC59116LedDriverControl;[CPU_ARAU]

        MOVL     @ü r_registerMap__25CTLC59116LedDriverControl,XAR4;[CPU_ALU]|159|

      .dwpsn 文件"./DeviceController/TLC59116LedDriverControl.CPP",第163行,第1列,is_stmt,ISA 0

       MOVZ     AR4,SP               ;[CPU_ALU]|163|

        MOVB     AL,#2                ;[CPU_ALU]|163|

        子 B     XAR4,#4              ;[CPU_ARAU]|163|

        MOVZ     AR4,AR4              ;[CPU_ALU]|163|

$C$DW$102   .dwtag DW_tag TI_BRANCH

      dwattr $C$DW$102,DW_AT_LOW_PC (0x00)

      dwattr $C$DW$102,DW_AT_NAME (“__dt__25CTLC59116LedDriverControlFv”)

      dwattr $C$DW$102,DW_AT_TI_CALL

 

       LCR      #__dt__25CTLC59116LedDriverControlFv;[CPU_ALU]|163|

        ;呼叫发生[#__dt__25CTLC59116LedDriverControlFv];[]|163|

        SubB     SP,#6                ;[CPU_ARAU]

      .dwcfi CFA_OFFSET,-2

$C$DW$103   .dwtag DW_tag TI_BRANCH

      dwattr $C$DW$103,DW_AT_LOW_PC (0x00)

      dwattr $C$DW$103,DW_AT_TI_Return

 

       LRETR    ;[CPU_ALU]

        ;返回;[]

      dwattr $C$DW$96,DW_AT_TI_END_FILE ("./DeviceController/TLC59116LedDriverControl.CPP")

      dwattr $C$DW$96,DW_AT_TI_END_LINE (0xa3)

      dwattr $C$DW$96,DW_AT_TI_END_COLUMN (0x01)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在刚刚进行进一步调查后,调试器似乎只是在突出显示错误的行(即,编译器正在突出显示“IF”语句的“TRUE”段,即使它实际上已输入“FALSE”段)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    优化代码越多,调试器就越可能像这样混淆。  当您查看 IF / ELSE 结束后的 registerMap 中的内容时,它是否有预期的结果?

    谢谢,此致,

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,我们发现“registerMap”设置正确,尽管调试器另有说明。

    我们将在未来牢记在运行调试器之前关闭优化(尽管有时,如果优化器将代码大小缩小到几乎不适合)。