單片機(jī)跑起來(lái)第三章:中斷機(jī)制
中斷機(jī)制
中斷機(jī)制在單片機(jī)及嵌入式系統(tǒng)中是重中之重,我們必須深入理解。首先我們要明白一點(diǎn):CPU執(zhí)行指令代碼,并非一直順序地逐條執(zhí)行,而是可能突然跳到某段代碼上去的。因?yàn)檫@段代碼的優(yōu)先級(jí)更高,或者說(shuō)它更加緊迫,CPU必須暫時(shí)放下手上的的工作,立即去執(zhí)行它,否則就可能導(dǎo)致不良的后果,甚至是嚴(yán)重的事故。這個(gè)“突然跳轉(zhuǎn)”有時(shí)是可以人為預(yù)見的,或者是設(shè)計(jì)人員故意使然,但有些時(shí)候卻是隨機(jī)的,無(wú)法事先斷定它發(fā)生的具體時(shí)間。這就是“中斷”最為通俗的表述,如圖1.22所示。
圖1.22 對(duì)“中斷機(jī)制”的表述
有人說(shuō):“中斷似乎是在給CPU搗亂嘛,它總是在打斷程序的正常執(zhí)行?!辈诲e(cuò),但是不能說(shuō)是“搗亂”,因?yàn)橹袛嗟拇嬖谑呛侠淼模菫榱私鉀Q實(shí)實(shí)在在的問(wèn)題而產(chǎn)生的。比如說(shuō),一個(gè)單片機(jī)正在正常工作,它同時(shí)還要接收來(lái)自于串口的數(shù)據(jù),但是它又不知道數(shù)據(jù)何時(shí)會(huì)到,為了解決這一問(wèn)題,我們可以采用CPU輪詢方式,即不停地查看是否有新的數(shù)據(jù)到來(lái),如果有則進(jìn)行接收。這樣作的最大問(wèn)題在于浪費(fèi)CPU的運(yùn)行時(shí)間,這可能會(huì)影響到其它任務(wù)的執(zhí)行效率。如果使用中斷方式,將使CPU得以解放,在沒有數(shù)據(jù)到來(lái)之前它可以安心地去作其它工作。串口控制器(CPU外設(shè))在接收到新的數(shù)據(jù)后主動(dòng)通知CPU(這個(gè)通知的過(guò)程依賴于專門的中斷控制電路以及CPU的中斷源),CPU立即跳到事先設(shè)計(jì)好的處理代碼(ISR,中斷服務(wù)程序)去執(zhí)行,完成數(shù)據(jù)的接收和處理。最后再跳回到原來(lái)的“斷點(diǎn)”處繼續(xù)完成手上的工作。
關(guān)于中斷,其實(shí)包含有非常多的內(nèi)容,比如現(xiàn)場(chǎng)維護(hù)、中斷向量、中斷優(yōu)先級(jí)、中斷響應(yīng)速度、中斷的嵌套等等。要將這一切融會(huì)貫通,我們才能在實(shí)際的開發(fā)過(guò)程中游刃有余。不過(guò),中斷很多時(shí)候要比我們想像得更加復(fù)雜一些:如果主程序在順序執(zhí)行過(guò)程中產(chǎn)生了中斷,CPU立即轉(zhuǎn)向中斷服務(wù)程序,那如果在執(zhí)行中斷服務(wù)程序的過(guò)程中,再一次產(chǎn)生了中斷,CPU又該何去何從呢?這就是上面所說(shuō)的“中斷嵌套”所要解決的問(wèn)題(這里只是簡(jiǎn)單說(shuō)說(shuō),讓大家心中有初步的認(rèn)識(shí))。
好,本章到這里就告一段落了。振南希望通過(guò)此章能夠讓大家從根本上實(shí)實(shí)在在地認(rèn)識(shí)到CPU與單片機(jī)體系結(jié)構(gòu)以及運(yùn)作機(jī)理的本質(zhì),在腦中建立起一個(gè)形象的模型。有了這個(gè)基礎(chǔ),大家對(duì)單片機(jī)的理解才能真正作到入木三分,學(xué)習(xí)和領(lǐng)悟才能事半功倍。
單片機(jī)和C語(yǔ)言其實(shí)不難,從某種意義上來(lái)說(shuō),它只不過(guò)是一個(gè)“熟練工種”,最重要的是“入門”?;A(chǔ)加上我們的聰明才智,每一個(gè)人都能成為高手!