什麼是鏈接IRQ? chained_irq_enter
和chained_irq_exit
是做什麼的,因爲中斷髮生後,IRQ線被禁用,但chained_irq_enter
正在調用與屏蔽中斷相關的功能。如果該行已被禁用,爲什麼要屏蔽該中斷?linux中鏈接的irq是什麼,什麼時候需要使用?
6
A
回答
2
讀的Linux內核文件本身對於瞭解這些API:
https://www.kernel.org/doc/Documentation/gpio/driver.txt
連鎖式GPIO irqchips:這些通常嵌入在 的SoC類型。這意味着GPIO有一個快速IRQ處理程序,它可以從父IRQ處理程序(最典型的是 系統中斷控制器)中調用 。這意味着GPIO irqchip使用irq_set_chained_handler()或相應的 gpiochip_set_chained_irqchip()輔助函數註冊 ,GPIO irqchip 處理器將立即從父級irqchip調用,而 保持禁用IRQ。然後,GPIO irqchip將最終調用 這樣的順序在中斷服務程序:
static irqreturn_t tc3589x_gpio_irq(int irq, void *data) chained_irq_enter(...); generic_handle_irq(...); chained_irq_exit(...);
7
什麼是鏈接IRQ?
有兩種方法可以在父級(中斷控制器)設備的IRQ處理程序中爲子設備調用中斷處理程序。
鏈式中斷:
- 「鏈接」是指那些中斷只是的函數調用鏈(例如,的SoC GPIO模塊中斷處理程序被從GIC叫中斷處理程序,只是作爲一個功能調用)
generic_handle_irq()
用於中斷鏈接- 孩子IRQ處理程序被稱爲父HW IRQ處理程序的內部
- 你不能打電話可以在鏈接(孩子)睡眠功能的中斷處理程序,因爲他們仍然在原子上下文(HW中斷)
- 這種方法在驅動程序通常用於系統芯片內部GPIO模塊
嵌套中斷
- 「嵌套」表示這些中斷可以被另一箇中斷中斷;但他們是不是真的HW的IRQ,而是螺紋的IRQ
handle_nested_irq()
用於創建嵌套中斷- 孩子IRQ處理程序被稱爲新線程通過
handle_nested_irq()
函數創建的內部;我們需要他們在進程上下文下運行,這樣我們就可以稱之爲睡眠總線功能(如可睡I2C功能) - 你可以調用,睡眠嵌套(子)的內部功能中斷處理程序
- 這種方法在外部的芯片,如GPIO擴展驅動程序通常使用的,因爲它們通常通過I2C總線連接到系統芯片,和I2C功能可以休眠上面所討論的驅動器的
說到:
irq-gic
驅動程序使用CHAINED GPIO irqchips
方法處理具有多個GIC的系統; this承諾增加功能gpio-omap
驅動程序(上面提到)使用GENERIC CHAINED GPIO irqchips
方法。請參閱this提交。這是從使用普通CHAINED GPIO irqchips
,這樣的實時內核,將螺紋IRQ處理轉換,但在非RT內核將難以IRQ處理- 「GPIO-max732x」驅動程序使用
NESTED THREADED GPIO irqchips
方法
什麼
chained_irq_enter
和chained_irq_exit
做
這些功能實現硬件中斷的流量控制,即通知中斷控制器芯片時,掩蓋和揭露當前中斷。
對於FastEOI中斷控制器(最現代的方式):
chained_irq_enter()
無能爲力chained_irq_exit()
電話irq_eoi()
回調告訴中斷控制器,中斷處理結束
對於具有掩碼/取消屏蔽/確認功能的中斷控制器
個chained_irq_enter()
口罩電流中斷,並承認它,如果ACK回調設置以及chained_irq_exit()
未屏蔽的中斷
的中斷arised因爲後IRQ線被禁止,但是
chained_irq_enter
正在調用與屏蔽中斷相關的函數,如果該行已被禁用,爲什麼要屏蔽該中斷?
IRQ線路被禁用。但是我們仍然需要在中斷處理結束時寫入EOI寄存器。或者發送ACK用於邊沿級中斷。
This解釋了爲什麼中斷在中斷處理程序中被禁用。
相關問題
- 1. 什麼時候使用GWT,什麼時候不需要
- 2. Application.DoEvents,什麼時候需要,什麼時候不需要?
- 3. 什麼時候需要CAMLparamX?
- 4. 什麼時候需要pygame.init()?
- 5. 什麼時候需要NSCopying?
- 6. 什麼時候需要NS_RETURNS_RETAINED?
- 7. 什麼時候需要「javascript:...」?
- 8. 什麼時候需要TransactionScopeOption.Supress?
- 9. 什麼時候需要dynamic_cast?
- 10. 什麼時候需要curl_global_init()?
- 11. 我什麼時候需要使用@WebServiceRef?
- 12. 什麼時候需要使用ng-template?
- 13. 我什麼時候需要使用MPI_Barrier()?
- 14. 我什麼時候需要使用「android:id」?
- 15. 什麼是Scala中的清單,什麼時候需要它?
- 16. 我什麼時候需要InamingContainer接口?
- 17. 爲什麼和什麼時候需要使用php中的套接字
- 18. 什麼時候js中的「var」需要?
- 19. 我什麼時候需要分配財產,什麼時候不需要?
- 20. 我什麼時候需要使用Bigarray,爲什麼?
- 21. MSBuild:它是什麼,我什麼時候需要它?
- 22. 什麼是服務總線,我什麼時候需要一個?
- 23. 什麼是http標題,什麼時候需要指定它們
- 24. 什麼時候需要檢查鏈接列表循環?
- 25. 我什麼時候需要調用XInitThreads?
- 26. 什麼時候需要引用document.getElementByID?
- 27. 什麼時候在C++中需要'int'?
- 28. 爲什麼或什麼時候應用需要服務器?
- 29. addEvents的要點/效用是什麼?它什麼時候有用?
- 30. 什麼時候在Scala中需要@uncheckedVariance,爲什麼它在GenericTraversableTemplate中使用?
它是[this]的延續(http://stackoverflow.com/questions/34371352/what-are-linux-irq-domains-why-are-they-needed)的問題。 –
下一部分是[here](http://stackoverflow.com/questions/34391340/when-we-use-irq-set-chained-handler-the-irq-line-will-be-disabled-or-not/ 34426034#34426034)。 –