首页 > 解决方案 > 为什么存储在 NMI Vector 地址中的 NMI 函数地址以 ARM 皮质中的位 1 结尾?

问题描述

我有一个 STM32-F49ZI 核板,它是 ARM Cortex 4 - 32 位 MCU。我有自己的 NMI 处理程序,即 NMI_Handler 函数,其地址以位 0 结尾。我可以在调试器中看到它。但是,NMI Handler 的向量地址与 NMI_Handler 函数的地址相同,只是该位以 1 结尾。我的问题是为什么会有差异。我知道这是因为 ARM cortex M 仅支持 Thumb 指令,即仅支持 16 位指令。我无法理解这个推理。背后的原因是什么?为什么它将最后一位设置为 1。

void NMI_Handler()
{

}

看门狗窗口显示

NMI_Handler address - 0x8010 1000

但是,NMI Vector 地址中存储的地址是——

0x8010 1001.

标签: armembedded

解决方案


虽然 Cortex-M4支持 THUMB2 指令集,但为了在所有当前 ARM 部件之间实现二进制兼容性,它使用所有向量、分支和跳转地址的 LSB 来指示 THUMB 模式,以支持 ARM/THUMB 互通。它向处理器指示要跳转到的代码是THUMB 代码。对于支持 ARM 和 THUMB 指令集的处理器,如果当前模式不是 THUMB,它会导致指令集模式切换。

您的NMI_Handler处理程序函数将位于链接映射中指示的偶数地址,但向量将设置 LSB。当程序计数器从向量或分支地址加载时,LSB 设置为零。

请参阅 Cortex M4 技术参考第3.9.1 节异常处理和优先级中的“注意”框


推荐阅读