標題: 關(guān)于單片機的中斷嵌套執(zhí)行的問題 [打印本頁]

作者: Heddea—    時間: 2022-8-20 12:02
標題: 關(guān)于單片機的中斷嵌套執(zhí)行的問題
我遇到了一個問題:
按照中斷優(yōu)先級來說,中斷的執(zhí)行會先比較“搶占優(yōu)先級”,如果前者相同再比較“子優(yōu)先級”,如果“子優(yōu)先級”也相同在比較各自的“序號”。
那么如果一個中斷函數(shù)執(zhí)行時,該中斷又被觸發(fā)了,兩者的優(yōu)先級都是相同的,此時該如何執(zhí)行呢?

我了解到的一種說法是雖然兩者的優(yōu)先級相同,但是還是會發(fā)生“中斷的嵌套”,即前一個同優(yōu)先級的中斷會被后一個中斷打斷。

如果是這樣的話,對于按照一定時間進入一次中斷函數(shù)的中斷一定是無法執(zhí)行的了,因為該中斷會被無限的嵌套下去。

但是如果在以下的使用情景中,中斷嵌套還會很大的影響程序的運行嗎?
即:通過IO口檢測外部的上升沿,進而觸發(fā)中斷,而該上升沿由按鍵按下產(chǎn)生,按鍵按下時會產(chǎn)生抖動,如果不進行消抖的話,可能會導致單片機的IO口接收到很多的上升沿信號,進而產(chǎn)生多個中斷,但是該種中斷的數(shù)量是有限的,中斷函數(shù)也比較簡單(這里中斷函數(shù)的內(nèi)容即使執(zhí)行多次對程序也無任何不良影響),所以此時即使產(chǎn)生了多個中斷的嵌套,單片機應該也可以快速的將這些嵌套處理完畢,即此時可以將中斷嵌套的影響忽略不計。

請問我上面的想法對嗎?


作者: yzwzfyz    時間: 2022-8-22 17:05
本帖最后由 yzwzfyz 于 2022-8-23 08:23 編輯

有頭腦,善于思考問題。汝子可教也!
1、中斷是不是響應,取決于中斷源自己的標記:F。(其它的中斷允許、屏蔽不在此討論,并假設中斷源標記是 F)。
對于 F的清除有兩種方式(具體看手冊):
其一、響應后CPU硬件自動清除。其二響應后需人工清除。
2、在你進入中斷程序后(已響應),就不會再響應本源的中斷。假如你已清除了F,而這時中斷源又動作了,它只能將F置1,無法做任何事,中斷N次,也只是將F置1而矣,一次與N次都一樣。
3、當你退出中斷服務程序后(以RETI為標志),CPU硬件會再次識別F是否為1。是1則再次響應。CPU并不識別中斷源動作了多少次,而只識別F是否為1。
4、在你進入中斷程序后(已響應),中斷源又動作了N次,它只能將F置1,而你在退出中斷之前,又做了一個【缺德】的事,清F清0了!這時,你再退出中斷服務程序后。程序不會再進入中斷,因為CPU看不見F了。

CPU響應中斷有以下條件:
1、本源F標記=1。
2、中斷被允許。
3、無更高級或同級中斷已被響應。
4、當前指令已執(zhí)行結(jié)束(當前指令未執(zhí)行完不響應)。
5、RETI 的一條指令已被執(zhí)行(看手冊,是否有這一條。一些單片機需要RETI后再執(zhí)行1-2條指令才能識別到F)。

總結(jié):
1、中斷源動作只能使 F=1,并不能讓CPU立即響應中斷。
2、中斷源動作N次,在未被CPU響應之前,只有最后一個起作用,CPU不識別動作次數(shù)。
3、中斷源動作N次,而中斷已被CPU響應,是否再次被響應,取決于本次中斷服務程序退出時,F(xiàn)是否為1。當然如果有更高級的中斷發(fā)生,即使未退出,也被搶了。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1