如果要你講一下中斷,你會怎么去描述一個中斷的觸發(fā)流程呢?
最基礎(chǔ)的可能就是:保護現(xiàn)場 - 中斷處理 - 恢復(fù)現(xiàn)場...
那保護現(xiàn)場做了什么事情?中斷處理需要注意什么事情?恢復(fù)現(xiàn)場又做了什么事情?
相對應(yīng)的,關(guān)于中斷,還有很多這樣的問題:
觸發(fā)中斷的因素有哪些?
各中斷源如何向CPU提出中斷請求?
CPU如何區(qū)分是哪個中斷觸發(fā)的請求?
當多個中斷源同時提出中斷請求時,中斷系統(tǒng)如何確定優(yōu)先響應(yīng)哪個中斷請求?
CPU在什么條件、什么時候、以什么方式來響應(yīng)中斷?
CPU響應(yīng)中斷后,如何保護現(xiàn)場?
CPU響應(yīng)中斷后,如何停止源程序的執(zhí)行而轉(zhuǎn)入中斷服務(wù)程序的入口地址?
CPU響應(yīng)中斷結(jié)束后,如何恢復(fù)現(xiàn)場?如何返回到源程序的間斷處?
在中斷處理的過程中又出現(xiàn)了新的中斷請求,CPU該如何處理?
設(shè)計中斷系統(tǒng)時,需要考慮哪些主要問題?
本文希望就以上的問題,對中斷觸發(fā)和響應(yīng)流程進行一個詳細的描述。力求可以通過一篇文章將中斷講明白!
首先,我先簡單的描述一個中斷的觸發(fā)流程:
我們通過某些操作(例如按下按鍵),產(chǎn)生了電信號(電平觸發(fā) / 邊沿觸發(fā));
如果該中斷沒有被關(guān)閉/屏蔽,中斷控制器會向CPU發(fā)送中斷請求;
CPU收到中斷請求后,判斷是否響應(yīng)該中斷;
(保護現(xiàn)場)如果一切條件滿足,響應(yīng)中斷,將當前正在運行的程序上下文保存到寄存器/堆棧中;
(中斷處理)CPU尋找中斷服務(wù)程序的入口地址,跳轉(zhuǎn)到中斷服務(wù)程序運行;
(恢復(fù)現(xiàn)場)中斷處理結(jié)束后,CPU會將之前保存在堆棧中的斷點和寄存器重新恢復(fù);
CPU繼續(xù)運行之前被打斷的程序。
在上述例子中,相關(guān)的問題如下:
產(chǎn)生中斷的方式有哪些?
答:主動觸發(fā)、軟件觸發(fā)、硬件觸發(fā)。
主動觸發(fā)(程序中通過函數(shù)接口,通知CPU進行中斷處理)
內(nèi)部中斷(數(shù)據(jù)溢出、非法地址訪問、未識別的操作碼...)
外部中斷(輸入/輸出設(shè)備、硬件設(shè)備故障...)
CPU如何區(qū)分是哪個中斷源觸發(fā)的請求?
答:中斷引腳+中斷號。
每一個能夠發(fā)出中斷請求的硬件設(shè)備控制器都有一條名為“IRQ”的輸出線。
所有的IRQ輸出線都與一個名為可編程中斷控制器的硬件電路輸入引腳相連。
中斷控制器會監(jiān)視IRQ線上的信號。
如果IRQ線上出現(xiàn)信號,中斷控制器會將其轉(zhuǎn)化成對應(yīng)的中斷號,通知CPU處理。
CPU根據(jù)中斷號,在中斷向量表中找到對應(yīng)的中斷處理程序
外部設(shè)備進行I/O操作時,會隨機產(chǎn)生中斷請求信號。這個信號中會有特定的標志,使計算機能夠判斷是哪個設(shè)備提出中斷請求,這個信號就叫做中斷號。
中斷號一般是由中斷控制器提供的,中斷控制器支持一系列的中斷源,并提供對應(yīng)的中斷號。中斷引腳也是由中斷控制器上引出來的。
即中斷控制器將中斷引腳和中斷號關(guān)聯(lián)起來,CPU又將中斷號和中斷處理程序關(guān)聯(lián)起來,
最終實現(xiàn)了通過中斷引腳上的信號,觸發(fā)CPU去執(zhí)行中斷處理程序。
當多個中斷源同時提出中斷請求時,中斷系統(tǒng)(中斷控制器)如何確定優(yōu)先響應(yīng)哪個中斷請求?
答:中斷優(yōu)先級+中斷屏蔽
為使系統(tǒng)能及時響應(yīng)并處理發(fā)生的所有中斷,系統(tǒng)根據(jù)引起中斷事件的重要性和緊迫程度,硬件將中斷源分為若干個級別,稱作中斷優(yōu)先級。
在實際系統(tǒng)中,常常遇到多個中斷源同時請求中斷的情況,這時CPU必須確定首先為哪一個中斷源服務(wù),以及服務(wù)的次序。
解決的方法是中斷優(yōu)先排隊,即根據(jù)中斷源請求的輕重緩急,排好中斷處理的優(yōu)先次序即優(yōu)先級( Priority ),又稱優(yōu)先權(quán),先響應(yīng)優(yōu)先級最高的中斷請求。
另外,當CPU正在處理某一中斷時,要能響應(yīng)另一個優(yōu)先級更高的中斷請求,而屏蔽掉同級或較低級的中斷請求,形成中斷嵌套。
CPU在什么時候、什么條件、以什么方式來響應(yīng)中斷?
答:可以從產(chǎn)生中斷、接收中斷、執(zhí)行中斷角度去描述。
中斷控制器對應(yīng)的中斷引腳上收到信號(產(chǎn)生中斷),中斷未被屏蔽、中斷優(yōu)先級最高(接收中斷),CPU當前處于可以切換上下文的狀態(tài)(執(zhí)行中斷)。
CPU響應(yīng)中斷條件:
有中斷源發(fā)出的中斷請求;
中斷總允許位EA=1,即CPU開中斷;
申請中斷的中斷源的中斷允許位為1,即中斷沒有被屏蔽;
無同級或更高級中斷正在被服務(wù);
當前的指令周期已經(jīng)結(jié)束。
(保護現(xiàn)場)CPU響應(yīng)中斷后,在開始執(zhí)行中斷服務(wù)程序之前,需要做哪些操作?如何保護現(xiàn)場?如何保存原程序斷點?
答:簡單來說就是,寄存器、堆棧、壓棧。
保護現(xiàn)場就是當出現(xiàn)中斷時,把CPU的狀態(tài),也就是當前程序地址保存在寄存器中,隨后轉(zhuǎn)向執(zhí)行其他任務(wù),當任務(wù)完成,從寄存器中取出地址繼續(xù)執(zhí)行。保護現(xiàn)場其實就是保存中斷前一時刻的狀態(tài)不被破壞。
CPU保護現(xiàn)場做如下動作:
將標志寄存器內(nèi)容壓入堆棧,以保護中斷時的狀態(tài);
將IF和TF標志清0,目的是防止在中斷響應(yīng)的同時又來別的中斷,而將TF清0是為了防止CPU以單步方式執(zhí)行中斷處理子程序。這時要特別提醒,因為CPU在中斷響應(yīng)時自動關(guān)閉了IF標志,因此用戶如要進行中斷嵌套時,必須在自己的中斷處理子程序中用開中斷指令來重新設(shè)置IF;
保護斷點,斷點指的是在響應(yīng)中斷時,主程序當前指令下面的一條指令的地址。因此保護斷點的動作就是將當前的IP和CS的內(nèi)容入棧,保護斷點是為了以后正確地返回主程序;
Ps:保護現(xiàn)場應(yīng)該包括保護程序斷點和保護CPU內(nèi)部各寄存器內(nèi)容的現(xiàn)場倆個方面
Ps:主程序和中斷服務(wù)子程序都要使用CPU內(nèi)部寄存器等資源,為使中斷處理程序不破壞主程序中寄存器的內(nèi)容,應(yīng)先將斷點處各寄存器的內(nèi)容壓入堆棧保護起來,再進入的中斷。
(執(zhí)行中斷)CPU響應(yīng)中斷后,如何轉(zhuǎn)入中斷服務(wù)程序運行?
答:中斷向量表。
CPU響應(yīng)中斷做如下動作:
根據(jù)中斷號(由中斷控制器傳遞),在中斷向量表中找出相應(yīng)的中斷服務(wù)程序的入口地址,跳轉(zhuǎn)至中斷服務(wù)子程序執(zhí)行。
Ps:驅(qū)動在申請注冊中斷時,會將中斷服務(wù)程序和中斷號進行綁定。
Ps:中斷號是由中斷控制器提供的,中斷控制器將對應(yīng)的中斷號和中斷引腳進行綁定。
(恢復(fù)現(xiàn)象)CPU響應(yīng)中斷結(jié)束后,在開始執(zhí)行中斷服務(wù)程序之后,需要做哪些操作?如何恢復(fù)現(xiàn)場?如何返回到原程序的斷點處?
答:簡單來說就是,寄存器、堆棧、出棧。
恢復(fù)現(xiàn)場就是指將各寄存器和指針恢復(fù)到中斷前的狀態(tài)。
當中斷處理完畢后,CPU將原程序保存在堆棧中的各個寄存器的內(nèi)容彈出,即恢復(fù)原程序斷點處寄存器的原值。
CPU保護現(xiàn)場做如下動作:
恢復(fù)斷點,斷點指的是在響應(yīng)中斷時,原程序當前指令下面的一條指令的地址。因此恢復(fù)斷點的動作就是將先前的指針和寄存器的內(nèi)容出棧,即恢復(fù)原程序斷點處寄存器的原值;
將IF和TF標志置1,允許接收新的中斷;
審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
10904瀏覽量
213023 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41753 -
中斷系統(tǒng)
+關(guān)注
關(guān)注
1文章
96瀏覽量
61071 -
程序
+關(guān)注
關(guān)注
117文章
3795瀏覽量
81415
原文標題:你對中斷究竟有多了解?試著把中斷的觸發(fā)流程整理了一遍...
文章出處:【微信號:玩點嵌入式,微信公眾號:玩點嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論