ZYNQ开发之PL-PS中断

1、说明
\qquad 本文叙述了ZYNQ芯片中断相关内容,并且例举了PL-PS中断实例。参考文献ug585.
2、系统中断架构
\qquad 每个CPU都有一组私有外围中断(PPIs),通过使用banked register进行私有访问。PPIs包括全局定时器、私有看门狗定时器、私有定时器和来自PL的FIQ/IRQ。
\qquad 软件产生的中断(SGIs)被路由到一个或两个cpu。SGIs是通过写入通用中断控制器(GIC)中的寄存器来生成的。
\qquad 共享外围中断(SPI)由PS和PL中的各种I/O和内存控制器生成。它们被路由到其中一个或两个cpu。来自PS外围设备的SPI中断也被路由到PL。
在这里插入图片描述
在这里插入图片描述
3. 通用中断控制器(GIC)
\qquad 通用中断控制器(GIC)用于管理来自PS和PL的发送到CPU的中断。当CPU接口接收到下一个中断时,控制器启用、禁用、屏蔽、对中断源进行优先排序,然后以编程的方式将它们发送到所选的CPU(或CPU)。此外,为了实现安全系统控制器还支持扩展为安全模式。
\qquad 寄存器通过CPU专用总线进行访问,以实现快速读/写响应,避免了互连中的临时阻塞或其他瓶颈。
\qquad 中断分发服务器将所有中断源集中起来,然后将具有最高优先级的中断源分派给各个CPU。GIC确保一个针对多个CPU的中断一次只能被一个CPU执行。所有中断源都由唯一的中断ID号标识。所有中断源都有自己的可配置优先级和目标CPU列表。

4、软件中断SGI
\qquad 每个CPU可以自己产生中断,也可以由其他CPU产生中断,或者使用软件生成中断(SGI),共有16个SGI。通过写SGI中断号到ICDSGIR寄存器和指定的目标CPU可以生成一个SGI。这个写操作通过CPU专用总线完成。每个CPU有至多16个SGI。中断的清除操作是通过读取ICCIAR寄存器或写1到ICDICPR寄存器的相应bit位。所有的SGI是边沿触发,敏感类型是固定不可更改的。ICDICFR0寄存器是只读的,因为它指定了所有16个SGIs的敏感性类型。

5、私有外设中断PPI
\qquad

在基于Zynq的Linux系统中,PL(可编程逻辑)到PS(处理系统)的中断配置是一个重要的环节,确保两者之间的通信顺畅。下面将详细介绍如何正确配置Linux内核以支持这种类型的中断,并提供一些实用技巧帮助您顺利完成这个过程。 ### Zynq Linux PL-PS 中断的基本原理 当PL侧发生某个事件(如定时器超时、数据准备好等),它可以生成一个中断信号并通过AXI中断控制器传递给PS端。然后,Linux操作系统会响应该中断并执行相应的ISR(Interrupt Service Routine)。为此,我们需要确保以下几个方面都得到了妥善配置: #### 1. **设备树(Device Tree)** 编辑 设备树是用来描述嵌入式系统的硬件拓扑结构及其属性的数据结构。针对PL-PS中断的具体情况,在设备树源文件(.dts)里需明确指定: - 中断线映射关系; - 所有相关外围设备节点; 示例片段展示了一个简单的UART实例: ```c amba_pl { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <1>; uart0: serial@e0001000 { /* 这里的地址取决于具体的硬件连接 */ device_type = "serial"; compatible = "xlnx,xuartps"; // Xilinx提供的串口IP核心兼容字符串 reg = <0xe0001000 0x100>; // 物理基址和大小 interrupts = <0 89 4>; // IRQ编号及类型(这里假设是第89号中断) interrupt-parent = <&gic>; // GIC作为上级中断控制单元 status = "okay"; xlnx,fifo-depth = <256>; clocks = <&clkc 7>, <&clkc 8>; clock-names = "ref_clk", "aper_clk"; }; ``` 此段代码说明了如何为UART分配合适的中断资源并且关联到了全局中断控制器(GIC)。 #### 2. **内核配置** 为了让Linux识别并管理上述硬件资源,必须适当调整`.config`文件内的各项开关状态。通常来说,下列选项应当被激活: - `CONFIG_OF`: 启用对DeviceTree的支持; - `CONFIG_IRQ_DOMAIN`: 允许更复杂的IRQ域划分方案,适合多层级中断架构; - `CONFIG_ARM_GIC`: 使用通用中断控制器v1/v2版本,这是大多数ARM平台上常见的选择; - `CONFIG_XILINX_VCU`: 如果涉及到视频编码解码等功能模块则需要勾选此项; - 根据具体情况加载对应外设的标准驱动程序,比如上面提到的UART就会自动引用"xilinx,zynq-xuartps"这样的compatibility标识符去匹配已有的驱动; 此外还有可能是某些高级特性或调试工具相关的配置也要注意开启与否,视乎个人需求而定。 #### 3. **编写用户空间应用程序** 最后一步就是在应用层面上验证所有前期工作成果啦~可以通过poll()函数监视/dev/ttyPS*设备的状态变化,或者直接注册回调函数来捕捉到来自底层的事件通知。当然也可以借助诸如ethtool之类的命令行工具来进行实时监控与诊断分析。 --- 通过以上步骤就可以初步建立起一套完整的从物理层面直到软件接口均畅通无阻地衔接起来的解决方案了!不过需要注意的是每个项目都会存在差异性较大之处,所以建议尽可能参照官方手册及相关资料进行深入学习研究哦~
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值