您好,我目前正在使用在“裸机”上运行的 AT91SAM7X256。我已经彻底阅读了数据表和架构手册,考虑到这一点,我得出的结论是 FIQ 的优先级高于 IRQ,因此 FIQ 不应被 IRQ 抢占
但是在实践中,我注意到 IRQ 暂停了我的 FIQ 处理程序的执行,即使我没有触及 CPSR 中的 F 位。假设不应该暂停 FIQ 以服务 IRQ 是否不正确?
我需要做些什么来确保我的 FIQ 服务程序不会被中断?
谢谢
当您进入 FIQ 处理程序时,ARM 内核通过设置 CPSR 中的“I”和“F”位自动禁用更多中断,包括 FIQ 和 IRQ。这让您感觉没有任何东西可以抢占 FIQ。但是 SW 可以覆盖这种行为!所以我猜你的代码的某些部分正在触摸 CPSR 并重置“I”位。因此,即使您的 FIQ 正在运行,也可能会触发 IRQ 中断。
补充上面的解释,FIQ 看起来特别的原因是当输入一个 IRQ 处理程序时,只有通过禁用更多的 IRQ 才设置“I”位。'F' 位未设置,因此进一步的 FIQ 可以中断正在运行的 IRQ 处理程序,而无需 SW 干预。