我有一个STM32-F49ZI核心板,它是ARM Cortex 4- 32位MCU。我有自己的NMI处理程序,即NMI_Handler函数,它的地址以位0结束。我可以在调试器中看到这一点。然而,NMI处理程序的向量地址存储了与NMI_Handler函数相同的地址,只是位以1结束。我的问题是为什么会有差异。我知道这是因为ARM皮层M只支持Thumb指令,即只支持16位指令。我不能理解这个推理。它背后的原因是什么?为什么它将最后一位设置为1。
void NMI_Handler()
{
}Watchdog窗口显示
NMI_Handler address - 0x8010 1000然而,存储在NMI矢量地址中的地址是-
0x8010 1001.发布于 2019-05-30 17:14:41
尽管Cortex-M4仅支持THUMB2指令集,但为了实现当前所有ARM部件的二进制兼容性,它使用所有矢量、分支和跳转地址的最低有效位来指示THUMB模式,以便支持ARM/THUMB互通。它向处理器表明将要跳转到的代码是THUMB代码。对于支持ARM和THUMB指令集的处理器,如果当前模式不是THUMB,则会导致指令集模式切换。
您的NMI_Handler处理函数将位于链接映射中指示的偶数地址,但向量将设置LSB。当程序计数器从向量或分支地址加载时,LSB被设置为零。
请参阅Cortex M4技术参考小节中的“注意事项”框
发布于 2019-05-30 15:50:31
ARM体系结构的地址是奇数,那么指令集是THUMB,如果是偶数,那么它就是ARM指令集。
所以它必须是奇怪的
https://stackoverflow.com/questions/56371800
复制相似问题