單片機開發——中斷的優先順序

中斷優先順序的內容,大家先通過我的介紹大概了解一下即可,後邊實際應用的時候我們再詳細理解。在講中斷產生背景的時候,我們僅僅講了看電視和燒水的例子,但是實際生活當中還有更複雜的,比如我正在看電視,這個時候來電話了,我要進入接電話的「中斷」程序當中去,就在接電話的同時,聽到了水開的聲音,水開的「中斷」也發生了,我們就必須要放下手上的電話,先把煤氣關掉,然後再回來聽電話,最後聽完了電話再看電視,這裡就產生了一個優先順序的問題。還有一種情況,我們在看電視的時候,這個時候聽到水開的聲音,水開的「中斷」發生了,我們要進入關煤氣的「中斷」程序當中,而在關煤氣的同時,電話聲音響了,而這個時候,我們的處理方式是先把煤氣關閉,再去接聽電話,最後再看電視。

Advertisements

從這兩個過程中,我們可以得到一個結論,就是最最緊急的事情,一旦發生后,我們不管當時處在哪個「程序」當中,我們必須先去處理最最緊急的事情,處理完畢后再去解決其它事情。在我們的單片機程序當中有時候也是這樣的,有一般緊急的中斷,有特別緊急的中斷,這取決於具體的系統設計,這就涉及到中斷優先順序和中斷嵌套的概念,在本章節我們先簡單介紹一下相關寄存器,不做常式說明。中斷優先順序有兩種,一種是搶佔優先順序,一種是固有優先順序,先介紹搶佔優先順序。來看表 6-4 和表 6-5。

IP 這個寄存器的每一位,表示對應中斷的搶佔優先順序,每一位的複位值都是 0,當我們把某一位設置為 1 的時候,這一位的優先順序就比其它位的優先順序高了。比如我們設置了 PT0位為 1 后,當單片機在主循環或者任何其它中斷程序中執行時,一旦定時器 T0 發生中斷,作為更高的優先順序,程序馬上就會跑到 T0 的中斷程序中來執行。反過來,當單片機正在 T0中斷程序中執行時,如果有其它中斷髮生了,還是會繼續執行 T0 中斷程序,直到把 T0 中的中斷程序執行完畢以後,才會去執行其它中斷程序。

Advertisements

當進入低優先順序中斷中執行時,如又發生了高優先順序的中斷,則立刻進入高優先順序中斷執行,處理完高優先順序級中斷後,再返回處理低優先順序中斷,這個過程就叫做中斷嵌套,也稱為搶佔。所以搶佔優先順序的概念就是,優先順序高的中斷可以打斷優先順序低的中斷的執行,從而形成嵌套。當然反過來,優先順序低的中斷是不能打斷優先順序高的中斷的。那麼既然有搶佔優先順序,自然就也有非搶佔優先順序了,也稱為固有優先順序。在表 6-3 中的最後一列給出的就是固有優先順序,請注意,在中斷優先順序的編號中,一般都是數字越小優先級越高。從表中可以看到一共有 1~6 共 6 級的優先順序,這裡的優先順序與搶佔優先順序的一個不同點就是,它不具有搶佔的特性,也就是說即使在低優先順序中斷執行過程中又發生了高優先順序的中斷,那麼這個高優先順序的中斷也只能等到低優先順序中斷執行完后才能得到響應。既然不能搶佔,那麼這個優先順序有什麼用呢?

答案是多個中斷同時存在時的仲裁。比如說有多個中斷同時發生了,當然實際上發生這種情況的概率很低,但另外一種情況就常見的多了,那就是出於某種原因我們暫時關閉了總中斷,即 EA=0,執行完一段代碼后又重新使能了總中斷,即 EA=1,那麼在這段時間裡就很可能有多個中斷都發生了,但因為總中斷是關閉的,所以它們當時都得不到響應,而當總中斷再次使能后,它們就會在同時請求響應了,很明顯,這時也必需有個先後順序才行,這就是非搶佔優先順序的作用了——如表 6-3 中,誰優先順序最高先響應誰,然後按編號排隊,依次得到響應。

搶佔優先順序和非搶佔優先順序的協同,可以使單片機中斷系統有條不紊的工作,既不會無休止的嵌套,又可以保證必要時緊急任務得到優先處理。在後續的學習過程中,中斷系統會與我們如影隨形,處處都有它的身影,隨著學習的深入,相信你對它的理解也會更加的深入。


Advertisements

你可能會喜歡