Cortex-A9 SMP GICC_RPR始终为0,不触发中断

时间:2016-04-06 10:03:51

标签: arm cortex-a

上下文

在i.MX6Quad板上,当系统运行时,我发现Core3无法处理任何中断。

通过Trace32查看GIC接口寄存器,GICC_RPR始终为0,这意味着最高优先级事件正在运行,因此它解释了uppon问题:无法处理较低优先级事件。

问题

我插入了一条指令:将0写入GICC_EOI,可以将GICC_RPR更改为空闲优先级(0xFF),但它不起作用,保持为0。

目标

我想优先放弃并取消成功。

参考

  • gic arch specf :3.2.1优先级丢弃和中断停用
  

优先级下降是在有效写入时发生的运行优先级下降>到EOIR,要么是   GICC_EOIR或GICC_AEOIR。

     

优先级下降时,运行优先级从优先级降低   中断引用的   EOIR写信给

1 个答案:

答案 0 :(得分:0)

将零写入EOI并没有帮助。当中断触发时,您必须读取GICC_IAR寄存器。您获得的值是触发的中断号。如果处于传统模式,则必须将此中断编号写入EOI以停止此中断。如果处于优先级丢弃模式,将此编号写入EOI会降低优先级,将相同的值写入DI将使中断退出(检查GICC_CTLR以确认您的模式)。希望这能解决与RPR和EOI的混淆。

调试问题的一些指示: 1.检查GICD_ITARGET寄存器以查看CPU3指向的中断。 2.确保在分配器中未屏蔽CPU3中所期望的中断(如果有任何特定情况) 3.检查CPU3的GICC_PMR以查看优先级不是太高。只有当中断的优先级高于该寄存器中的值时,才会将中断从分发器转发到cpu接口 4.检查CPU3的CPU接口是否已启用 5.检查GICD_ISPEND以查看有问题的中断是否正在等待

注意:使用T32调试GIC时要小心。 T32通过读取寄存器/存储器中的值来工作。这对某些GIC寄存器有不良影响,例如,GICC_IAR寄存器只能读取一次以确认中断。进一步读取将返回虚假中断号。当连接T32并打开一个窗口来读取GICC寄存器时,这将导致无法处理的“孤儿”中断。我建议在中断处理逻辑中输入日志以调试问题。