ZYNQ PL触发PS中断函数

ZYNQ平台PL中断到PS的处理机制与实践
本文详细介绍了ZYNQ FPGA开发中如何利用中断机制提高CPU效率,重点阐述了ZYNQ的中断类型、中断控制器的工作原理,以及在SDK中中断的配置和处理流程。通过实例分析了PL端中断触发PS端的中断处理,包括中断的触发方式设置和中断处理函数的注册。最后,提供了两个裸机中断实战案例,涉及SPI接口的共享中断数据传输。

由于外设的处理速度远远慢于CPU的处理速度 为了保证CPU和外设的数据通信正确,一般呢首先可能考虑使用死循环等待,如果死循环的时间过程长,会大大降低CPU的利用率。使用中断机制,当CPU发现设备没有准备就绪, CPU干其他的事情(比如做一个算法)一旦外设准备好了,外设会给CPU发送一个中断电信号 ,CPU一旦接收到了这个中断电信号,CPU停止当前的 任务,转去处理外设,处理完毕以后,再去接着执行原先被打断的任务。

一,ZYNQ中断底层

部分 PL 到 PS 部分的中断,经过中断控制分配器(ICD),同时进入CPU1和CPU0。查询下面表格,可以看到PL到PS部分一共有20个中断可以使用。4 个快速中断(PPI),即IRQF2P[19:16];

16个共享中断(SPI),即 IRQF2P[7:0],IRQF2P[15:8],16个中断可以任意定义。

中断一共三种类型:软件中断,私有中断和共享外设中断。

### Zynq PL-PS 中断配置及处理方法 #### 1. 中断源的定义与分类 Zynq SoC 支持多种类型的中断,其中 PL(可编程逻辑)可以通过特定机制向 PS(处理器系统)发送中断请求。这些中断分为共享中断和私有外设中断 (PPI)[^3]。 - **共享中断**: PL 提供多达 16 个中断线,用于支持各种 IP 核的中断需求。常见的 AXI_IP 如 `axi_ethernet`、`axi_uart` 和 `axi_pcie` 都通过这种方式触发中断[^2]。中断 ID 范围为 61-68 和 84-91,共计 16 个中断编号[^4]。 - **私有外设中断 (PPI)**: 每个 CPU 核心拥有独立的 5 条 PPI 线路,主要用于核心内部设备的专用中断。 --- #### 2. 中断信号的传输路径 PL中断信号需经过硬件设计中的特殊模块传递至 PS: - 使用 Concat IP 核将多个并行中断信号聚合为单一串行信号,并将其连接到 ZYNQ 的 IRQ_F2P 接口。 - 在 Vivado 工具中完成硬件设计时,确保中断信号按顺序接入 Concat IP 核的输入端口 (`in0`, `in1`, ...)。这样可以自动分配对应的中断 ID。 --- #### 3. 中断配置的具体流程 以下是基于 Vivado 和 SDK 的典型配置过程: ##### 3.1 硬件设计阶段 在 Vivado 中创建项目并集成所需 IP 核: - 将目标 IP 核(如 `AXI_UartLite` 或其他带中断功能的 IP)加入设计。 - 创建一个 Concat IP 实例,将各 IP 的中断输出信号逐一连接到其输入端口。 - 设置 Concat 输出信号连接到 ZYNQ 块的 `IRQ_F2P` 输入端口。 示例代码片段展示如何在 Tcl 文件中自动化此操作: ```tcl set concat_ip [create_bd_cell -type ip -vlnv xilinx.com:ip:concat:4.1 concat_0] set_property -dict [list CONFIG.NUM_PORTS {N}] $concat_ip connect_bd_net [get_pins axi_uart/interrupt] [get_pins concat_0/In0] connect_bd_net [get_pins concat_0/dout] [get_pins zynq_block/IRQ_F2P] ``` ##### 3.2 软件开发阶段 在 Xilinx SDK 中编写驱动程序以初始化和响应中断: - 初始化中断控制器并通过调用 API 注册回调函数来捕获指定事件。 - 对于 ARM Cortex-A9 架构下的具体实现,通常会涉及 GIC(通用中断控制器)的操作。 以下是一个典型的 C/C++ 示例代码框架说明如何注册中断服务例程 (ISR) 并启动中断监听循环: ```c #include "xil_exception.h" #include "xscugic.h" XScuGic InterruptController; // 扰动控制实例声明 // 定义自定义 ISR 函数原型 void CustomInterruptHandler(void *CallBackRef); int main() { int Status; // 初始化扰动控制系统对象 Status = XScuGic_Initialize(&InterruptController, XPAR_SCUGIC_SINGLE_DEVICE_ID); if(Status != XST_SUCCESS){ return XST_FAILURE; } // 连接用户定义的 ISR 到具体的中断 ID 上 Status |= XScuGic_Connect(&InterruptController, INTERRUPT_ID_EXAMPLE, /* 替换实际使用的中断号 */ (Xil_ExceptionHandler)CustomInterruptHandler, NULL); // 启用全局以及单个中断线路使能位 XScuGic_Enable(&InterruptController, INTERRUPT_ID_EXAMPLE); while(1){} // 主进程保持运行状态等待外部事件发生 } // 用户定制化 ISR 功能体 void CustomInterruptHandler(void *CallBackRef){ // 插入业务逻辑... } ``` 上述代码展示了基本结构,但需要根据实际情况调整参数值如 `INTERRUPT_ID_EXAMPLE` 及相关资源地址等信息[^1]。 --- #### 4. 注意事项 为了保证系统的稳定性和可靠性,在实施过程中应注意以下几个方面: - 正确匹配硬件描述文件 (.hdf) 至软件工程环境; - 确认所有参与交互组件版本兼容性良好; - 测试期间充分验证每一路信道的功能表现是否正常工作无误报漏报现象存在; ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒听雪落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值