中斷
單片機(jī)CPU在處理某一事情A時(shí),發(fā)作了另一事情B懇求CPU敏捷去處理(中斷發(fā)作);CPU暫時(shí)中斷當(dāng)時(shí)的作業(yè),轉(zhuǎn)去處理事情B(中斷呼應(yīng)和中斷效勞);待CPU將事情B處理完畢后,再回到本來(lái)事情A被中斷的當(dāng)?shù)爻掷m(xù)處理事情A(中斷回來(lái)),這一進(jìn)程稱為中斷。
例如
當(dāng)你正在洗衣時(shí),俄然手機(jī)響了(中斷發(fā)作),你暫時(shí)中斷洗衣的作業(yè),轉(zhuǎn)去接電話(中斷呼應(yīng)和中斷效勞),待你接完后,再回來(lái)持續(xù)洗衣(中斷回來(lái)),這一進(jìn)程就是中斷。
單片機(jī)中斷分為內(nèi)部中斷和外部中斷兩大類,外部中斷由單片機(jī)外部設(shè)備發(fā)生,中斷發(fā)生后經(jīng)過單片機(jī)的外部管腳傳遞給單片機(jī),傳遞這個(gè)中斷信號(hào)最簡(jiǎn)略的辦法就是規(guī)則單片機(jī)的管腳在什么狀況下有外部中斷發(fā)生,這樣單片機(jī)一般是有一個(gè)或多個(gè)IO口當(dāng)在輸入狀況時(shí)能夠用來(lái)檢測(cè)外部中斷信號(hào)。有外部中斷發(fā)生的條件一般也就是這五種:IO口輸入為高、IO口輸入為低、IO口輸入由高變?yōu)榈?、IO口輸入由低變?yōu)楦?、IO口輸入由高變低或許由低變高。
一個(gè)銜接到單片機(jī)的外部設(shè)備,如果想要運(yùn)用單片機(jī)的外部中斷,就有必要在自己懇求單片機(jī)中斷呼應(yīng)的時(shí)分給單片機(jī)供給單片機(jī)在這五種信號(hào)中所支撐的類型來(lái)觸發(fā)單片機(jī)中斷。程序作業(yè)中,一個(gè)中斷不是只發(fā)生一次,一般都會(huì)距離持續(xù)發(fā)生,這五種外部中斷觸發(fā)信號(hào)前四種都有一個(gè)問題,就是程控直流電源外設(shè)發(fā)出懇求中斷信號(hào)后如果信號(hào)懇求線狀況不改動(dòng),程控直流電源外設(shè)會(huì)無(wú)法向單片機(jī)供給下一次中斷懇求信號(hào)。讓我們來(lái)看看以單片機(jī)和外部設(shè)備選用負(fù)跳變觸發(fā)中斷為例的觸發(fā)狀況。
外部設(shè)備以負(fù)跳變觸發(fā)單片機(jī)中斷,第一次中斷懇求外部設(shè)備的中斷懇求輸出腳能夠從高變低,觸發(fā)單片機(jī)中斷,第一次中斷懇求發(fā)作后中斷懇求腳保持輸出低,外部設(shè)備無(wú)法發(fā)生第2次中斷的觸發(fā)負(fù)跳變信號(hào)。
圖1 程控直流電源外設(shè)只能發(fā)生一次中斷懇求信號(hào)暗示圖
將外部設(shè)備的中斷懇求信號(hào)做出修正,本來(lái)為需求中斷時(shí)僅僅輸出從高到低改動(dòng),現(xiàn)在改為輸出先從高變到低,經(jīng)過一小段時(shí)刻后自己從低變回高,這樣就能夠每次需求中斷時(shí)都能向單片機(jī)輸出負(fù)跳變觸發(fā)信號(hào)。
圖2 程控直流電源外設(shè)可接連發(fā)生中斷懇求信號(hào)暗示圖一
或許是由外部設(shè)備供給某種接口,單片機(jī)經(jīng)過該接口能夠?qū)ν獠吭O(shè)備進(jìn)行中斷鏟除操作,中斷鏟除操作能夠讓外部設(shè)備的中斷懇求輸出腳康復(fù)到高。
圖3 程控直流電源外設(shè)可接連發(fā)生中斷懇求信號(hào)暗示圖二
外部中斷觸發(fā)還有一些特殊辦法,比方外部脈沖寬度丈量、外部脈沖計(jì)數(shù)等,這些辦法都是在前面幾種基本觸發(fā)辦法上進(jìn)行功用擴(kuò)展得來(lái)的,外部脈沖寬度丈量就是當(dāng)中斷信號(hào)線跳變時(shí)會(huì)發(fā)動(dòng)內(nèi)部一個(gè)計(jì)時(shí)器,到下一次中斷信號(hào)線跳變時(shí)經(jīng)過計(jì)時(shí)器得到脈沖寬度并重新發(fā)動(dòng)計(jì)時(shí)器,這些辦法很少會(huì)運(yùn)用到,不做詳述。
內(nèi)部中斷是指單片機(jī)內(nèi)部的功用模塊發(fā)生中斷信號(hào),只需是單片機(jī)內(nèi)部在CPU外圍能獨(dú)立作業(yè)的功用模塊都會(huì)供給中斷功用,常見的內(nèi)部中斷類型有時(shí)鐘Timer、串口UART、模數(shù)變換ADC等。內(nèi)部中斷的作業(yè)流程和外部中斷沒太多差異,僅僅中斷懇求信號(hào)是在單片機(jī)內(nèi)部進(jìn)行傳輸,中斷信號(hào)不是管腳上的電平狀況,而是一個(gè)寄存器里邊的相應(yīng)標(biāo)志位,一般當(dāng)某個(gè)內(nèi)部中斷發(fā)生中斷懇求時(shí)就會(huì)將相應(yīng)標(biāo)志方位為1,CPU呼應(yīng)中斷時(shí)將這個(gè)標(biāo)志位清0。
圖4 內(nèi)部中斷觸發(fā)暗示圖
單片機(jī)對(duì)中斷標(biāo)志位的處理辦法沒有統(tǒng)一標(biāo)準(zhǔn),具體的約好辦法要看單片機(jī)文檔。大部分是標(biāo)志位為1有中斷發(fā)生,但有少量單片機(jī)是標(biāo)志位為0有中斷發(fā)生;有的單片機(jī)對(duì)中斷標(biāo)志位是CPU寫入什么就是給改寫成什么,有的則是規(guī)則有必要經(jīng)過寫1或?qū)?來(lái)實(shí)現(xiàn)鏟除操作,還有少量只需讀一下中斷標(biāo)志位就會(huì)主動(dòng)鏟除掉該標(biāo)志位。
如果單片機(jī)不想被外部中斷觸發(fā),大不了將用于銜接外部中斷觸發(fā)信號(hào)的管腳接成不會(huì)觸發(fā)中斷的電壓狀況就能夠,但內(nèi)部中斷無(wú)法去改動(dòng)內(nèi)部連線,所以單片機(jī)為了能夠挑選中斷是否能夠被除法,在其內(nèi)部會(huì)有相關(guān)的寄存器來(lái)進(jìn)行挑選,經(jīng)過里邊的操控標(biāo)志位開發(fā)人員能夠根據(jù)實(shí)踐狀況決議是否運(yùn)用中斷。一般單片機(jī)里邊有一個(gè)總操控位,這個(gè)位能夠操控一切中斷的開與關(guān),然后每一種中斷自己還有一個(gè)獨(dú)立的操控位決議自己的開與關(guān),如果想運(yùn)用某個(gè)中斷,就需求將總中斷開關(guān)和對(duì)應(yīng)中斷的開關(guān)都翻開。
當(dāng)單片機(jī)有中斷信號(hào)發(fā)生時(shí),就會(huì)觸發(fā)對(duì)應(yīng)中斷,不同的中斷源會(huì)需求不同的呼應(yīng)辦法,也就是說(shuō)不同的中斷發(fā)生的時(shí)分,需求單片機(jī)程序按照不同的中斷源做出不同的呼應(yīng),這就是中斷效勞程序。如果是UART收到新數(shù)據(jù)發(fā)生中斷,應(yīng)該是UART中斷效勞程序?qū)?shù)據(jù)讀回來(lái)并做處理,如果是ADC變換完結(jié)發(fā)生的中斷,需求的則是ADC中斷效勞程序?qū)?shù)據(jù)讀回來(lái)并做處理。如果需求清中斷標(biāo)志位動(dòng)作,一般都是在中斷效勞程序里邊完結(jié)。
不同的中斷源需求與之對(duì)應(yīng)的中斷效勞程序,實(shí)踐開發(fā)中并不是一切的中斷都會(huì)被用到,開發(fā)人員為了節(jié)約程序代碼空間會(huì)只寫出自己要運(yùn)用到的中斷效勞程序,也就是說(shuō)會(huì)有一些中斷沒有與之對(duì)應(yīng)的中斷效勞程序,如果觸發(fā)了這樣的中斷,單片機(jī)程序會(huì)運(yùn)轉(zhuǎn)犯錯(cuò),前面中斷各自獨(dú)立的操控位就排上用場(chǎng),將這些操控位關(guān)掉,相應(yīng)中斷就不會(huì)被觸發(fā)。
單片機(jī)開端上電的時(shí)分,如果操控中斷是否被翻開的寄存器操控標(biāo)志位被翻開,可能會(huì)呈現(xiàn)中斷被誤觸發(fā)的狀況,而這個(gè)中斷如果沒有與之相對(duì)應(yīng)的中斷效勞程序的話程序就會(huì)跑飛,所以單片機(jī)上電的時(shí)分一般會(huì)主動(dòng)將這些寄存器里邊的標(biāo)志位都關(guān)掉,避免誤觸發(fā)。
中斷效勞程序是單片機(jī)程序的一部分,具體內(nèi)容由開發(fā)人員決議,這樣中斷效勞程序的巨細(xì)在單片機(jī)程序中的方位就不固定,當(dāng)單片機(jī)的中斷被觸發(fā)后,單片機(jī)需求知道中斷效勞程序在什么方位才干履行它,單片機(jī)經(jīng)過中斷跳轉(zhuǎn)表(中斷向量表)來(lái)處理這個(gè)問題。
盡管中斷效勞程序的巨細(xì)和在整個(gè)程序中的方位會(huì)不固定,但程序只需被燒進(jìn)單片機(jī)體系,關(guān)于這個(gè)程序來(lái)說(shuō)其中斷效勞程序的巨細(xì)和在整個(gè)程序中的方位就會(huì)被固定下來(lái),如果對(duì)單片機(jī)程序空間分配我們做出一些約好,將一個(gè)肯定固定地址專門分配給中斷運(yùn)用,程序編譯時(shí)會(huì)將中斷效勞程序的開端地址(或許是跳轉(zhuǎn)到中斷效勞程序的指令)填到這個(gè)肯定固定地址地點(diǎn)的空間,當(dāng)中斷發(fā)生時(shí)分,單片機(jī)先將肯定固定地址地點(diǎn)方位里邊的內(nèi)容讀出,根據(jù)所讀內(nèi)容就能夠跳轉(zhuǎn)到中斷效勞程序。
圖5 中斷呼應(yīng)暗示圖
簡(jiǎn)略的單片機(jī)所供給的中斷品種有限,為了簡(jiǎn)化程序,會(huì)給每一個(gè)中斷分配一個(gè)用來(lái)存放中斷效勞程序地址的地址空間,這種辦法其實(shí)沒什么不好的當(dāng)?shù)?,僅僅單片機(jī)技能發(fā)展到現(xiàn)在遇到了瓶頸,高端單片機(jī)越來(lái)越雜亂,所以一些專業(yè)廠商開端合作共享技能資源,例如ARM公司利用他們?cè)贑PU架構(gòu)體系上的技能優(yōu)勢(shì)專門給別的的廠商供給CPU內(nèi)核,別的的廠商在ARM內(nèi)核的CPU外圍添加功用模塊,這些功用模塊大都支撐中斷。
圖6 ARM內(nèi)核單片機(jī)架構(gòu)圖
不同廠家在相同CPU內(nèi)核基礎(chǔ)上規(guī)劃出來(lái)的單片機(jī)外圍的功用模塊會(huì)各不相同,從而中斷的品種和個(gè)數(shù)也各不相同,而CPU處理中斷的辦法是一樣的,如果延續(xù)簡(jiǎn)略的單片機(jī)給每個(gè)中斷都分配一個(gè)地址空間的做法顯然有問題,CPU無(wú)法知道到底有多少種中斷需求支撐,這些中斷又分別對(duì)應(yīng)什么模塊,所以選用別的一種中斷處理辦法,將一切中斷地址都指向同一個(gè),并將一切中斷順次編號(hào),中斷發(fā)生時(shí)分CPU會(huì)通知中斷效勞程序當(dāng)時(shí)中斷編號(hào)是多少,然后中斷效勞程序根據(jù)中斷編號(hào)做出相應(yīng)呼應(yīng)。
圖7 共用中斷進(jìn)口中斷呼應(yīng)流程圖
圖8 獨(dú)立中斷進(jìn)口中斷呼應(yīng)流程圖
一切中斷運(yùn)用同一個(gè)中斷向量地址然后經(jīng)過中斷號(hào)判斷中斷類別的辦法盡管處理了通用CPU內(nèi)核中斷不能直接對(duì)應(yīng)中斷向量地址的問題,但把它中斷處理的流程和具有獨(dú)立中斷向量表的單片機(jī)比較就會(huì)發(fā)現(xiàn)中斷的呼應(yīng)速度會(huì)變慢。具有獨(dú)立中斷向量表的單片機(jī)只需一條跳轉(zhuǎn)指令就能夠直接進(jìn)入中斷程序,而沒有獨(dú)立中斷向量表的單片機(jī)需求先跳轉(zhuǎn)到中斷公共進(jìn)口,然后經(jīng)過代碼斷定中斷類別,斷定中斷類別后才跳轉(zhuǎn)到真實(shí)的中斷程序中去。C言語(yǔ)的代碼會(huì)讓這種狀況愈加惡化,所以如果是沒有獨(dú)立中斷向量表的單片機(jī)一般選用匯編查表的辦法加速中斷呼應(yīng)速度。
圖9 匯編中斷快速跳轉(zhuǎn)表
中斷程序履行完畢后回回來(lái)持續(xù)履行主程序,這樣就要求中斷不改動(dòng)主程序的運(yùn)轉(zhuǎn)狀況,所以中斷呼應(yīng)時(shí)需求將程序當(dāng)時(shí)運(yùn)轉(zhuǎn)的狀況信息保存起來(lái),比方程序運(yùn)轉(zhuǎn)到什么方位、當(dāng)時(shí)CPU狀況寄存器的狀況等信息。當(dāng)中斷程序履行完畢,能夠經(jīng)過這些信息將CPU狀況寄存器康復(fù)本來(lái)狀況,并能回來(lái)原程序持續(xù)履行。不同的單片機(jī)對(duì)此的處理辦法也會(huì)有不同,一種是完全由硬件來(lái)完結(jié),并不需求程序來(lái)進(jìn)行辦理;別的一種是將狀況信息用相應(yīng)指令保存在特定方位,回來(lái)時(shí)再用相應(yīng)指令康復(fù)本來(lái)狀況。
單片機(jī)中斷還有中斷優(yōu)先級(jí)和中斷嵌套的概念,但不是一切的單片機(jī)都會(huì)支撐這兩種功用。中斷優(yōu)先級(jí)是不同的中斷會(huì)有不同的優(yōu)先級(jí)別,如果一起有兩個(gè)中斷發(fā)生,單片時(shí)機(jī)先呼應(yīng)優(yōu)先級(jí)高的中斷。中斷嵌套是指在中斷呼應(yīng)當(dāng)中又有新的中斷發(fā)生,單片機(jī)能夠暫停當(dāng)時(shí)的中斷程序履行去呼應(yīng)新的中斷,新中斷程序履行完今后在接著履行當(dāng)時(shí)中斷程序。一般中斷嵌套是高優(yōu)先級(jí)的中斷能夠刺進(jìn)低優(yōu)先級(jí)中斷呼應(yīng)程序,同級(jí)或低級(jí)的中斷不能刺進(jìn)當(dāng)時(shí)中斷呼應(yīng)程序。
圖10 中斷嵌套暗示圖
中斷過程闡明:
過程①保存主程序現(xiàn)場(chǎng),履行中斷1效勞程序
過程②保存中斷1效勞程序現(xiàn)場(chǎng),履行中斷2效勞程序
過程③康復(fù)中斷1效勞程序現(xiàn)場(chǎng),持續(xù)履行中斷1效勞程序
過程④康復(fù)主程序現(xiàn)場(chǎng),預(yù)備持續(xù)履行主程序,有新中斷不能持續(xù)履行主程序
過程⑤保存主程序現(xiàn)場(chǎng),履行中斷3效勞程序
過程⑥康復(fù)主程序現(xiàn)場(chǎng),預(yù)備持續(xù)履行主程序,有新中斷不能持續(xù)履行主程序
過程⑦保存主程序現(xiàn)場(chǎng),履行中斷4效勞程序
過程⑧康復(fù)主程序現(xiàn)場(chǎng),無(wú)中斷發(fā)生持續(xù)履行主程序
有的單片機(jī)一進(jìn)入中斷函數(shù)就會(huì)主動(dòng)將中斷的總操控位關(guān)掉,需求程控直流電源工程師在中斷程序頂用程序再次翻開,否則一次中斷后一切的中斷就不能持續(xù)運(yùn)用。關(guān)于中斷標(biāo)志位,在寫單片機(jī)程序的時(shí)分要根據(jù)單片機(jī)文檔進(jìn)行鏟除標(biāo)志為操作,否則有可能會(huì)一旦發(fā)生某個(gè)中斷就會(huì)接連不斷的重復(fù)呼應(yīng)這個(gè)中斷,導(dǎo)致主程序不能持續(xù)運(yùn)轉(zhuǎn)。