微控制器: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)