Hi ALL!
最近在定位一個(gè)關(guān)于中斷的問題,以前看待這些問題是割裂的,要不是軟件怎么設(shè)計(jì)中斷,要不是硬件怎么設(shè)計(jì)中斷。
正好乘著這次機(jī)會(huì),站在軟硬件交互的角度將中斷的知識(shí)來梳理一下。
對(duì)了,今天天氣不錯(cuò),周末快樂!
中斷是什么?
中斷是指計(jì)算機(jī)在執(zhí)行期間,系統(tǒng)內(nèi)發(fā)生任何非尋常的或非預(yù)期的急需處理事件,使得CPU暫時(shí)中斷當(dāng)前正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的中斷服務(wù)程序(Interrupt Service Routine, ISR)。這個(gè)事件可以是由硬件設(shè)備觸發(fā)(如硬盤讀寫錯(cuò)誤、打印機(jī)沒有紙等),也可以是由軟件觸發(fā)(如用戶按下Ctrl+C)。
當(dāng)發(fā)生中斷時(shí),CPU會(huì)暫停當(dāng)前正在執(zhí)行的程序,并跳轉(zhuǎn)到相應(yīng)的中斷處理程序(Interrupt Service Routine, ISR)去處理這個(gè)事件。中斷處理程序通常會(huì)保存當(dāng)前任務(wù)的上下文信息(如CPU寄存器的狀態(tài)、內(nèi)存中的數(shù)據(jù)等),然后執(zhí)行相應(yīng)的中斷處理操作(如讀取數(shù)據(jù)、發(fā)送響應(yīng)等)。在中斷處理完畢后,CPU會(huì)恢復(fù)之前保存的上下文信息,并回到被中斷的任務(wù)繼續(xù)執(zhí)行。
中斷是一種異步的事件處理機(jī)制,可以提高系統(tǒng)的并發(fā)處理能力。在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,中斷被廣泛應(yīng)用于處理各種硬件設(shè)備事件和軟件異常情況。
我們知道中斷的發(fā)生與處理是一個(gè)需要軟硬件交互的操作。
?關(guān)中斷:進(jìn)入不可響應(yīng)中斷請(qǐng)求的中斷,由硬件自動(dòng)完成?保存斷點(diǎn):把當(dāng)前的程序計(jì)數(shù)器PC中的內(nèi)容保存起來,用于中斷處理結(jié)束后能繼續(xù)執(zhí)行主程序?識(shí)別中斷源:有多個(gè)中斷源同時(shí)請(qǐng)求時(shí),只能響應(yīng)最高優(yōu)先級(jí)的,因此需進(jìn)一步判斷中斷源?保存現(xiàn)場(chǎng)和屏蔽字:進(jìn)入中斷服務(wù)程序后,要先保存現(xiàn)場(chǎng)?設(shè)置新的屏蔽字:用于改變中斷優(yōu)先級(jí)和控制中斷的產(chǎn)生?開中斷:執(zhí)行中斷程序時(shí),打開中斷可實(shí)現(xiàn)更高優(yōu)先級(jí)的中斷響應(yīng),實(shí)現(xiàn)中斷嵌套?執(zhí)行中斷服務(wù)程序:執(zhí)行中斷服務(wù)程序中的內(nèi)容?再次關(guān)中斷:使得恢復(fù)現(xiàn)場(chǎng)和屏蔽字時(shí)不會(huì)被中斷打斷?恢復(fù)現(xiàn)場(chǎng)和屏蔽字:使現(xiàn)場(chǎng)和屏蔽字恢復(fù)到中斷之前的狀態(tài)?再次開中斷:中斷執(zhí)行完,現(xiàn)場(chǎng)恢復(fù)完后,可以打開中斷?中斷返回:返回原程序繼續(xù)執(zhí)行
處理過程,會(huì)經(jīng)歷兩次的開/關(guān)中斷,也可用下圖描述
在之前我們?cè)谧?a href="http://srfitnesspt.com/soft/data/21-22/" target="_blank">嵌入式的時(shí)候,大多是關(guān)注了軟件層面,如何注冊(cè)中斷,如何設(shè)計(jì)中斷的參數(shù),如何編寫中斷服務(wù)函數(shù),如何將中斷服務(wù)綁定到中斷號(hào)。做linux中斷的話,這些都是定義好的,你可以去調(diào)用接口,當(dāng)然也支持自定義添加新的中斷。
后面這部分可以好好展開學(xué)習(xí)一下,當(dāng)然是在我的內(nèi)存系列結(jié)束后。
但是既然是一個(gè)軟硬件交互的過程,那么這里就拉著硬件和軟件兩位伙伴來看看一個(gè)完整的中斷過程。
前置知識(shí)
在開始描述一個(gè)中斷的軟硬件流程之前,我們需要提前預(yù)備幾個(gè)前置知識(shí)點(diǎn)。
單重中斷與多重中斷
?單重中斷在CPU執(zhí)行中斷服務(wù)程序的過程中不能被打斷。當(dāng)有新的更高優(yōu)先級(jí)的中斷發(fā)生時(shí),正在執(zhí)行的中斷服務(wù)程序會(huì)被暫停,轉(zhuǎn)而執(zhí)行新的中斷服務(wù)程序。?多重中斷在執(zhí)行某個(gè)中斷服務(wù)程序的過程中,CPU可以去響應(yīng)更高的中斷請(qǐng)求。這被稱為中斷嵌套。比如,當(dāng)一個(gè)中斷服務(wù)程序正在執(zhí)行時(shí),發(fā)生了另一個(gè)更高優(yōu)先級(jí)的中斷,CPU會(huì)暫停當(dāng)前的中斷服務(wù)程序,轉(zhuǎn)而執(zhí)行新的中斷服務(wù)程序。一旦新的中斷服務(wù)程序執(zhí)行完畢,CPU會(huì)返回到原來被暫停的中斷服務(wù)程序,繼續(xù)執(zhí)行。
注意:?jiǎn)沃刂袛嗪投嘀刂袛嗟膮^(qū)別在于“開中斷”的設(shè)置時(shí)間不同。對(duì)于單重中斷,開中斷指令設(shè)置在最后“中斷返回”之前,意味著在整個(gè)中斷服務(wù)處理過程中,不能再響應(yīng)其他中斷源的請(qǐng)求。而對(duì)于多重中斷,開中斷指令提前至“保護(hù)現(xiàn)場(chǎng)”之后,意味著在保護(hù)現(xiàn)場(chǎng)之后,若有更高級(jí)別的中斷源提出請(qǐng)求,CPU也可以響應(yīng),從而實(shí)現(xiàn)中斷嵌套,這是二者的主要區(qū)別。
多重中斷與中斷屏蔽技術(shù)
上面我們知道了單重中斷和多重中斷的區(qū)別:
中斷的嵌套不能一直嵌套下去,為了保證正在執(zhí)行的中斷服務(wù)程序的完整性和提高系統(tǒng)的效率和響應(yīng)速度,有時(shí)候我們?cè)趫?zhí)行種的時(shí)候不想新的中斷請(qǐng)求干擾正在執(zhí)行的中斷服務(wù)程序來提高系統(tǒng)的效率和響應(yīng)速度和保證正在執(zhí)行的中斷服務(wù)程序的完整性。
那么這個(gè)時(shí)候就出現(xiàn)了中斷屏蔽技術(shù)。
1、中斷屏蔽技術(shù):主要用于多重中斷
多重中斷:(中斷嵌套)當(dāng)CPU正在執(zhí)行某個(gè)中斷服務(wù)程序時(shí),另一個(gè)中斷源又提出了新的中斷請(qǐng)求,而CPU又響應(yīng)了這個(gè)新的請(qǐng)求,暫時(shí)停止正在運(yùn)行的服務(wù)程序,轉(zhuǎn)去執(zhí)行新的中斷服務(wù)程序,這稱為多重中斷,又稱中斷嵌套。
如果CPU對(duì)新的請(qǐng)求不予響應(yīng),待執(zhí)行完當(dāng)前的服務(wù)程序后再響應(yīng),即為單重中斷。
中斷系統(tǒng)若要具有處理多重中斷的功能,必須具備各項(xiàng)條件。
?1)提前設(shè)置“開中斷”指令:一般情況下,CPU進(jìn)入中斷周期后,由中斷隱指令自動(dòng)將EINT置“0”,即關(guān)中斷。
中斷隱指令指CPU響應(yīng)中斷之后,經(jīng)過某些操作,轉(zhuǎn)去執(zhí)行中斷服務(wù)程序的一種操作。
這就意味著CPU在執(zhí)行中斷服務(wù)程序中禁止響應(yīng)新的中斷請(qǐng)求。CPU若想再次響應(yīng)中斷請(qǐng)求,必須開中斷,
這一任務(wù)通常由中斷服務(wù)程序中的開中斷指令實(shí)現(xiàn)。
多重中斷示意圖如下:
?2)、優(yōu)先級(jí)別高的中斷源有權(quán)中斷優(yōu)先級(jí)別低的中斷源。
在滿足1的前提下,只有優(yōu)先級(jí)別更高的中斷源請(qǐng)求才可以中斷比其級(jí)別低的中斷服務(wù)程序,反之則不然。
為了保證級(jí)別低的中斷源不干擾比其級(jí)別高的中斷源的中斷處理過程,可采用屏蔽技術(shù)。
例如,有A、B、C、D 4個(gè)中斷源,其優(yōu)先級(jí)按A->B->C->D由高向低次序排列。在CPU執(zhí)行主程序期間,同時(shí)出現(xiàn)了B和C的中斷請(qǐng)求,由于B級(jí)別高于C,故首先執(zhí)行B的服務(wù)程序。
當(dāng)B的服務(wù)程序執(zhí)行完返回主程序后,由于C請(qǐng)求未撤銷,故CPU又再去執(zhí)行C的中斷服務(wù)程序。若此時(shí)又出現(xiàn)了D的請(qǐng)求,因?yàn)镈級(jí)別低于C,故CPU不響應(yīng)。當(dāng)C的服務(wù)程序執(zhí)行完返回主程序后再去執(zhí)行D的服務(wù)程序。
若此時(shí)又出現(xiàn)了A請(qǐng)求,因A級(jí)別高于D,故CPU暫停對(duì)D級(jí)中斷服務(wù)程序的執(zhí)行,轉(zhuǎn)去執(zhí)行A級(jí)中斷服務(wù)程序,等A級(jí)服務(wù)程序執(zhí)行完后,再去執(zhí)行D級(jí)中斷服務(wù)程序。上述中斷處理示意圖如下:
2、屏蔽技術(shù)
?1)屏蔽觸發(fā)器和屏蔽字:程序中斷接口電路中,完成觸發(fā)器D,中斷請(qǐng)求觸發(fā)器INTR和屏蔽觸發(fā)器MASK。
在程序中斷接口電路中,有三個(gè)重要的組成部分:完成觸發(fā)器D,中斷請(qǐng)求觸發(fā)器INTR和屏蔽觸發(fā)器MASK。這些組件都扮演著各自的角色,以實(shí)現(xiàn)程序中斷處理的功能。
完成觸發(fā)器D:當(dāng)設(shè)備工作完成時(shí),會(huì)將D置為1,這表示中斷源已經(jīng)準(zhǔn)備好向CPU發(fā)送中斷請(qǐng)求。
中斷請(qǐng)求觸發(fā)器INTR:當(dāng)設(shè)備發(fā)出中斷請(qǐng)求時(shí),INTR會(huì)被置為1。這個(gè)觸發(fā)器是用來向CPU發(fā)送中斷請(qǐng)求的。
屏蔽觸發(fā)器MASK:每個(gè)中斷源都有一個(gè)與之對(duì)應(yīng)的屏蔽觸發(fā)器,如果該中斷源被屏蔽(即MASK=1),那么即使INTR被置為1,CPU也不會(huì)響應(yīng)這個(gè)中斷請(qǐng)求。換句話說,屏蔽觸發(fā)器可以阻止特定的中斷源向CPU發(fā)送中斷請(qǐng)求。
所有的屏蔽觸發(fā)器組合在一起,構(gòu)成了屏蔽寄存器。
?當(dāng)中斷源被屏蔽時(shí)(MASK=1),此時(shí)即使D=1,中斷查詢信號(hào)到來時(shí)刻只能將INTR置“0”,CPU接收不到該中斷源的中斷請(qǐng)求,即它被屏蔽。?若該中斷源未被屏蔽(MASK=0),當(dāng)設(shè)備工作已完成時(shí)(D=1),中斷查詢信號(hào)則將INTR置“1”,表示該中斷源向CPU發(fā)出中斷請(qǐng)求,?該信號(hào)送至排隊(duì)器進(jìn)行優(yōu)先級(jí)判斷。顯然,對(duì)于每個(gè)中斷請(qǐng)求觸發(fā)器就有一個(gè)屏蔽觸發(fā)器,將所有屏蔽觸發(fā)器組合在一起,便構(gòu)成了一個(gè)屏蔽寄存器。屏蔽寄存器的內(nèi)容稱為屏蔽字。屏蔽字與中斷源的優(yōu)先級(jí)是一一對(duì)應(yīng)的。
?2)屏蔽技術(shù)可改變優(yōu)先等級(jí):嚴(yán)格地說,優(yōu)先級(jí)包含響應(yīng)優(yōu)先級(jí)和處理優(yōu)先級(jí)。響應(yīng)優(yōu)先級(jí)是指CPU響應(yīng)各中斷源請(qǐng)求的優(yōu)先次序,這種次序往往是硬件線路已設(shè)置好的,不便于改動(dòng)。處理優(yōu)先級(jí)是指CPU實(shí)際對(duì)各中斷源請(qǐng)求的處理優(yōu)先次序。如果不采用屏蔽技術(shù),響應(yīng)的優(yōu)先次序就是處理的優(yōu)先次序。采用了屏蔽技術(shù)后,可以改變CPU處理各中斷源的優(yōu)先等級(jí),從而改變CPU執(zhí)行程序的軌跡。
例如,A、B、C、D 這4個(gè)中斷源的優(yōu)先級(jí)別按A->B->C->D降序排列,根據(jù)這一次序,CPU執(zhí)行程序的軌跡如下圖所示。當(dāng)4個(gè)中斷源同時(shí)提出
在不改變CPU響應(yīng)中斷的次序下,通過改變屏蔽字可以改變CPU處理中斷的次序。例如,更改上述4個(gè)中斷源的屏蔽字將其處理次序更改為:
CPU在運(yùn)行程序的過程中,若A、B、C、D 4個(gè)中斷源同時(shí)提出請(qǐng)求,按照中斷級(jí)別的高低,CPU首先響應(yīng)并處理A中斷源的請(qǐng)求,由于A的屏蔽字是1111,屏蔽了所有的中斷源,故A程序可以全部執(zhí)行完,然后回到主程序。
由于B、C、D的中斷請(qǐng)求還未響應(yīng),而B的響應(yīng)優(yōu)先級(jí)高于其他,所以CPU響應(yīng)B的請(qǐng)求,進(jìn)入B的中斷服務(wù)程序。
在B的服務(wù)程序中,由于設(shè)置了新的屏蔽字0100,即A、C、D可打斷B,而A程序已執(zhí)行完,C的響應(yīng)優(yōu)先級(jí)高于D,于是CPU響應(yīng)C,進(jìn)入C的服務(wù)程序。
在C的服務(wù)程序中,由于設(shè)置了的屏蔽字0110,即A、D可打斷C,A已執(zhí)行于是CPU響應(yīng)D,執(zhí)行D的中斷服務(wù)程序。
D一直做完后回到C程序,C程序執(zhí)行完后,回到B程序。
B程序做完后,回到主程序。
在中斷處理過程中,CPU首先會(huì)檢查INTR,如果INTR為1,那么CPU會(huì)進(jìn)一步檢查對(duì)應(yīng)的屏蔽觸發(fā)器(MASK),如果MASK也為1,那么該中斷源的中斷請(qǐng)求會(huì)被屏蔽,CPU不會(huì)響應(yīng);如果MASK為0,那么CPU會(huì)響應(yīng)這個(gè)中斷請(qǐng)求,轉(zhuǎn)去執(zhí)行對(duì)應(yīng)的中斷服務(wù)程序。
這個(gè)過程是自動(dòng)進(jìn)行的,不需要程序員明確地編寫相關(guān)的指令。在硬件設(shè)計(jì)中,程序員需要根據(jù)實(shí)際需求來設(shè)置INTR、D和MASK的值,以實(shí)現(xiàn)正確的中斷處理。
你是軟件程序員還是硬件程序員呢?
3、屏蔽技術(shù)的意義
屏蔽技術(shù)還能給程序控制帶來更大的靈活性。例如,在浮點(diǎn)運(yùn)算中,當(dāng)程序員估計(jì)到執(zhí)行某段程序時(shí)可能出現(xiàn)“階上溢”,但又不希望因“階上溢”而使機(jī)器停機(jī),為此可設(shè)一屏蔽字,使對(duì)應(yīng)“階上溢”的屏蔽位為“1”,這樣,即使出現(xiàn)“階上溢”,機(jī)器也不停機(jī)。
在某些情況下,程序員可能希望在執(zhí)行某些操作之前禁止其他中斷,以防止這些中斷干擾正在進(jìn)行的操作。通過將對(duì)應(yīng)的中斷屏蔽觸發(fā)器設(shè)置為1(即屏蔽該中斷),程序員可以確保在執(zhí)行這些操作期間,不會(huì)受到來自該中斷源的中斷請(qǐng)求干擾。
此外,屏蔽技術(shù)還可以用于實(shí)現(xiàn)優(yōu)先級(jí)控制。例如,如果系統(tǒng)中有多個(gè)中斷源,并且程序員希望在某些操作完成之前不響應(yīng)其他低優(yōu)先級(jí)的中斷,那么可以通過調(diào)整屏蔽字的設(shè)置,改變CPU對(duì)不同中斷源的處理優(yōu)先級(jí)。這樣,程序員可以更好地控制程序的執(zhí)行流程和中斷處理順序,從而優(yōu)化系統(tǒng)的性能和響應(yīng)速度。
另外,屏蔽技術(shù)還可以用于調(diào)試程序。當(dāng)程序中存在某些不可預(yù)見的錯(cuò)誤時(shí),程序員可以通過設(shè)置相應(yīng)的屏蔽字,禁止某些中斷請(qǐng)求,以避免這些錯(cuò)誤對(duì)程序執(zhí)行造成干擾。同時(shí),通過查看被屏蔽的中斷服務(wù)程序表,程序員可以及時(shí)發(fā)現(xiàn)錯(cuò)誤并采取相應(yīng)的措施進(jìn)行修復(fù)。
屏蔽技術(shù)為程序員提供了一種強(qiáng)大的工具,可以更加靈活地控制程序的執(zhí)行和中斷處理過程。通過合理使用屏蔽技術(shù),可以提高系統(tǒng)的穩(wěn)定性和性能,滿足各種復(fù)雜的應(yīng)用需求。
一個(gè)中斷的一生
現(xiàn)在有了上述的基識(shí),如何從軟件與硬件的角度去看一個(gè)中斷,一個(gè)中斷的完整流程應(yīng)該是什么樣子?
?創(chuàng)建對(duì)應(yīng)的中斷服務(wù)函數(shù)(軟件):在編寫操作系統(tǒng)或應(yīng)用程序時(shí),需要為每個(gè)中斷源創(chuàng)建一個(gè)對(duì)應(yīng)的中斷服務(wù)函數(shù)(Interrupt Service Routine, ISR)。這個(gè)函數(shù)是用于處理特定中斷的程序,當(dāng)發(fā)生中斷時(shí),處理器會(huì)跳轉(zhuǎn)到這個(gè)函數(shù)執(zhí)行相應(yīng)的操作。?將中斷服務(wù)函數(shù)綁定到特定的中斷號(hào),也叫中斷注冊(cè)(軟件):在操作系統(tǒng)或硬件系統(tǒng)中,需要將每個(gè)中斷源與相應(yīng)的中斷號(hào)進(jìn)行綁定。這個(gè)過程通常在初始化時(shí)完成,以確保當(dāng)發(fā)生中斷時(shí)能夠正確地調(diào)用相應(yīng)的中斷服務(wù)函數(shù)。這個(gè)綁定可以通過編程實(shí)現(xiàn),例如在Linux系統(tǒng)中可以使用register_interrupt函數(shù)將中斷服務(wù)函數(shù)注冊(cè)到特定的中斷號(hào)。?模塊產(chǎn)生原始中斷(邏輯):當(dāng)某個(gè)硬件設(shè)備需要中斷處理器服務(wù)時(shí),它會(huì)向中斷控制器發(fā)送一個(gè)中斷請(qǐng)求。這個(gè)請(qǐng)求可能由硬件信號(hào)線或特定協(xié)議(如PCI Express)發(fā)送。例如,當(dāng)硬盤讀寫錯(cuò)誤時(shí),硬盤控制器會(huì)向中斷控制器發(fā)送一個(gè)中斷請(qǐng)求。
原始中斷是指當(dāng)某個(gè)設(shè)備或部件需要CPU的注意時(shí),它會(huì)通過向CPU發(fā)送一個(gè)中斷信號(hào)來請(qǐng)求CPU的注意。這個(gè)中斷信號(hào)是由硬件電路產(chǎn)生的,是電信號(hào),可以被CPU感知到。原始中斷通常是由硬件設(shè)備或系統(tǒng)自發(fā)產(chǎn)生的,例如鍵盤按鍵、定時(shí)器、打印機(jī)等。
?經(jīng)過int_mask判斷后未被屏蔽從而中斷狀態(tài)拉高(邏輯):中斷控制器接收到中斷請(qǐng)求后,會(huì)根據(jù)int_mask判斷該中斷是否被屏蔽。如果未被屏蔽,則將中斷狀態(tài)拉高,以便處理器能夠感知到這個(gè)中斷請(qǐng)求。這個(gè)過程中斷控制器會(huì)根據(jù)int_mask中的位圖判斷當(dāng)前的中斷是否被屏蔽,如果未被屏蔽則將對(duì)應(yīng)的中斷狀態(tài)位拉高。
中斷的int_mask是中斷掩碼。它是一個(gè)只讀寄存器,用于顯示哪些位當(dāng)前被屏蔽,哪些位未被屏蔽/啟用。通過設(shè)置int_mask,可以屏蔽或開啟某些中斷。
?模塊頂層信號(hào) xxx_int拉高后,送給特定中斷號(hào)對(duì)應(yīng)處理器(CPU&MCU等)的對(duì)應(yīng)bit(邏輯):當(dāng)中斷狀態(tài)被拉高后,模塊頂層信號(hào) xxx_int 會(huì)被拉高,并將這個(gè)信號(hào)送給特定中斷號(hào)對(duì)應(yīng)處理器的對(duì)應(yīng)bit。這個(gè)過程是由硬件邏輯實(shí)現(xiàn)的,通常與處理器的架構(gòu)和中斷控制器的設(shè)計(jì)有關(guān)。例如,在x86架構(gòu)的計(jì)算機(jī)中,當(dāng)某個(gè)中斷狀態(tài)被拉高后,對(duì)應(yīng)的處理器會(huì)通過APIC總線將對(duì)應(yīng)的中斷信號(hào)發(fā)送給處理器。?中斷信號(hào)拉高后,進(jìn)入對(duì)應(yīng)bit的中斷服務(wù)函數(shù)(邏輯):當(dāng)處理器的對(duì)應(yīng)bit接收到中斷信號(hào)后,處理器會(huì)跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)函數(shù)去處理這個(gè)中斷。這個(gè)過程是由硬件自動(dòng)完成的,通常與處理器的架構(gòu)和操作系統(tǒng)的設(shè)計(jì)有關(guān)。例如,在x86架構(gòu)的計(jì)算機(jī)中,當(dāng)處理器接收到一個(gè)中斷信號(hào)后,它會(huì)通過CSIP和IVT寄存器跳轉(zhuǎn)到對(duì)應(yīng)的中斷服務(wù)函數(shù)執(zhí)行相應(yīng)的操作。
硬件層面,中斷系統(tǒng)需要硬件設(shè)備(如中斷控制器)來捕捉中斷信號(hào),并將信號(hào)傳遞給CPU。在接收到中斷信號(hào)后,CPU會(huì)根據(jù)中斷號(hào)在中斷向量表中查找對(duì)應(yīng)的入口地址,然后跳轉(zhuǎn)到這個(gè)地址執(zhí)行對(duì)應(yīng)的中斷服務(wù)程序。這個(gè)過程是由硬件自動(dòng)執(zhí)行的,不需要軟件的參與。
?執(zhí)行中斷服務(wù)函數(shù)的內(nèi)容(軟件):在中斷服務(wù)函數(shù)中,會(huì)根據(jù)設(shè)備的需求進(jìn)行相應(yīng)的操作,例如讀取數(shù)據(jù)、發(fā)送響應(yīng)等。這個(gè)過程是由軟件實(shí)現(xiàn)的,通常與設(shè)備的驅(qū)動(dòng)程序和操作系統(tǒng)的設(shè)計(jì)有關(guān)。例如,在Linux系統(tǒng)中,當(dāng)執(zhí)行完一個(gè)中斷服務(wù)函數(shù)后,它通常會(huì)通過調(diào)用handle_irq_event函數(shù)來處理設(shè)備的事件。
MORE
中斷向量表
在ARM處理器中,當(dāng)一個(gè)中斷信號(hào)被觸發(fā)時(shí),中斷控制器會(huì)發(fā)出一個(gè)中斷請(qǐng)求,并將該請(qǐng)求傳遞給CPU。 CPU接收到中斷請(qǐng)求后,會(huì)根據(jù)中斷號(hào)在中斷向量表中查找對(duì)應(yīng)的中斷服務(wù)程序入口地址。 中斷向量表是一個(gè)預(yù)定義的表,其中每個(gè)條目都包含一個(gè)指向特定中斷服務(wù)程序的入口地址。 當(dāng)CPU接收到中斷請(qǐng)求時(shí),它會(huì)根據(jù)中斷號(hào)在表中查找對(duì)應(yīng)的條目,獲取對(duì)應(yīng)的入口地址,并跳轉(zhuǎn)到該地址執(zhí)行相應(yīng)的中斷服務(wù)程序。 在這個(gè)過程中,程序員可以通過設(shè)置中斷向量表中的條目來定義不同中斷源的中斷服務(wù)程序入口地址。 這樣可以實(shí)現(xiàn)自定義的中斷處理邏輯,根據(jù)不同的中斷事件執(zhí)行相應(yīng)的操作。 需要注意的是,在ARM處理器中,不同的工作模式(例如User、FIQ、IRQ、SVC等)使用不同的寄存器集和特權(quán)級(jí)別。 當(dāng)中斷發(fā)生時(shí),CPU會(huì)根據(jù)當(dāng)前的工作模式和中斷向量表中的條目,確定要跳轉(zhuǎn)到的中斷服務(wù)程序的入口地址。 然后它會(huì)將CPU的狀態(tài)保存到相應(yīng)的棧中,并跳轉(zhuǎn)到該地址執(zhí)行中斷服務(wù)程序。 在ARM處理器中,中斷向量表是一個(gè)預(yù)定義的表,它通常在系統(tǒng)啟動(dòng)時(shí)由引導(dǎo)加載器(Bootloader)或操作系統(tǒng)進(jìn)行定義和初始化。 引導(dǎo)加載器在系統(tǒng)啟動(dòng)時(shí)負(fù)責(zé)加載和啟動(dòng)操作系統(tǒng)的內(nèi)核。在這個(gè)過程中,它會(huì)讀取存儲(chǔ)器中的中斷向量表數(shù)據(jù),并將其復(fù)制到指定的內(nèi)存地址。 這個(gè)地址通常是在系統(tǒng)配置時(shí)確定的,以確保中斷向量表可以在正確的位置被CPU訪問。 操作系統(tǒng)在啟動(dòng)后也會(huì)接管中斷向量表的管理和配置。它會(huì)根據(jù)系統(tǒng)中斷控制器和其他硬件設(shè)備的配置,將中斷向量表中的條目映射到相應(yīng)的中斷服務(wù)程序入口地址。 這樣,當(dāng)中斷發(fā)生時(shí),CPU可以根據(jù)中斷號(hào)在中斷向量表中查找對(duì)應(yīng)的條目,并跳轉(zhuǎn)到對(duì)應(yīng)的地址執(zhí)行相應(yīng)的中斷服務(wù)程序。 需要注意的是,中斷向量表的定義方式和具體實(shí)現(xiàn)可能會(huì)因不同的ARM處理器架構(gòu)和系統(tǒng)設(shè)計(jì)而有所不同。 因此,具體的定義位置和方式可能會(huì)因硬件平臺(tái)和操作系統(tǒng)而有所差異。 這部分又涉及到編譯與內(nèi)存分布了,這里就不展開講了,有機(jī)會(huì)的一起看看。
Raw Interrupt和Masked Interrupt
Raw Interrupt和Masked Interrupt是兩種中斷類型,它們?cè)贏RM處理器中被用來處理中斷。
Raw Interrupt(原始中斷)是指外部中斷源的狀態(tài),無論ARM芯片是否屏蔽該中斷源,這個(gè)中斷源的中斷狀態(tài)都會(huì)被寄存器存儲(chǔ),從而可以通過相應(yīng)的函數(shù)讀取。
Masked Interrupt(屏蔽中斷)是指是否屏蔽的狀態(tài)。在ARM處理器中,每個(gè)中斷源都有一個(gè)與之對(duì)應(yīng)的屏蔽觸發(fā)器,如果該中斷源被屏蔽(即MASK=1),那么即使INTR被置為1,CPU也不會(huì)響應(yīng)這個(gè)中斷請(qǐng)求。換句話說,屏蔽觸發(fā)器可以阻止特定的中斷源向CPU發(fā)送中斷請(qǐng)求。所有的屏蔽觸發(fā)器組合在一起,構(gòu)成了屏蔽寄存器。
-
ARM
+關(guān)注
關(guān)注
134文章
9006瀏覽量
366021 -
寄存器
+關(guān)注
關(guān)注
31文章
5268瀏覽量
119640 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
1992瀏覽量
60976
原文標(biāo)題:參考資料
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論