中斷原理
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號