Zephys OS nano 核心篇 isr 服務

2021-07-23 11:10:30 字數 1642 閱讀 1165

zephyr os 所有的學習筆記已託管到 github,csdn 部落格裡的內容只是 github 裡內容的拷貝,因此鏈結會有錯誤,請諒解。

最新的學習筆記請移步 github:

isr 的全稱是 interrupt service routine, 即中斷服務例程,它主要用於響應硬體(或軟體)中斷。當乙個中斷到來時,isr 會搶占正在執行的 fiber 或者 task。當 isr 執行完畢後,之前被搶占的 task 或者 fiber 將恢復執行。

請注意上一節所說的「fiber是不可搶占」這一概念,它指的是高優先順序的 fiber 不可搶占低優先順序的 fiber。

中斷向量表 idt 用於在中斷源和中斷服務例程之間建立關聯。當發生乙個中斷時,硬體會自動根據中斷號查詢 idt 中對應的表項,找到中斷服務程式的入口位址,然後跳轉到對應的 isr 去執行。

多個中斷源可以利用同乙個函式處理中斷,即乙個函式可以服務於產生多種型別中斷的乙個裝置,或產生同種型別中斷的多個裝置。傳遞給 isr 的引數可以用於區分是哪乙個中斷源產生的中斷。

zephyr 核心為所有未使用的 idt 入口提供了乙個預設的 isr。如果捕捉到了乙個不期望產生的中斷,該 isr 將主動產生乙個系統致命錯誤。

核心支援中斷巢狀,即當乙個 isr 正在執行時,可以被更高優先順序的中斷所搶占。當高優先順序的 isr 執行完畢後,將恢復執行低優先順序的 isr。

核心允許 task 或 fiber 臨時鎖定 isr。中斷的鎖定和解鎖是一對相反的過程。鎖定 isr 的過程也可以是巢狀的,即鎖定操作可以多次重複執行,但是之後必須解鎖相同的次數,核心才會再次響應中斷。

isr 程式應當盡量保持短小,以確保系統的行為是可預料的。如果需要處理乙個比較耗時的工作,isr 程式可以將其移交給 fiber 或 task,然後盡快恢復正常執行,以響應其它中斷。

如果 isr 將工作移交給 fiber,那麼在 isr 退出時會進行上下文切換。因此,中斷相關的處理通常幾乎得以立即執行(但在執行該 fiber 前還需執行中斷前被打斷的 fiber 以及高優先順序的 fiber)。

如果 isr 將工作移交給 task,那麼在 isr 退出時會進行上下文切換,但是會先切換到 microkernel 的服務 fiber(且在執行該 fiber 前還需執行中斷前被打斷的 fiber 以及高優先順序的 task),再切換到該 task。

ps:這裡的理解可能還有問題,今後再補充或修正。

#define my_dev_irq  24       /* 裝置使用的 irq 是 24 */

#define my_dev_prio 2 /* 中斷的優先順序是 2 */

/* 傳遞給 my_isr() 的引數,在本例中是乙個指向裝置的指標 */

#define my_isr_arg device_get(my_device)

#define my_irq_flags 0 /* irq 的標誌,在非 x86 的架構中是沒用的 */

void my_isr(void *arg)

void my_isr_installer(void)

Zephys OS nano 核心篇 前言

zephyr os 所有的學習筆記已託管到 github,csdn 部落格裡的內容只是 github 裡內容的拷貝,因此鏈結會有錯誤,請諒解。最新的學習筆記請移步 github 要想深入學習zephyr,核心是一道繞不開的坎,因為無論是系統的哪一部分,驅動 網路 藍芽 應用,都會使用核心提供的各種服...

Zephyr OS 核心篇 核心鍊錶

zephyr os 所有的學習筆記已託管到 github,csdn 部落格裡的內容只是 github 裡內容的拷貝,因此鏈結會有錯誤,請諒解。最新的學習筆記請移步 github 本文先簡單地介紹了一些內聯函式的知識,然後再詳細分析 zephyr os 核心中的鍊錶的原始碼。在 zephyr os 中...

面試 核心篇 框架

spring spring bean的生命週期 spring ioc如何實現 說說 spring aop spring aop實現原理 動態 cglib與 jdk spring事務實現方式 spring事務底層原理 如何自定義註解實現功能 spring mvc執行流程 spring mvc啟動流程 ...