【问题标题】:Cortex-m0 pop instruction fails when executing in vector area?在向量区域执行时,Cortex-m0 pop 指令失败?
【发布时间】:2019-02-09 23:10:33
【问题描述】:

在 Cortex-M0 上从向量区(即地址 0xC0 以下)执行时这条指令会失败,但在更高的 FLASH 中可以正常工作,是否有一些官方原因?

pop {r4,pc}

当这段代码从低于 0xC0 的地址执行时,PC 并没有真正从堆栈中弹出,而是继续执行 'pop' 之后的下一条指令(这是垃圾)。

【问题讨论】:

  • 程序计数器中弹出的地址是什么?
  • 堆栈指针是否对齐并指向正确的东西?
  • 请提供一个演示问题的最小示例。
  • 后面的指令是什么,你怎么知道它正在执行?
  • 1.没有地址被“弹出”到计数器中,下一条指令的地址被加载,就好像该指令从未发生过一样。 2. 堆栈指针对齐且正确。 “pop”指令只是“push”之后的几条指令,中间只有一些 MOV/CMP/BNE。 3. 处理最小的例子。 4.后面的指令是NOP,我可以用调试器单步执行代码,观察POP在地址>256时成功,在地址

标签: arm cortex-m


【解决方案1】:

听起来您正试图从异常处理程序返回,或从异常处理程序中更改程序计数器。 将值加载到 pc 的 pop 指令或 bx 指令将导致处理器从异常中返回,但是,它不会返回到您弹出到 pc 中的地址,而是会展开堆栈并返回到异常进入期间推送的位置。这在M0 User guide - exception entry and return 中有更详细的说明。

如果你想从异常中返回到不同的位置,你可以修改被推送的堆栈帧,用你想要的位置覆盖被推送的 pc。

【讨论】:

  • 谢谢,但这不是我想要做的。从字面上看,代码序列是:PUSH {R4,LR} ... POP {R4,PC}
【解决方案2】:

问题已解决...这是供应商特定的问题。该 SoC 在地址

感谢大家的帮助。

【讨论】:

  • 请提供零件编号,以便我们知道这些零件是特殊的。
  • 我使用了一些主要品牌的 cortex-m 部件,但从未见过我所有的程序都有处理程序。这很好奇
猜你喜欢
  • 2015-09-15
  • 2015-07-05
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2016-06-10
  • 2020-03-22
  • 1970-01-01
  • 2021-10-06
相关资源
最近更新 更多