arm - 为什么存储在 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.
解决方案
虽然 Cortex-M4仅支持 THUMB2 指令集,但为了在所有当前 ARM 部件之间实现二进制兼容性,它使用所有向量、分支和跳转地址的 LSB 来指示 THUMB 模式,以支持 ARM/THUMB 互通。它向处理器指示要跳转到的代码是THUMB 代码。对于支持 ARM 和 THUMB 指令集的处理器,如果当前模式不是 THUMB,它会导致指令集模式切换。
您的NMI_Handler
处理程序函数将位于链接映射中指示的偶数地址,但向量将设置 LSB。当程序计数器从向量或分支地址加载时,LSB 设置为零。
请参阅 Cortex M4 技术参考第3.9.1 节异常处理和优先级中的“注意”框
推荐阅读
- react-native - 抽屉导航内的堆栈导航反应原生?
- apache-spark - 我们可以在带有 beta 版的 PROD 环境中的 Kubernetes 上使用 spark 吗?
- python-3.x - 在函数中使用参数
- javascript - @HostListener 如何进行事件绑定?
- verilog - 带有 1 位全减法器的 4 位全减法
- tensorflow - Tensorflow 中具有复杂输入的 Gamma 函数
- amazon-s3 - S3 SignedURL UploadPart 因 SignatureDoesNotMatch 而失败
- rules - 如何修复 CLIPS 的“ProfileInfoCommand”的核心转储?
- android - 将项目列表添加到回收站视图
- r - 如何在ggplot2 barplot中标记子组