Arm Cortex-A9定时器触发的IRQ无法清除问题排查
在QEMU xilinx-zynq-a9平台上裸机应用私有定时器中断异常问题
问题现象
- 私有定时器首次触发IRQ符合预期,但之后会无间隔反复触发,而非设定的固定周期
- 调试器单步执行时能回到主函数,但自由运行时无法返回
- 手动配置了IRQ、FIQ及普通栈,
$sp和cpsr寄存器状态均正常,排除栈损坏问题
排查分析
- 怀疑GIC未正确撤销中断:参考实现了中断处理流程,首次倒计时完成后成功进入
irq_handler并执行isr(),但完成中断应答、清除定时器ISR、发送中断结束信号后,会立即重新进入ISR - 测试单触发模式(确认计数后不再重启定时器),IRQ仍会反复触发;改用全局定时器,问题同样存在
- 添加
-d trace:gic*参数获取QEMU跟踪信息:执行gic_end_interrupt()后,仍出现以下日志,显示IRQ 29仍被识别为待处理状态:gic_update_bestirq cpu 0 irq 29 priority 0 cpu priority mask 248 cpu running priority 256 gic_update_set_irq cpu[0]: irq = 1
系统信息
- QEMU emulator version 8.0.2
- 目标平台:
xilinx-zynq-a9裸机应用 - 编译参数:
-march=armv7-a -marm
已验证内容
- 定时器配置的控制寄存器、加载寄存器值符合预期,定时器能正常倒计时并触发首次中断
- 调用
WRITE32(pt_regs->timer_interrupt_status, 0x1);无法清除中断状态
内容的提问来源于stack exchange,提问作者i_am_human_probably
相关产品推荐
相关产品推荐

