首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cortex-M3:更改中断返回地址

Cortex-M3:更改中断返回地址
EN

Stack Overflow用户
提问于 2012-03-02 07:54:40
回答 2查看 2.4K关注 0票数 2

我需要编辑ISR的返回地址。无论中断来自何处,ISR都应在处理中断后返回到特定地址。这是为了便于快速系统重置。该功能不能在普通固件中实现,因为定时太紧,无法频繁地检查某处的标志。

我试过编辑ISR在异常进入时保存的堆栈框架,这似乎工作了几毫秒,然后它进入了micro的“哦,见鬼,有些东西变坏了”状态。在这种状态下,堆栈看起来很正常,并且没有任何错误的迹象。即使我弹出堆栈并将完全相同的数据推回到堆栈上,也会发生这种情况。此外,使用堆栈指针相对存储会导致此故障。

有关异常处理的信息可以在here上找到,但我找不到足够的信息来告诉我出了什么问题。

想法?我真的只需要让中断返回到相同的标签,而不管中断在哪里命中,并且不会让内核变得如此繁琐。

谢谢,斯图尔特

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-03 02:39:32

A word of warning:这个项目是用lot的假设用汇编编写的。这个过程在C或汇编中可能是不安全的,因为你不知道当中断发生时CPU的确切状态是什么。

在摆弄堆栈帧一段时间后,我意识到保存的状态寄存器(xPSR)设置了一些我在操作过程中没有看到的位。原来,中断有时是在LDM或STM命令执行过程中触发的。Cortex-M3具有保存这些命令状态的功能,以便正确恢复这些命令。当它从中断返回到我指定的位置,期望完成LDM/STM命令,但无法完成时,就会出现问题。

为了解决这个问题,我只需清除堆栈帧中保存的状态寄存器中的ICI位。这使得Cortex-M3“忘记”它正在处理LDM/STM命令,并允许处理器返回到任意位置而不会产生任何后果。

票数 4
EN

Stack Overflow用户

发布于 2012-03-03 02:44:51

通过设置应用中断和复位控制寄存器(addess 0xE000ED0C)中的SYSRESETREQ (位2),可以进行复位。

在C语言中,我写道:

代码语言:javascript
复制
// Reset by setting SYSRESETREQ
SCB->AIRCR = 0x05FA0004;

与你正在尝试的其他方法相比,这可能是一个干净得多的重置。

您可以在ARM的Cortex M3技术参考手册中找到更多详细信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9526077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档