嵌入式linux中斷淺解

2021-08-22 10:11:59 字數 987 閱讀 4427

本文簡單理一下嵌入式linux對於arm系列soc的中斷管理。

我將嵌入式linux的中斷分為了3個級別,分別是:

1. cpu級:

嵌入式linux只使用了arm的irq中斷,當發生乙個irq時,cpu會自動執行0x00000018(低端向量模式)或0xffff0018(高階向量模式)處的指令,此處一般放置了一條跳轉指令b  addr1,linux對異常向量表的填充是在初始化階段完成的,呼叫early_trap_init()函式。

2.linux核心級:

當cpu跳轉到addr1處後,此處的指令屬於linux核心,它會去讀取cpu中斷暫存器的中斷號,然後執行一些其他的指令,最後跳轉到用request_irq()註冊的函式。

3.linux使用者級:

使用者級就是request_irq()註冊的函式,它是驅動開發者自己寫的函式,在這個函式裡面,可以執行任何想要的操作,比如最簡單的是呼叫printk()列印一段文字到終端。

補充:對於裸機程式,在用到cpu的中斷資源時,可以直接:b  eventirq,然後在eventirq裡面執行需要的操作,圖1簡單描述了中斷在硬體上的過程:

圖1:arm中斷的硬體過程

irq進入到irq源暫存器,經過優先順序判斷,進入irqpend暫存器,只要irqpend裡面有中斷,就會不斷向cpu發出中斷訊號,cpu在處理中斷時,不會理會這些請求,但是,若cpu已經處理完當前的中斷,就會接受這些請求,再次中斷,所以,每當處理完乙個中斷時,都應該立即清除irqpnd的中斷位和srcpnd的中斷位,順序是先清srcpnd,再清irqpnd。

總結:linux核心對arm中斷的管理,其實就是在arm的基本中斷原理上,新增了抽象,使得中斷成為了linux所管理的一種系統級資源,驅動開發人員無需關注arm本身的中斷細節,只需要關心在中斷時應該做什麼事情,像多執行緒程式設計一樣,呼叫request_irq()去註冊乙個執行流就可以了。

嵌入式中斷

interrupt double compute area double radius 這個函式有太多的錯誤了,以至讓人不知從何說起了 1 isr 不能返回乙個值。如果你不懂這個,那麼你不會被雇用的。2 isr 不能傳遞引數。如果你沒有看到這一點,你被雇用的機會等同第一項。3 在許多的處理器 編譯器...

嵌入式Linux學習記錄之中斷

記錄一下2020未來的廣交大的linux學習過程 簡化筆記 中斷向量偏移 一般arm從0x0000 0000 位址開始執行,對於stm32設定連線首為0x8000 000。如果 一定要從0x8000 000開始執行,需要告訴soc核心。也就是設定中斷向量偏移。設定scb的vtor暫存器為新的中斷向量...

嵌入式linux核心中斷的理解

一,嵌入式linux核心中斷的理解 1,計算機為什麼有中斷機制?由於外設的處理速度遠遠慢於cpu的處理速度 為了保證cpu和外設的資料通訊正確,一般呢首先可能考慮使用輪詢機制 輪詢就是死等 如果輪詢的時間過程長,會大大降低cpu的利用率 cpu不能幹其他的事情,只能等待當前這個硬體 此時還可以考慮使...