vPortSVCHandler
中,有一条分支指令bx r14
使用GDB,我一步一步执行一条指令,发现r14(lr)在执行bx指令之前立即包含值
0xfffffffd
(不是有效地址)。与bx
(挂起)一起使用,但我仍然能够通过openOCD进行si
。我发现分支的函数实际上是在地址step
处的有效函数。 很显然,我是误会或看错了文档。将其更改为
0x08012abc
或bx
会在分支后不久导致硬故障。该分支指令如何以
lr
的值调用时,如何导致分支到0x0
的有效函数? /> #1 楼
在Cortex-M中,FFFFFFFF
附近的值用于异常返回(ECX_RETURN)。当前定义的值:
0xFFFFFFF1-返回处理程序模式,从主堆栈恢复状态
0xFFFFFFF9-返回线程模式,从主堆栈恢复状态
0xFFFFFFFD-返回线程模式,从进程堆栈还原状态,因此实际的分支地址从堆栈中获取(MSP或PSP,取决于该值的低位)。有关更多详细信息,请参见链接的文档。
由于GDB主要用于用户模式调试,因此它不希望出现这种恶作剧,并且可能会尝试将断点设置为
LR
的值,这自然会失败。 OpenOCD知道异常,并能够正确执行。