ARMv8.2核心RK3568处理器0xF0最低优先级中断未被处理问题
根因说明
该现象是ARM GIC(通用中断控制器)优先级判定规则、芯片GIC实现的位宽裁剪、内核GIC初始化默认配置三者共同作用的结果,不属于硬件故障。
关键机制说明
- GIC优先级判定逻辑:中断优先级数值越小,实际优先级越高。只有中断配置的优先级值严格小于CPU接口优先级掩码寄存器
ICC_PMR_EL1(PMR)的配置值时,中断才会从GIC转发到CPU核心触发异常处理;不满足判定条件的中断只会在GIC侧置起pending标志,不会向核心发送中断信号。 - RK3568搭载的GICv3控制器仅实现了4位有效优先级位,低4位为写忽略、读0的保留位,因此有效优先级取值只能按0x10步长对齐,可选值为
0x00、0x10、0x20……0xE0、0xF0,共16个优先级阶。 - Linux内核初始化GIC时,会将
ICC_PMR_EL1寄存器配置为0xF0,仅允许优先级值小于0xF0的中断(即0x00~0xE0共15个优先级阶)转发到核心。优先级为0xF0的中断刚好等于掩码阈值,不满足严格小于的判定条件,会被GIC CPU接口直接拦截。
测试现象对应
- 读取到的pending位置位属于GIC distributor/redistributor侧的正常行为:只要外设向GIC提交中断请求,无论优先级是否满足转发条件,pending位都会被置1。
- 将中断优先级修改为
0x00~0xE0区间的任意有效值时,优先级数值小于PMR寄存器的0xF0阈值,中断可以正常转发到核心,处理流程运行正常。 0xF0是内核预留的最低优先级屏蔽档,设计上就不分配给外设中断使用。
内容的提问来源于stack exchange,提问作者никита богатов
相关产品推荐
相关产品推荐

