# Linux interrupt ###### tags: `Linux 探討` ### Linux 中斷流程 ![](https://i.imgur.com/hwJk0cb.png) 在Linux kernel中,對與每一個設備的IRQ都會使用一種 struct irq_desc 來描述(稱 interrupt descriptor) , 所以會有一個儲存所有描述符的資料結構 interrupt descriptor table。 ![](https://i.imgur.com/F67nY92.png) 當一個中斷發生的時候,其對應interrupt descriptor table上的所有"irqaction"的"handler"都將被依次執行,以判斷是否是自己的設備產生的中斷,這主要靠讀取自己設備的中斷狀態寄存器來完成。因此共享中斷時,即便不是你的設備產生的中斷,你的"handler"也會被調用到。為了避免無謂的消耗,需要一進"handler"就立刻進行判斷,如果不是,就盡快的退出。 # Linux interrupt implement ![](https://i.imgur.com/W2z5aQ5.png) ## Top halves(disable interrupt) top half 是真正接受中斷請求的對象,因此要避免執行過久的情況前面提到是在此是關閉中斷的,還有在 top half 的實作上就是為 bottom half 的排程 (scheduling)因此執行速度會非常快 ## Bottom half (enable interrupt) bottom half 則是實際上負責回應中斷的 Task,主要依照 top half 排程的內容來處理中斷需求,Linux 有三種方式處理Bottom half(Softirq, Tasklet and Workqueue) 參考資料: [linux kernel的中断子系统之(八):softirq](http://www.wowotech.net/irq_subsystem/soft-irq.html) ### **大致了解上述這些 可以比較清楚了解 FreeRTOS中的 ISR 機制** FreeRTOS 沒有規定 event handle要怎麼實作, 但提供了一些interrupt API,在這些API裡, 只有 FromISR 結尾的 function 才可以在 ISR 裡呼叫, 以及以 FROM_ISR 結尾的 macro 可以在ISR裡使用 [FreeRtos中使用Semaphore 處理中斷的例子 ](https://hackmd.io/@stanley7342/freertos_note#Queue) [FreeRTOS-STM32-HAL-Examples ](https://github.com/kowalski100/FreeRTOS-STM32-HAL-Examples)