我正在调试运行FreeRTOS的ARM cortex M4(STM32F4)。在组装FreeRTOS函数vPortSVCHandler中,有一条分支指令

bx r14


使用GDB,我一步一步执行一条指令,发现r14(lr)在执行bx指令之前立即包含值0xfffffffd(不是有效地址)。与bx(挂起)一起使用,但我仍然能够通过openOCD进行si。我发现分支的函数实际上是在地址step处的有效函数。

很显然,我是误会或看错了文档。将其更改为0x08012abcbx会在分支后不久导致硬故障。

该分支指令如何以lr的值调用时,如何导致分支到0x0的有效函数? />

#1 楼

在Cortex-M中,FFFFFFFF附近的值用于异常返回
(ECX_RETURN)。当前定义的值:


0xFFFFFFF1-返回处理程序模式,从主堆栈恢复状态
0xFFFFFFF9-返回线程模式,从主堆栈恢复状态
0xFFFFFFFD-返回线程模式,从进程堆栈还原状态,因此实际的分支地址从堆栈中获取(MSP或PSP,取决于该值的低位)。有关更多详细信息,请参见链接的文档。

由于GDB主要用于用户模式调试,因此它不希望出现这种恶作剧,并且可能会尝试将断点设置为LR的值,这自然会失败。 OpenOCD知道异常,并能够正确执行。