第乙個驅動之字元裝置驅動(四)按鍵中斷

2021-09-07 18:04:07 字數 2591 閱讀 1185

cpu發生中斷,跳到異常向量入口執行動作

1.此時需要儲存被中斷的現場

2.執行中斷處理函式

3.恢復被中斷的現場

寫程式時:先設定異常入口

異常向量入口:

0位址和0xffff0000兩個入口,

嵌入式 arm linux中的選擇後者為入口

vim .config檔案檢視中斷向量表的起始位址

架構的

cpu

的異常向量基址可以是

0x0000 0000,

也可以是

0xffff0000

, linux

核心使用後者,只需要在某個暫存器裡設定下,就可以將異常基址定位到這裡來。這個位址並不

代表實際的記憶體,是虛擬位址。當建立了虛擬位址與實體地址間的對映後,得將那些異常向

量,即相當於把那些跳轉指令(如

:handleswi

等)複製拷貝到這個

0xffff0000

這個位址處去。

(「那些跳轉指令」是指

head.s

中那些跳轉)。

這個過程是在

trap_init

這個函式裡做。

微控制器下的中斷處理

1.分辨是哪乙個中斷

2.呼叫處理函式

3.清中斷

linux核心中

所有中斷處理通過asm_do_irq()函式實現

核心中處理異常的流程,最後呼叫到「

在發生對應於第

1 個引數

irq

的中斷時,則呼叫第

2 個引數

handler

指定的中斷服務函式(

也就是把

handler()

中斷服務函式註冊到核心中 )。

irq:

中斷號。

handler

:處理函式。

irqflags:

上公升沿觸發,下降沿觸發,邊沿觸發等。指定了快速中斷或中斷共享等中斷處理屬性

.*devname

:中斷名字。通常是裝置驅動程式的名稱。改值用在

/proc/interrupt

系統 (虛擬)

檔案上,或核心發生中斷錯誤時使用。

第 5

個引數

dev_id

可作為共享中斷時的中斷區別引數,也可以用來指定中斷服務函式需

返回值:

函式執行正常時返回

0 ,否則返回對應錯誤的負值。

其實在沒有自己分析過原始碼的時候,只靠韋老師講解的那麼一點是遠遠不夠的,但是現在還是先當api和庫函式的方式來使用吧,先用起來,之後需要分析原始碼。

實驗現象:

在載入驅動之前,我們檢視系統的中斷註冊情況:

此時沒有發現s2-5的中斷,現在載入驅動之後再檢視:

現在我們使用指令(exec 5< dev/buttons)開啟裝置,之後使用測試程式開啟:

使用下面的命令登出中斷:

編譯執行應用程式:

應用程式執行之後,按鍵分別對應不同的鍵值,就達到了效果,此時top命令檢視占用cpu情況:

先使程式在後台執行:在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上&即可,實際上,這樣是將命令放入到乙個作業佇列中了

top檢視:

之前輪詢方式占用cpu幾乎是百分之百,現在幾乎不占用cpu,可見中斷方式讓系統資源能夠更加合理地利用。

第乙個驅動之字元裝置驅動(二)mdev

mdev是busybox提供的乙個工具,用在嵌入式系統中,相當於簡化版的udev,作用是在系統啟動和熱插拔或動態載入驅動程式時,自動建立裝置節點。檔案系統中的 dev目錄下的裝置節點都是由mdev建立的。在載入驅動過程中,根據驅動程式,在 dev下自動建立裝置節點。前面的部落格實現了第乙個版本,但是...

第乙個驅動之字元裝置驅動(二)mdev

mdev是busybox提供的乙個工具,用在嵌入式系統中,相當於簡化版的udev,作用是在系統啟動和熱插拔或動態載入驅動程式時,自動建立裝置節點。檔案系統中的 dev目錄下的裝置節點都是由mdev建立的。在載入驅動過程中,根據驅動程式,在 dev下自動建立裝置節點。前面的部落格實現了第乙個版本,但是...

第乙個核心驅動

測試驅動開發平台 為了後續學習的順利進行,我們利用最簡單的hello,world程式,在核心上掛載和解除安裝我們自己編寫的hello模組。說明 本文除錯環境vmware workstation 5.0 turbolinux 10,教材是 linux device drivers 第3版英文電子圖書。...