问题描述
我正在使用MDK uVision IDE学习Cortex-M。我写了一个简单的SysTick_Handler()
来代替WEAK默认值SysTick_Handler()
,这是一个简单的死循环。
我的SysTick_Handler()
:
反汇编:
为什么在那儿?尽管我已经用自己的SysTick_Handler
覆盖了WEAK默认实现,但为什么工具链仍然生成它?
我仍然可以在该行上放置一个断点,并可以将其击中。在那种情况下,我的代码将永远不会执行。
但是奇怪的是,如果我删除了该行的断点,则可以访问我的代码。那怎么可能?
解决方法
(感谢社区提供的所有提示。我想我现在可以解释它。)
死循环是我的main()
函数的一部分,如下所示。 main()
函数在同一C文件中恰好位于我的SysTick_Handler
上方。
int main (void)
{
LED_Initialize();
SysTick->VAL = 0x9000;
//Start value for the sys Tick counter
SysTick->LOAD = 0x9000;
//Reload value
SysTick->CTRL = SYSTICK_INTERRUPT_ENABLE|SYSTICK_COUNT_ENABLE; //Start and enable interrupt
while(1)
{
; // <========= This is the dead loop I saw!
}
}
为再次确认,我将while循环修改为以下内容:
int main (void)
{
volatile int32_t jj = 0;
LED_Initialize();
SysTick->VAL = 0x9000; //Start value for the sys Tick counter
SysTick->LOAD = 0x9000; //Reload value
SysTick->CTRL = SYSTICK_INTERRUPT_ENABLE|SYSTICK_COUNT_ENABLE; //Start and enable interrupt
while(1)
{
;
jj+=0x12345; // <====== add some landmark value
}
}
现在生成的代码是这样的:
尽管它仍然放在SysTick_Handler
下。我在此处放置一个断点以检查实际情况:
R1
是常量0x12345
。 R0
是局部变量jj
。我们可以看到R1
确实包含界标值0x12345
,该界标值已添加到R0
(jj
)中。因此它必须是while(1)
中main()
循环的一部分。
因此,反汇编是正确的。只是调试器未能在源代码与反汇编之间提供正确的交错。
顺便说一句,记住修改代码后要重建目标,否则uVision IDE调试器将不会反映最新的更改...。