1. 程式人生 > >軟體和硬體都是對生活的高度抽象---論中斷控制

軟體和硬體都是對生活的高度抽象---論中斷控制

不同的晶片體系設計在積體電路系統設計階段其實都遵循大體一致的設計思想,晶片設計發展那麼多年,真正為人所熟知的就是X86架構和ARM架構,當然還有日漸沒落的MIPS,其他都是一些簡單的控制器晶片體系。而硬體模組設計又是高度抽象於現實需求,很多時候,X86ARMMIPS只有底層暫存器和指令級別的差異,對於軟體驅動基本是一致的。本文論及ARM體系的中斷控制,以基於Cortex-A8S5PV210為例。中斷是一種非同步工作機制,也是嵌入式處理器的一個核心工作機制,對於實時作業系統來說必不可少。

1、現實生活的同步與非同步

以現實生活的一個例子來說明兩者的差異。小吳是一個工作很有計劃的人,週一早上就將該周的工作計劃做好,包括每天做什麼。同步就是小吳會按著這份工作計劃一個一個地按順序完成。某日,領導突然給他安排一個緊急的任務。這時,小吳就得先去完成領導交辦的緊急任務,再接著按計劃完成自己的工作。這個就是非同步。而非同步會涉及到以下問題:

1. 

緊急任務來源,姑且預設領導A安排的任務稱為TA,領導B安排的任務稱為TB,領導C安排的任務稱為TC

2. 

3. 

緊急任務優先順序,如果TATB是同時安排的,怎麼確定先做哪個。明顯,如果領導AB的頭銜大,那肯定要先做TA

4. 

5. 

緊急任務過濾。如果領導A是小吳的直屬領導,B是跟領導A同一個等級,但非直屬領導,而且A曾跟小吳說過,不要接其他領導的活幹。那小吳就不用做TB了。

6. 

7. 

緊急任務執行場所。很多時候緊急任務也是公司的一種常規任務,只不過是領導才能發起這種常規任務,而這種任務已經由領導和小吳已經約定好了從哪裡開始執行。由於領導之前已經預設過該任務的執行場所,而且按公司的章程,該任務也有一套執行的流程。那領導安排小吳去執行這種任務時只是發出一個訊號就可以了,不需要再詳細跟小吳說到哪裡開始做,怎麼做等等。

8. 

9. 

緊急任務狀態列表,代表當前都有誰發出了緊急的訊號。前四者都是平時已經確定好的,而這個代表當前的狀態,標識某個緊急任務已經被領導明確安排在日程中了。

10. 

11. 

小吳通過緊急任務狀態列表,找到當前最高優先順序的任務,就屁顛屁顛地去到該任務對應的執行場所去做事了。

12. 

2、軟體抽象的非同步

訊號是程序間通訊的非同步機制,是一種軟體中斷機制,我們來看看軟體層面如何抽象非同步思想。以linux Posix.1為準:

1)訊號型別

SIGHUP 1 終端掛起或者控制程序終止SIGINT 2 鍵盤中斷(如break鍵被按下)SIGQUIT 3 鍵盤的退出鍵被按下SIGILL 4 非法指令

SIGABRT 6 abort(3)發出的退出指令SIGFPE 8 浮點異常.....

2)訊號優先順序

· 

多個訊號掛起時,訊號處理策略如下: {SIGILL(4),SIGTRAP(5),SIGBUS(7),SIGFPE(8),SIGSEGV(11),SIGSYS(31)}等硬體異常訊號作為第一等級;

· 

· 

非實時訊號中其他訊號是第二等級;

· 

· 

實時訊號是第三等級。

· 

先處理第一優先順序的訊號,再處理第二、第三等級訊號。同一個等級的訊號,從訊號型別值小的開始處理。

3)訊號過濾

sigmask(SIGNO)可以遮蔽某個訊號

4)訊號處理點

由於訊號是linux作業系統提供的一種機制,訊號的處理時機是在核心態即將要返回使用者態的時候去檢查該程序的訊號列表並處理。sigaction()函式用於將處理流程註冊到核心的訊號處理陣列中。

5)程序的當前訊號狀態

即程序的訊號表,某個bit為1,即代表該程序收到對應的訊號。處理完把該bit清0.

6)訊號處理

當程序收到訊號時, 從核心態即將要返回使用者態的時候就會處理該訊號。

3、硬體抽象的非同步

中斷是晶片設計對非同步的抽象。基本所有的晶片架構(無論是微控制器控制器還是高階處理器)都有如下暫存器:

1. 

中斷源。中斷源並不是暫存器,而是像訊號一樣是約定俗成的,以下的暫存器都會按照這種順序進行對應。

2. 

3. 

優先順序暫存器(priority)。優先順序高的中斷會先響應。

4. 

5. 

中斷遮蔽暫存器(mask),或者稱為選通暫存器(enable)。晶片的上電狀態往往是遮蔽所有中斷源。除了對某個中斷源進行遮蔽外,一般都會有一個全域性中斷開關。

6. 

7. 

中斷向量地址( VectorAddress),中斷髮生後,PC會從該地址開始執行。中斷服務程式的第一條指令應該設定在該處,並跳轉到中斷服務子程式。

8. 

9. 

中斷狀態暫存器(pending),中斷髮生後,對應bit會置1。中斷執行後應該軟體對其清0.

10. 

4、S5PV210中斷控制

S5PV210是基於ARM Cortex A8核,其支援高達93種類型中斷。其是32位硬體體系,按理將其分成3組即可,但為了易於擴充套件,其安排了四組,即VIC0VIC1VIC2VIC3,每組暫存器都有相應的優先順序暫存器、中斷遮蔽暫存器、中斷向量地址、中斷狀態暫存器。其中每個bit即代表一種中斷源。以支援外部中斷和TIMER中斷的VIC0為例:

1. 

VIC0中斷源

2. 

1. 

VIC0優先順序暫存器:VIC0VECTPRIORITY0VIC0VECTPRIORITY1...VIC0VECTPRIORITY31。每個中斷源可以設定從015,共16鍾優先級別。

2. 

3. 

VIC0遮蔽暫存器:VIC0INTENABLE,某個bit1即表示允許對應的中斷。全域性中斷允許位在CPSRI位元位,I=0即允許全域性一般中斷,F=0,允許全域性快速中斷。

4. 

5. 

VIC0中斷向量地址:VIC0VECTADDR0VIC0VECTADDR1...VIC0VECTADDR31,每個中斷源都有一個對應的中斷向量地址。當某個中斷髮生後,該中斷對應的向量地址暫存器的值會更新到VIC0ADDRESS暫存器。所以中斷髮生後,直接讀VIC0ADDRESS即可直接獲得中斷服務函式地址,而不用管是哪個中斷源發生了中斷。

6. 

7. 

VIC0中斷狀態暫存器:VIC0IRQSTATUS/VIC0FIQSTATUS。由於ARM體系一般支援一般中斷和快速中斷兩種工作模式,所以有每個中斷源都可以設定為一般中斷或者快速中斷。某個bit1即表示發生了對應的中斷。由於有一般中斷和快速中斷之分,所以其由VIC0INTSELECT暫存器進行模式選擇。

8. 

S5PV210由於中斷源很多,採用了二級中斷模式,例如其支援四路UART,每路UART都作為一個一級中斷源接入到中斷控制器,而每路UART的內部又有傳送中斷和接收中斷,如何區分發送和接收中斷,由UART模組的內部電路邏輯來控制區分,如對應有TX傳送pending位和RX接收pending位。

5、S5PV210外部中斷控制

外部中斷即由外部引腳觸發中斷,是一種特殊的中斷控制,在微控制器控制領域應用非常廣泛。一個引腳可以直接以一級中斷接入到中斷控制器,如EINT0;也可以多個引腳經過或電路之後以一級中斷接入到中斷控制器,EINT16,EINT17,...,EINT31或之後以EINT16_31一級中斷接入到中斷控制器。

外部中斷一般會涉及到以下暫存器配置,以EINT16為例:

1. 

GPIO模式選擇。外部引腳一般都是功能複用的(複用是一家積體電路設計公司的核心機密,直接影響成本,複用度越高越省成本)。而該引腳上電狀態一般預設為GPIO功能,如果要作為中斷輸入,需要配置某個暫存器,使其成為中斷輸入模式。如GPH2CON的bit3..0為1111即表示其為中斷輸入。

2. 

3. 

中斷觸發方式,如上升沿還是下降沿,還是高低電平觸發。對應EXT_INT_2_CON暫存器。

4. 

5. 

中斷遮蔽。EINT16,EINT17,...,EINT31作為一個二級控制單元,其同樣有中斷遮蔽某個外部中斷引腳的功能。對應EXT_INT_2_MASK暫存器

6. 

7. 

中斷狀態位,對應EXT_INT_2_PEND暫存器。

8. 

6、S5PV210裸機全域性異常向量地址

中斷是異常的一種。裸機預設0xD0037418為一般中斷的總入口。