中斷狀態(tài)機
對于 GIC-V2 而言,中斷的狀態(tài)機由 Distributor 維護,每個中斷都有一個狀態(tài)機。
Pending:中斷到達 GIC ,等待 CPU 的處理。
Active:中斷得到 CPU 的應答,中斷被CPU處理。
Active and pending :某個中斷正在被 CPU 處理,這時候該中斷又來了。
來看一個例子:
(a)N 和 M 用來標識兩個外設(shè)中斷,N 的優(yōu)先級大于 M
(b)兩個中斷都是 SPI 類型,level trigger,active-high
(c)兩個中斷被配置為去同一個 CPU
(d)都被配置成 group 0,通過 FIQ 觸發(fā)中斷
Linux 搶占機制
GIC中斷控制器支持中斷優(yōu)先級搶占,一個高優(yōu)先級中斷可以搶占一個低優(yōu)先級且處于active狀態(tài)的中斷,即GIC仲裁單元會記錄和比較當前優(yōu)先級最高的pending狀態(tài),然后去搶占當前中斷,并且發(fā)送這個最高優(yōu)先級的中斷請求給CPU。
從GIC角度看,GIC會發(fā)送高優(yōu)先級中斷請求給CPU。但是CPU不一定響應?。?!因為在中斷處理過程中,CPU處于關(guān)中斷狀態(tài)(關(guān)閉本CPU),需要等低優(yōu)先級中斷處理完畢,直到發(fā)送EOI 給GIC,然后CPU才會響應pending狀態(tài)中優(yōu)先級最高的中斷進行處理。所以 Linux 下:
1、高優(yōu)先級中斷無法搶占正在執(zhí)行的低優(yōu)先級中斷。
2、同處于 pending 狀態(tài)的中斷,優(yōu)先響應高優(yōu)先級中斷進行處理。
3、同優(yōu)先級同是 pending 狀態(tài)的中斷,選擇硬件中斷號 ID 最小的一個發(fā)給CPU。
這樣是可以理解的,如果萬一中斷大量爆發(fā),中斷如果允許嵌套的話,棧會越來越大,會爆掉,所以為了防止這種情況發(fā)生,Linux中中斷不允許嵌套,單CPU中,在一個中斷處理完之前,不會相應另外一個中斷,哪怕優(yōu)先級比它高。
FreeRTOS 中是允許高優(yōu)先級中斷搶占正在執(zhí)行的低優(yōu)先級中斷,不同系統(tǒng)設(shè)定不一樣。
中斷與進程
進程調(diào)度是一個復雜的機制, 根據(jù)需求的不同,在不同時刻會切換調(diào)度機制,CPU會根據(jù)進程優(yōu)先級、時間片等信息,對不同進程進行調(diào)度。
中斷可以打斷進程的運行,任意一個中斷的優(yōu)先級都比所有的進程高。
在中斷處理過程中,主要是 GIC 和 CPU 的交互,即便 GIC 支持高優(yōu)先級中斷搶占正在執(zhí)行的低優(yōu)先級中斷,發(fā)信號給 CPU core,但是CPU core 可以不處理,因為 Linux 中當 CPU core 執(zhí)行中斷處理時,是關(guān)中斷和關(guān)搶占的狀態(tài),不再相應中斷信號。
也就意味著,在中斷優(yōu)先級這個概念中,只有當 GIC 同時存在多個 pending的中斷,這時候會選擇優(yōu)先級最高的去執(zhí)行,高優(yōu)先級會搶占低優(yōu)先級中斷(哪怕低優(yōu)先級先來)。如果低優(yōu)先級中斷處于 active
狀態(tài),是不可以被搶占的,這是前后關(guān)系。搶占只存在于同時是pending 狀態(tài)的時候。
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209322 -
狀態(tài)機
+關(guān)注
關(guān)注
2文章
492瀏覽量
27528 -
進程
+關(guān)注
關(guān)注
0文章
203瀏覽量
13960
發(fā)布評論請先 登錄
相關(guān)推薦
評論