在ARM CPU上启用外部中止

时间:2014-05-30 19:53:12

标签: embedded arm

来自Cortex-R reference manual可能不是特定于Cortex-R的

  

异步中止屏蔽

     

异步中止的本质意味着它们可以在处理器处理不同的中止时发生。如果异步中止在这种情况下生成新异常,则会覆盖r14_abtSPSR_abt值。如果在将数据推送到内存中的堆栈之前发生这种情况,则有关第一次中止的状态信息将丢失。为了防止这种情况发生,CPSR包含一个掩码位,即A位,表示不能接受异步中止。当A位置1时,处理器保持发生的任何异步中止,直到A位被清除,实际发生异常时。在中止,IRQ或FIQ异常以及复位时自动设置A位。在状态信息已堆叠到内存或不再需要后,您必须清除中止处理程序中的A位。

我的问题是,如果我重置了A位,那我怎么知道异步中止是否有待处理?可以清除挂起的外部中止而不取消屏蔽A位并取消异常吗?或者更一般地说,是否有关于在重置后清除A位的建议?

显然,我当前启动链中的某些内容有待处理的外部中止(但仅在硬启动后)。我想启用外部中止,但在异常代码中特殊情况第一个外部中止似乎相当麻烦。

1 个答案:

答案 0 :(得分:1)

在实现安全扩展的系统上,中断状态寄存器ISR可以告诉您是否存在待处理的外部中止。遗憾的是,如果您使用R4并且没有实现它们,这无济于事。

否则,在架构中我没有看到任何东西可以识别或处理中止,而不是像你说的那样接受异常。这并不让我感到惊讶 - 一般情况下,外部可以安全地忽略特殊情况。

如果系统中的错误无法修复(引导加载程序探测设备的顺序是否错误,或者类似?)那么一个变通方法,无论多么繁琐,都是当天的顺序 - 如果有一些合理的直接方式从温暖的重置告诉冷启动我可以想象一个非常简单的自包含垫片来处理它,所以主代码永远不需要知道。