我正在使用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!