三种中断
1. Legacy
- 定义:Legacy 中断是传统的中断处理方式,使用物理中断线(例如 IRQ)来传递中断信号。
- 缺点:
- 中断线数量有限,通常为 16 条,限制了可连接设备的数量。
- 中断处理可能会导致中断风暴,影响系统性能。
- 不支持多处理器系统中的负载均衡。
- 使用场景:主要用于旧设备和不支持 MSI 或 MSI-X 的硬件。
INTA, INTB, INTC, or INTD 区别
- 优先级顺序:从高到低一般是 INTA > INTB > INTC/INTD。不过,具体的优先级也可以在系统 BIOS(Basic Input - Output System)或操作系统的设备管理部分根据设备的实际重要性和使用场景进行调整。
- 应用场景倾向:INTA 倾向于用于对实时性和性能要求高的关键设备,INTB 用于实时性要求稍低的设备,而 INTC 和 INTD 更多地用于对中断响应要求不高、数据更新频率较低或不太关键的设备。这种区分有助于在复杂的 PCI 系统中合理分配中断资源,以满足不同设备的需求
2. MSI(Message Signaled Interrupts)
- 定义:MSI 是一种通过消息而不是传统的中断线来发送中断信号的机制。
- 优点:
- 减少了中断线的数量,支持更高的设备数量。
- 提高了中断的处理效率,减少了中断风暴的可能性。
- 可以支持多处理器系统中的负载均衡。
- 最多32个
- 使用场景:常用于现代设备,尤其是 PCI 和 PCIe 设备。
- 默认情况下,MSI 功能是启用的,且启用了 1 个向量。可以选择最多 32 个向量。通常情况下,Linux 只使用 1 个向量用于 MSI。这是在IP中断配置页面,使能并选择msi中断的重点
3. MSI-X
- 定义:MSI-X 是 MSI 的扩展版本,提供了更大的灵活性和更高的中断数量。
- 优点:
- 支持更多的中断向量(最多可达 2048 个),适合需要高并发中断的设备。
- 提供更好的性能和可扩展性,尤其是在高性能网络和存储设备中。
- 使用场景:主要用于高性能设备,如网络适配器和存储控制器。
总结
- MSI 和 MSI-X 提供了更高效和灵活的中断处理机制,适合现代设备和高性能应用。
- Legacy 中断则是传统的方式,适用于老旧设备,但在性能和扩展性上存在限制。
中断使用
- XDMA的中断类型,以及控制时序:
1)、Legacy Interrupts:
对于Legacy Interrupts中断,当user_irq_ack 第一次为1的时候usr_irq_req可以清0,当user_irq_ack 第二次为1的时候,可以重新设置usr_irq_req发起中断。
在PCI总线里面INTx中断是由四条可选的中断线决定的,这种中断方式是共享式的,所有的pci设备把中断信号在一条中短线上相与,再上报给cpu,cpu收到中断以后再查询具体是哪个设备产生了中断。
在PCIE总线里面已经没有了实体的INTx物理中断线了,PCIE标准使用专门的Message事务包来实现INTx中断,这是为了兼容以前的PCI软件。_INTx__是共享式_的,cpu相应中断后还需要查询具体中断源,效率比较低
解释一下这个图什么意思:
- 首先是usr_irq_req[15:0] = 16’h3 = 0000 0000 0000 0011 中断0和1发出了中断请求
- 然后是usr_irq_ack[15:0] = 16’h1 = 0000 0000 0000 0001 响应中断0
- 然后是usr_irq_ack[15:0] = 16’h2 = 0000 0000 0000 0010 响应中断1
- 中间的波浪线是省略的意思,也就是说在中断响应前和后,中断请求都需要保持一段时间,这个时间多少我没测试过,有大佬知道的可以留言
2)、MSI Interrupts:
MSI 发出usr_irq_req 中断请求后,user_irq_ack 为1只是说明中断已经被主机接收了,但是不代表已经处理,软件或者驱动层可以去清零usr_irq_req。
MSI中断和MSI-X都是往配置的CPU中断寄存器里进行memory写操作,来产生中断,效率比INTx是共享式高,其中MSI最多支持32个中断向量,而MSI-X最多支持2048个中断向量。
3)、MSI-X Interrupts:
当usr_irq_req 中断请求后,只要user_irq_ack为1 就可以清零usr_irq_req,但是没说明说明时候可以置1,重启下次中断。
经过以上所有中断方式测试发现,MSI-X中断,会导致系统非常慢,估计是底层频繁中断导致,软件非常卡反而影响了传输效率,Legacy和MSI 对于usr_irq_req的清除,对于大数据量的传输,比如一幅图像的传图,只要确保usr_irq_req足够长的时间,中断就能被响应。 保守的做法:当软件收到中断后,通过AXI-LITE接口清除usr_irq_req。 usr_irq_req清除后可以重新置位响应中断。
Note
在XDMA IP 配置期间,主机可从指定的支持中断列表中启用一种或多种中断类型。即使启用了多个中断类型,IP 在给定时间内也只会产生一个中断类型。MSI-X 中断优先于 MSI 中断,MSI 中断优先于传统中断。主机软件不得在断言或等待中断发生时切换(启用或禁用)中断类型。
在驱动中的引用
- 后面介绍到驱动的时候说吧,这里就提一句,xdma驱动在读取中断事件的时候是挂起的状态,也就说在没读取到中断事件前不会往下执行其他程序,起到了阻塞的作用,如果你知道linux 驱动那么这个应该会很清楚,如果刚开始的和我一样没学过linux驱动的话就记住这个,我还特意去学了linux驱动基础…