歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> linux中斷原理

linux中斷原理

日期:2017/3/3 12:45:54   编辑:Linux技術

中斷原理

ISR中斷服務程序

中斷配置的過程

配置gpio寄存器(略)

配置好gpio後,需要根據與觸發gpio寄存器相對應的EXT_INT_?_CON,將其配置為相應的觸發方式(上升觸發等),

清除中斷掛起標志,禁止中斷屏蔽位

清除中斷向量地址寄存器的數據,將中斷服務函數的入口地址放入中斷向量地址寄存器(復數)中

中斷執行的過程

當一個中斷觸發時,cpu會讀取向量地址寄存器,從中讀出中斷服務程序入口地址,

拿到中斷服務程序入口地址後,cpu就會去執行中斷服務函數,而這個中斷服務函數的入口地址就存放在向量地址寄存器(復數)中。

(也就是說,中斷一旦發生,存放於中斷向量地址寄存器(復數)中的中斷服務函數的入口地址就會被放在中斷向量寄存器中)

*** 問題出來了,中斷向量地址寄存器(復數)約有130個,基本與gpio寄存器數量相對應,那麼二者是如何對應的呢?(GPH2_3對應v0_16)

內核中的中斷其實都是假中斷,僅僅是利用真正的中斷去調用一個函數,然後立即結束中斷而已,當假中斷到來時,

內核中的進程調度被終止直到中斷函數返回固定的返回宏,因此,當中斷裡出現問題時,內核會打印出大量的堆棧

信息,而不是直接crash

也就是說,內核會做這麼一件事:

當我們在內核中注冊一個中斷時,內核會利用真實的中斷去執行當前已經注冊的中斷選擇,找出需要調用的中斷服務函數(假),

因此,一個引腳可以注冊多個中斷服務函數(假)

若我們在內核環境下,或裸機環境下,不使用內核提供的中斷注冊流程,而是自己實現一個中斷,那才是真正意義上的中斷

s5pv210中除了GPH族寄存器以外,還有能夠配置成中斷的引腳嗎?

內核中斷實際流程:

注冊一個真實中斷,給其一個中斷服務函數入口(真),然後當中斷觸發時,調用這個中斷服務函數(真),在此函數內部,會開啟一個內核線程,

然後讓線程的入口函數為我們實際注冊的中斷入口函數,並且啟動它,然後真中斷結束,返回。而我們想要實現的中斷實際運行在一個

暫停了所有進程調度的進程上下文中(笑),當線程函數結束後(其實就是我們的中斷服務函數(假)),進程調度就會再次開始。

這樣,有一個中斷標志位的問題也可以解釋清楚了

其他gpio的中斷配置

見GPA0_INT

*** 中斷源與引腳的對應關系

當使用EINT16-31號中斷時,中斷向量地址寄存器(復數)都使用0-16號寄存器,也就是說,gph族寄存器的中斷基本都只對應中斷向量地址寄存器(復數)0-16

那麼,比如,當gph2-3被觸發時,本應該調用EINT19中斷,但cpu將中斷向量地址寄存器(復數)0-16中中斷服務函數地址搬運到中斷向量地址寄存器中,

類似的,gph2-4,5,6等gpio引腳都是使用中斷向量地址寄存器(復數)0-16寄存器,而前面的中斷號則各自對應自己的中斷向量地址寄存器(復數)

具體中斷源對應關系 見芯片手冊此關鍵字VECTORED INTERRUPT CONTROLLER

舉例子,當使用一號定時器觸發中斷時,需要調用中斷向量地址寄存器(復數)22中存放的中斷服務函數地址。

其他gpio寄存器的中斷則均使用GPIOINT,也就是第0組中斷向量地址寄存器(復數)的30號

Copyright © Linux教程網 All Rights Reserved