首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >暂时禁用ARM上的中断

暂时禁用ARM上的中断
EN

Stack Overflow用户
提问于 2016-10-13 19:38:40
回答 2查看 11.7K关注 0票数 7

我开始使用ARM平台(特别是TI TMS570系列)。

我有一些关键区域的代码,我不希望发生异常。因此,我希望在进入区域时保存IRQ和FIR使能标志,并在退出时恢复它们。

我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-13 20:59:42

要在CPU中临时屏蔽IRQ和FIQ,ARMv7最好的选择是使用cps

代码语言:javascript
复制
// assembly code assuming interrupts unmasked on entry

cpsid if  // mask IRQ and FIQ
...       // do critical stuff
cpsie if  // unmask

一些编译器提供了一组可从C代码中使用的__disable_irq()等内部函数,但对于其他编译器(如GCC)来说,这将是一种放弃到汇编的情况。

如果您希望临界区是嵌套的、可重入的、在中断处理程序中接受的,或者需要恢复前一个状态的任何其他东西,而不是在结束时无条件地取消屏蔽,那么您需要在屏蔽任何东西之前将该状态复制出CPSR,然后在退出时恢复它。在这一点上,取消屏蔽可能最终会更简单地处理CPSR的直接读取-修改-写入的老式方法。这是我脑海中的一个想法:

代码语言:javascript
复制
// int enter_critical_section(void);
enter_critical_section:
mrs r0, cpsr
cpsid if
and r0, r0, #0xc0  // leave just the I and F flags
bx lr

// void leave_critical_section(int flags);
leave_critical_section:
mrs r1, cpsr
bic r1, r1, r0
msr cpsr_c, r1
bx lr
票数 12
EN

Stack Overflow用户

发布于 2016-10-27 02:09:24

你可以使用_disable_interrupt_(),;_enable_interrupt_();,从高生成代码(sys_core.h)

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

https://stackoverflow.com/questions/40019929

复制
相关文章

相似问题

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