三種中斷
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驅動基礎…