在ARM CPU上启用外部中止

4

来自Cortex-R参考手册可能不仅适用于Cortex-R

异步中断屏蔽

由于异步中断的性质,它们可能会在处理其他中断时发生。如果在这种情况下异步中断生成新的异常,r14_abtSPSR_abt值将被覆盖。如果在数据被推送到内存堆栈之前发生这种情况,则有关第一个中断的状态信息将丢失。为了防止这种情况发生,CPSR包含一个掩码位,即A位,用于指示不能接受异步中断。当设置A位时,任何发生的异步中断都将被处理器挂起,直到清除A位并实际执行异常。A位在处理abort、IRQ或FIQ异常以及重置时自动设置。您只能在处理程序中清除A位,此时状态信息已经被堆栈到内存中,或者不再需要。

我的问题是,如果我自重置以来已经掩码了位 A,那么我怎样才能知道是否有一个 异步中止 是待处理的呢?可以在不取消掩码 A 并引发异常的情况下清除待处理的外部中止吗?或者更一般地说,在重置后如何清除 A 位? 显然,在我的当前引导链中有一个待处理的外部中止(但仅在硬件上电后)。 我想启用外部中止,但似乎在异常代码中为第一个 外部中止 进行 特例处理 太过繁琐。
1个回答

1
在实现安全扩展的系统上,中断状态寄存器(ISR)可以告诉您是否存在外部异常挂起。不幸的是,如果您使用未实现它们的R4,则这并没有太大帮助。
否则,在体系结构中,我看不到任何可以识别或处理中止的东西,除了像你说的那样触发异常。这并不让我感到意外-一般来说,一个可以安全忽略的外部中止非常一个特殊情况。
如果系统中的错误无法修复(bootloader是否以错误的顺序探测设备,或类似问题?),那么即使是繁琐的解决方法也是当务之急-如果有一种相当简单直接的方法可以区分冷启动和热重启,我可以想象一个相当微不足道且自包含的垫片来处理它,以便主代码永远不需要知道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接