Cortex-A9 SMP GICC_RPR 始终为 0,不触发中断
Cortex-A9 SMP GICC_RPR always be 0, interrupt not triggered
上下文
在i.MX6Quad板上,当系统运行时,我发现Core3无法处理任何中断。
通过Trace32查看GIC接口寄存器,GICC_RPR一直为0,表示优先级最高的事件是运行,所以就解释了上面的问题:优先级低的事件无法处理。
问题
我插入了一条指令:写0到GICC_EOI,可以把GICC_RPR改成idle priority(0xFF),但是不行,保留0.
目标
我想做优先级下降和停用成功。
参考资料
- gic arch specf : 3.2.1 优先级下降和中断停用
Priority drop is the drop in the Running priority that occurs on a valid write > to an EOIR, either the
GICC_EOIR or the GICC_AEOIR.
On priority drop, the running priority is reduced from the priority of the
interrupt referenced by the
EOIR write to either
将零写入 EOI 没有帮助。当中断触发时,您必须读取 GICC_IAR 寄存器。您获得的值是触发的中断号。如果您处于传统模式,则必须将此中断号写入 EOI 以退出此中断。如果您处于优先级下降模式,将此数字写入 EOI 会降低优先级,将相同的值写入 DI 将退出中断(检查 GICC_CTLR 以确认您的模式)。希望这能消除与 RPR 和 EOI 的混淆。
调试问题的一些提示:
1. 查看GICD_ITARGET寄存器,有中断指向CPU3。
2. 确保您在 CPU3 中期望的中断(如果有任何特定内容)未在分发器中被屏蔽
3.检查GICC_PMR为CPU3,看优先级不是太高。仅当中断的优先级高于此寄存器中的值时,中断才会从分发器转发到 cpu 接口
4. 检查 CPU 接口是否启用 CPU3
5. 检查 GICD_ISPEND 以查看有问题的中断是否挂起
注意:使用T32调试GIC时要小心。 T32 通过读取 registers/memory 中的值来工作。这对某些 GIC 寄存器有不良影响,例如 GICC_IAR 寄存器只能读取一次以确认中断。进一步阅读将 return 虚假中断号。当接上T32,开一个window读取GICC寄存器,这会造成一个'orphan'中断,无人管。我建议在中断处理逻辑中放入日志来调试问题。
上下文
在i.MX6Quad板上,当系统运行时,我发现Core3无法处理任何中断。
通过Trace32查看GIC接口寄存器,GICC_RPR一直为0,表示优先级最高的事件是运行,所以就解释了上面的问题:优先级低的事件无法处理。
问题
我插入了一条指令:写0到GICC_EOI,可以把GICC_RPR改成idle priority(0xFF),但是不行,保留0.
目标
我想做优先级下降和停用成功。
参考资料
- gic arch specf : 3.2.1 优先级下降和中断停用
Priority drop is the drop in the Running priority that occurs on a valid write > to an EOIR, either the GICC_EOIR or the GICC_AEOIR.
On priority drop, the running priority is reduced from the priority of the interrupt referenced by the EOIR write to either
将零写入 EOI 没有帮助。当中断触发时,您必须读取 GICC_IAR 寄存器。您获得的值是触发的中断号。如果您处于传统模式,则必须将此中断号写入 EOI 以退出此中断。如果您处于优先级下降模式,将此数字写入 EOI 会降低优先级,将相同的值写入 DI 将退出中断(检查 GICC_CTLR 以确认您的模式)。希望这能消除与 RPR 和 EOI 的混淆。
调试问题的一些提示: 1. 查看GICD_ITARGET寄存器,有中断指向CPU3。 2. 确保您在 CPU3 中期望的中断(如果有任何特定内容)未在分发器中被屏蔽 3.检查GICC_PMR为CPU3,看优先级不是太高。仅当中断的优先级高于此寄存器中的值时,中断才会从分发器转发到 cpu 接口 4. 检查 CPU 接口是否启用 CPU3 5. 检查 GICD_ISPEND 以查看有问题的中断是否挂起
注意:使用T32调试GIC时要小心。 T32 通过读取 registers/memory 中的值来工作。这对某些 GIC 寄存器有不良影响,例如 GICC_IAR 寄存器只能读取一次以确认中断。进一步阅读将 return 虚假中断号。当接上T32,开一个window读取GICC寄存器,这会造成一个'orphan'中断,无人管。我建议在中断处理逻辑中放入日志来调试问题。