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版英文電子圖書。...