【问题标题】:Why the NMI function address stored in the NMI Vector address ends with the bit 1 in the ARM cortex?为什么存储在 NMI Vector 地址中的 NMI 函数地址以 ARM 皮质中的位 1 结尾?
【发布时间】:2019-05-30 04:49:18
【问题描述】:

我有一个 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.

【问题讨论】:

    标签: arm embedded


    【解决方案1】:

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

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

    请参阅 Cortex M4 技术参考部分 3.9.1 Exception handling and prioritization 中的“注释”框

    【讨论】:

      【解决方案2】:

      ARM架构的地址是奇数则指令集是THUMB,如果偶数是ARM指令集。

      所以它必须是奇怪的

      【讨论】:

        猜你喜欢
        • 2019-05-20
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多