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

詳解Linux內(nèi)核搶占實(shí)現(xiàn)機(jī)制
狀態(tài)機(jī)舉例
狀態(tài)機(jī)代碼生成工具
基于有限狀態(tài)機(jī)的Linux多點(diǎn)觸摸屏驅(qū)動(dòng)設(shè)計(jì)劉斌
FPGA:狀態(tài)機(jī)簡述

什么是狀態(tài)機(jī)?狀態(tài)機(jī)5要素

狀態(tài)模式(狀態(tài)機(jī))

51中斷系統(tǒng)與vhdl狀態(tài)機(jī)

評(píng)論