---
# System prepended metadata

title: Linux interrupt
tags: [Linux 探討]

---

# 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)