c语言中不允许编译器优化,如何控制C编译器优化的内容?

我正在使用Silicon Labs IDE和SDCC编译器在C语言中为嵌入式设备编写固件。器件架构基于8051系列。有问题的功能如下所示。该功能用于设置MCU上的端口以驱动步进电机。它被一个中断处理程序调用。 big switch语句只是将端口设置为下一个电机步骤的正确值。该功能的底部部分查看来自霍尔效应传感器的输入和移动的多个步骤,以便检测电机是否已停止。问题是,由于某种原因,看起来像这样的第二个IF语句似乎总是得到优化。如果我尝试在HandleStallEvent()调用时设置断点,则IDE会向我显示一条消息,指出“此行号没有地址关联”。我在阅读汇编时并不是很擅长讲述它正在做什么,但我已经从下面的asm输出中粘贴了一个片段。任何帮助将非常感激。

void OperateStepper(void)

{

//static bit LastHomeMagState = HomeSensor;

static bit LastPosMagState = PosSensor;

if(PulseMotor)

{

if(MoveDirection == 1) // Go clockwise

{

switch(STEPPER_POSITION)

{

case 'A':

STEPPER_POSITION = 'B';

P1 = 0xFD;

break;

case 'B':

STEPPER_POSITION = 'C';

P1 = 0xFF;

break;

case 'C':

STEPPER_POSITION = 'D';

P1 = 0xFE;

break;

case 'D':

STEPPER_POSITION = 'A';

P1 = 0xFC;

break;

default:

STEPPER_POSITION = 'A';

P1 = 0xFC;

} //end switch

}

else // Go CounterClockwise

{

switch(STEPPER_POSITION)

{

case 'A':

STEPPER_POSITION = 'D';

P1 = 0xFE;

break;

case 'B':

STEPPER_POSITION = 'A';

P1 = 0xFC;

break;

case 'C':

STEPPER_POSITION = 'B';

P1 = 0xFD;

break;

case 'D':

STEPPER_POSITION = 'C';

P1 = 0xFF;

break;

default:

STEPPER_POSITION = 'A';

P1 = 0xFE;

} //end switch

} //end else

MotorSteps++;

StallDetector++;

if(PosSensor != LastPosMagState)

{

StallDetector = 0;

LastPosMagState = PosSensor;

}

else

{

if (PosSensor == ON)

{

if (StallDetector > (MagnetSize + 20))

{

HandleStallEvent();

}

}

else if (PosSensor == OFF)

{

if (StallDetector > (GapSize + 20))

{

HandleStallEvent();

}

}

}

} //end if PulseMotor

}

...以及此函数底部的asm输出...

; C:SiLabsOptec ProgramsHSFW_HID_SDCC_2MotionControl.c:653: if(PosSensor != LastPosMagState)

mov c,_P1_4

jb _OperateStepper_LastPosMagState_1_1,00158$

cpl c

00158$:

jc 00126$

C$MotionControl.c$655$3$7 ==.

; C:SiLabsOptec ProgramsHSFW_HID_SDCC_2MotionControl.c:655: StallDetector = 0;

clr a

mov _StallDetector,a

mov (_StallDetector + 1),a

C$MotionControl.c$657$3$7 ==.

; C:SiLabsOptec ProgramsHSFW_HID_SDCC_2MotionControl.c:657: LastPosMagState = PosSensor;

mov c,_P1_4

mov _OperateStepper_LastPosMagState_1_1,c

ret

00126$:

C$MotionControl.c$661$2$8 ==.

; C:SiLabsOptec ProgramsHSFW_HID_SDCC_2MotionControl.c:661: if (PosSensor == ON)

jb _P1_4,00123$

C$MotionControl.c$663$4$9 ==.

; C:SiLabsOptec ProgramsHSFW_HID_SDCC_2MotionControl.c:663: if (StallDetector > (MagnetSize + 20))

mov a,_MagnetSize

mov r2,a

rlc a

subb a,acc

mov r3,a

mov a,#0x14

add a,r2

mov r2,a

clr a

addc a,r3

mov r3,a

clr c

mov a,r2

subb a,_StallDetector

mov a,r3

subb a,(_StallDetector + 1)

jnc 00130$

C$MotionControl.c$665$5$10 ==.

; C:SiLabsOptec ProgramsHSFW_HID_SDCC_2MotionControl.c:665: HandleStallEvent();

ljmp _HandleStallEvent

00123$:

C$MotionControl.c$668$2$8 ==.

; C:SiLabsOptec ProgramsHSFW_HID_SDCC_2MotionControl.c:668: else if (PosSensor == OFF)

jnb _P1_4,00130$

C$MotionControl.c$670$4$11 ==.

; C:SiLabsOptec ProgramsHSFW_HID_SDCC_2MotionControl.c:670: if (StallDetector > (GapSize + 20))

mov a,#0x14

add a,_GapSize

mov r2,a

clr a

addc a,(_GapSize + 1)

mov r3,a

clr c

mov a,r2

subb a,_StallDetector

mov a,r3

subb a,(_StallDetector + 1)

jnc 00130$

C$MotionControl.c$672$5$12 ==.

; C:SiLabsOptec ProgramsHSFW_HID_SDCC_2MotionControl.c:672: HandleStallEvent();

C$MotionControl.c$678$2$1 ==.

XG$OperateStepper$0$0 ==.

ljmp _HandleStallEvent

00130$:

ret

在我看来,编译器并没有从asm的外观中优化掉第二个if语句但是如果是这样的话为什么IDE不允许我这样设置断点呢?也许这只是一个愚蠢的IDE!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值