微控制器 外部中斷程式 為什麼不用寫在主程式中?為什麼中斷函式不在主函式也可以執行?

時間 2021-06-03 04:03:37

1樓:haoyu

中斷發生時,CPU會暫停當前的執行,判斷中斷源,找到響應的位址,中斷函式通常是一條跳轉指令,跳到實際中斷的位置,執行完中斷函式之後,CPU返回到當前中斷前的位置,繼續執行中斷前的指令。

下面摘自STC89C52對與中斷的描述

中斷向量 003H的位址,通常是一條LJMP指令,跳轉到實際的中斷函式。

2樓:SulfurZinc

所有的子程式都是寫在主程式外部的,只是普通子程式需要在主程式內呼叫。

中斷子程式(所有中斷程式,並不限於外部中斷)為什麼能在不被主程式呼叫的情況下執行呢?其實所有的程式都是要被「呼叫」才能執行的。那這個「呼叫」是什麼意思呢?

實際上就是修改程式指標(PC)來實現的,即使在乙個程式(子程式或者主程式)內部,下一時刻執行那條指令都是由PC來決定的,比如沒有分支,沒有迴圈的情況下,PC就自動加1,引導CPU執行接下來的一條程式,當有分支的時候或者呼叫子程式時,PC會被替換為目標指令的位址,從而實現轉移或呼叫。那麼中斷為什麼不需要呼叫呢,因為中斷的機制時這樣的:CPU每執行一條指令都會去檢查中斷標誌位,如果發生了中斷事件,這個中斷源對應的標誌位就會置位(變1),CPU會根據中斷標為的型別,將PC替換為這個中斷對應的中斷程式的開始位址,從而實現了中斷的自動呼叫。

3樓:抱一

主函式和中斷函式是平行關係,主函式與呼叫函式才是呼叫關係,所以中斷函式不寫在主程式中,中斷函式不在主函式中理所當然的可以執行。

雖然主函式中沒有寫中斷函式,但是必須有中斷函式的中斷配置。

4樓:小學生

先來慣例,瀉藥。

你這是兩個問題,那麼我先回答第乙個問題。

首先題目中提到了主程式,不知道大家認為的主程式是什麼呢?是main函式呢,還是微控制器執行的所有程式?要知道大多數微控制器在上電的時候都是從固定的位址開始取指執行程式的,當然不同的型別微控制器開始執行位址是不一樣的,但是結果大同小異,都是經過一系列複雜的操作之後跳轉到所謂的主程式main函式,這一系列操作可能包括復位操作,BootLoader跳轉,初始化暫存器等等,這些都沒有在main函式中,但是他們確實執行到了。

所以,並不是所有的操作都在主程式中,包括中斷程式,當然中斷程式是個例外,它是個特殊的存在。關於中斷函式的存放位址,是根據不同廠商放置在不同的位址的。

第二個問題,為什麼不在主程式中斷函式也能執行。

首先說中斷這個機制,要知道,中斷時微控制器的靈魂啊。如果所有的東西都要在主程式中執行,那我發生什麼異常了連退出來的機會都沒有,這樣的程式,想想都可怕,這就像高速執行的汽車,只能按照特定的路線行駛,連個方向盤都沒有,更別提剎車了。所以,處於種種考慮,微控制器加入了中斷這個機制,就是允許外部的異常來中斷CPU當前的操作,執行相應的使用者想要執行的操作。

這個流程大致是這個樣子的,當外部中斷異常被檢測到後,微控制器會自動停止操作,將當前程式的執行資訊儲存到對應的堆疊中(大部分堆疊處於RAM位址的後面,根據廠商的設計有部分變化),然後跳轉到要執行的中斷函式,這個中斷函式的位址與中斷號是一一對應的,可以在startup檔案中看到,或者手冊中看到。這時就可以執行中斷行數了,中斷函式執行結束以後,程式會將儲存在堆疊中的程式執行資訊恢復,然後繼續執行原程式。這個就是中斷的大致流程。

所以,中斷不是在主函式中,而是將函式的位址放入特定的暫存器中,等待異常(中斷源)到來,然後跳轉執行。關於中斷的詳細細節,沒辦法說的太多,幾萬字都不夠說的,想詳細了解可以自己檢視一些資料。

5樓:「已登出」

以51為例。

微控制器復位入口是0000H,中斷入口位址為0003H(INT0),000BH(T0),0013H(INT1),001BH(T1),0023(串列埠)。

所以在彙編層面上,通常在0000H放一條跳轉指令,跳轉到主程式,也就是

ORG 0000H

LJMP MAIN

如果要使用中斷,也是類似的,比如:

ORG 000BH

LJMP T0INT

在C語言中,如果使用了interrupt修飾函式,編譯器就會把上面T0INT的位址改成中斷處理函式的位址。至於何時跳轉,是由硬體決定的,只要中斷源發出請求,且CPU允許中斷,就會直接跳轉至對應的中斷入口,與程式沒有關係。

或者理解為:中斷函式是由硬體呼叫的。

6樓:幹逃株

為什麼主函式名字叫void main()……因為C語言發明者就這麼設計的……

中斷函式可以看成乙個特殊的程式入口,跟main一樣,可以想象成多執行緒,中斷函式和main併發執行。

在物理上,微控制器硬體,CPU高速分片執行main和中斷,比如說main執行1微秒,不論是否執行完,馬上切換到中斷函式執行1微杪,同樣不等是否執行完,再切換,如此反覆迴圈。

以上內容並不嚴謹,僅限於理解用。

7樓:秦旋

微控制器在程式PC指標最前面的空間開闢了一塊專門用於處理中斷。

也就是你的主程式不是從PC=0開始跑的。

中斷觸發後PC會跳轉到對應中斷號的位址,然後繼續執行中斷服務程式。

微控制器為什麼能直接燒錄程式?

張浩 分幾種情況吧,有些可以通過isp協議之類操作flash讀寫暫存器來實現燒寫,有些通過內部固化的一小段程式來和上位機通訊,或者兩者都有。如果是支援ram執行的微控制器,比如stm32,則兩種方式都可以,但是前者的方式顯然慢得多。所以jlink,stlink之類都是先寫一小段程式到ram,再執行這...

微控制器指令 mov c,1Fh為什麼?

XerolySkinner 不請自來 首先,觀察命令 MOV C,1FH 第乙個引數C,指的是PSW暫存器裡面的進製指示符CY 第二個引數1FH,注意不是 1FH,沒有 意味著這並不是乙個立即數,他指的是乙個位址.圖1 網上找的圖,其他部分和這個問題關係不大,關注位定址區 這個位址1FH,指的是位定...

為什麼微控制器的晶振會有 11 0592MHz 這個數字?

大家回答的都差不多了。我來補充乙個如果不用標準的11.0592行不行?其實是可以的。因為是非同步通訊,大家都是以相同的速度進行通訊。那麼用過取樣方法。用乙個4倍頻去取樣。這樣乙個位元的誤差就確定了。乙個序列通訊大概10bit,誤差是累積的。那麼大概頻率差異在5 左右就是可以接受的。所以,現在很多MC...