TL;DR
本文围绕 ZYNQ 系列芯片的中断机制展开,先梳理中断类型(SGI、PPI、SPI 等),再说明从中断触发到 CPU 响应的完整处理过程,最后给出中断处理函数的编写要点与常见注意事项,帮助读者快速建立 ZYNQ 中断开发的整体认知。
一、ZYNQ 系列芯片中的中断类型
- 中断来源分类:介绍 GIC 中断控制器架构下 SGI(软件生成中断)、PPI(私有外设中断)、SPI(共享外设中断)三类中断的定义与典型使用场景。
- 中断号与优先级:说明各类中断的编号范围、优先级配置方式,以及中断触发类型(电平触发、边沿触发)的选择原则。
- 中断分配与路由:讲解中断如何分配到 CPU0/CPU1,以及 PL 端中断通过 SPI 接入 PS 的配置方法。
二、中断处理过程
- 中断触发与响应流程:从外设产生中断信号、GIC 仲裁、CPU 响应异常向量,到跳转中断服务程序的完整链路。
- 中断使能与屏蔽:说明 GIC 分发器与 CPU 接口的使能层级,以及中断挂起、激活、结束(EOI)状态机的流转。
- 中断嵌套与优先级抢占:分析高优先级中断抢占低优先级中断的条件与配置方式。
中断触发与响应流程详解
下图展示了 ZYNQ 中一次外设中断从产生到结束的完整链路,涵盖 GIC 分发器仲裁、CPU 接口转发、异常向量跳转、中断服务程序执行以及 EOI 结束等关键阶段。
flowchart TD
A[外设产生中断信号] --> B[GIC 分发器 Distributor 接收并仲裁]
B --> C{优先级是否高于当前运行中断}
C -- 否 --> D[保持 Pending 挂起状态]
D --> B
C -- 是 --> E[转发至目标 CPU 接口 CPU Interface]
E --> F[CPU 接口置位 IRQ 信号]
F --> G[CPU 响应 IRQ 异常]
G --> H[跳转异常向量表 IRQ 入口]
H --> I[保存现场并调用中断服务程序 ISR]
I --> J[读取 IAR 获取中断号并处理外设]
J --> K[清除外设中断标志]
K --> L[写 EOI 寄存器结束中断]
L --> M[恢复现场返回被中断代码]
各阶段说明如下:
- 外设产生中断信号:外设(如 GPIO、定时器、PL 端 IP)在满足触发条件时拉高中断线,电平触发或边沿触发方式由外设配置决定,信号随后进入 GIC 的 SPI 或 PPI 通道。
- GIC 分发器仲裁:分发器为每个中断维护 Pending、Active、Priority 等状态,收到中断后将其置为 Pending,并与当前正在处理的中断优先级比较,决定是否向 CPU 接口转发。
- CPU 接口转发:分发器选中优先级最高的 Pending 中断后,通过 CPU 接口将其标记为 Active,并置位 IRQ 信号线,通知目标 CPU 核。
- CPU 响应异常向量:CPU 在当前指令边界检测到 IRQ,保存关键寄存器现场,跳转到异常向量表中的 IRQ 入口地址。
- 跳转中断服务程序:异常入口根据中断号查表,调用对应的中断服务程序(ISR),ISR 中通常先读取 IAR 寄存器确认中断号,再执行具体外设处理逻辑。
- 清除标志与 EOI 结束:处理完成后需先清除外设侧的中断标志,再向 GIC 写 EOI 寄存器,使该中断从 Active 状态退出,从而允许后续同级或低优先级中断再次被响应。
三、中断处理函数
- 中断服务函数结构:给出基于 Xilinx 标准库的中断注册与处理函数框架,包括中断连接、使能和异常处理入口。
- 处理函数编写要点:强调处理函数应尽量简短、避免阻塞操作,明确中断清除与 EOI 的调用时机。
- 常见问题排查:列举中断不触发、重复触发、中断丢失等典型问题的排查思路。
四、总结
回顾 ZYNQ 中断类型、处理流程与处理函数三部分的核心要点,总结中断开发中的关键配置项与调试建议。
参考资料
- 占位 Xilinx UG585《Zynq-7000 SoC Technical Reference Manual》中断章节
- 占位 ARM GIC 架构规范文档
- 占位 Xilinx 官方 Standalone BSP 中断驱动 API 说明
- 占位 相关博客与实战案例链接