51微控制器中斷子程式中呼叫其它子程式怎樣呼叫

2021-03-03 21:01:23 字數 3053 閱讀 3862

1樓:毛曼趙方

在主程式裡面呼叫過的函式最好不要在中斷裡面呼叫,因為這關係到函式的遞迴呼叫了。所謂遞迴函式就是在函式裡面呼叫了函式本身。一般在pc機裡面用。

這樣處理很麻煩的,在微控制器資源有限的情況下這種情況很容易出現死迴圈,你設想一下,例如你在主函式裡面呼叫了函式a。在中斷裡面也呼叫了函式a。當主程式執行到函式a裡面的時候,發生中斷,在中斷裡面有執行了函式a。

等出了中斷,繼續執行函式a,可是又在執行函式a的時候發生中斷,又執行函式a。這樣不就是個死迴圈了嗎??如果非得在中斷裡面呼叫,又要在主程式裡面呼叫,那就用兩個名字不同,但是功能完全相同的函式。

當然這樣做也有風險,要是你呼叫的函式裡面有觸發中斷的條件,也會變死迴圈。

2樓:匿名使用者

中斷中呼叫其他程式跟不在中斷中呼叫一樣,比如你定義一個只程式vodi delay(void)那麼你在main()中呼叫時是delay();

在中斷中也是一樣這樣用

請問51微控制器的中斷服務子程式中能否加跳轉指令

3樓:填盍

中斷服務子程式,你指的的是哪部分的?如果是產生中斷後,硬體自動跳轉到中斷服務入口處,執行的那個程式的話,必須加跳轉。因為每個中斷入口後僅分配給該中斷服務程式8位元組的指令空間,只能用於保護現場並跳轉到真正的中斷服務程式,執行完後用ret指令跳回這裡,再用reti指令跳回主程式。

當然,在真正的中斷服務程式中也可以加跳轉指令,而且跳轉指令作用很多,可以用於多路分支程式和查表程式

4樓:匿名使用者

看你跳到**

在中斷子程式內部跳跳隨便你

要是跳轉範圍跑到中斷程式外面,你的程式早晚因為堆疊滿了跑飛

5樓:匿名使用者

當然可以了,在中斷向量地址處就可以加一條跳轉指令,中斷程式中也可以使用的。

mcs-51微控制器程式中可以直接呼叫中斷服務程式嗎?為什麼?

6樓:丿丶

這樣給你說吧。當微控制器執行起來的時候是高速運轉你while(1)裡面的程式。但是這樣是不夠的,比如你想把某個訊號傳遞給微控制器讓它處理,比如說:

你按了某個鍵來控制某個燈的亮滅,這時候就需要微控制器來響應你的動作,響應的方式就是中斷。也就是說你在主程式中完成了某個中斷的觸發條件時,當達到這個條件時程式就會跳轉到中斷服務函式中去,執行完中斷服務函式中的程式後再返回主程式中繼續迴圈執行。你說的呼叫其實不太正確,中斷服務函式只能觸發,它是由微控制器內特定的某些暫存器的標誌位控制的,當這些滿足觸發條件的時候,標誌位被硬體置1,然後自動執行你編寫的中斷服務函式。

說的不是很清楚,請見諒,中斷是微控制器內最重要的功能之一,與之對應的還有定時器(這是微控制器的心臟),這些內容在51裡面都是很簡單的,但是到了32位微控制器裡面會變得特別複雜。

希望這些內容能給你一些幫助。

7樓:匿名使用者

理論上是可以的,實際上,也是可以的,但要說明的是,中斷服務程式的返回使用 reti 指令,與子程式返回的 ret 指令是有區別的。

8樓:生活如歌

可以直接呼叫,但這樣中斷服務程式和普通子程式沒什麼區別了吧。

9樓:匿名使用者

呼叫可以,但是如果有堆疊操作的話,可能會破壞程式的執行效果。

如果主程式呼叫中斷程式時,中斷在呼叫的話會怎樣??

c51中有克遞迴呼叫的函式。但**也比較大。記憶體佔用多,似乎不太合算。

在微控制器中子程式與中斷服務程式的異同點。

10樓:匿名使用者

相似點:

⑴ 都是中斷當前正在執行的程式,都要通過執行返回指令,返回到原來的程式。

⑵ 都是由硬體自動地把斷點地址壓入堆疊;當執行到返回指令時,自動彈出斷點地址以便返回原來的程式。

⑶都要通過軟體完成現場保護和現場恢復。

⑷ 都可以實現巢狀。

11樓:焦水淼

中斷是微控制器的一個重要功能,中斷子程式專為執行中斷功能,它是在發生中斷後,自動執行的,不需要主程式呼叫;普通子函式要主程式呼叫才能執行。

彙編裡的區別:

普通子函式用ret返回;中斷子程式用reti返回,reti返回時要清除中斷標誌的;

普通子函式呼叫時直接進入函式入口地址,中斷函式在中斷髮生時先進中斷入口

03h、08h、13h、18h、23h後隨即寫一個跳轉指令,再跳轉到相應語句。

c語言區別:

普通子函式用的是c語言裡的主函式呼叫子函式的方法,子函式可以有引數,有返回值;中斷函式沒有引數,沒有返回值;

12樓:匿名使用者

差別:⑴ 中斷請求訊號可以由外部裝置發出,是隨機的;子程式呼叫卻是由軟體編排好的。

⑵ 中斷響應後由固定的向量地址轉入中斷服務程式,而子程式地址由軟體設定。

⑶ 中斷響應是受控的,其響應時間會受一些因素影響;子程式響應時間是固定的。

mcs51微控制器,中斷服務程式的返回指令和子程式的返回指令有什麼區別?是多少?

13樓:

中斷服務程式的返回指令 彙編助記符 reti 機器指令 32h

子程式的返回指令 彙編助記符 ret 機器指令 22h

14樓:馬洋陌越

ret用於

一般程式的返回

reti用於中斷函式的返回

以上是一般微控制器書籍簡紹的,然而在實際應用中,我發現,在程式返回中一樣可以使用reti,而在中斷返回中卻無法使用ret,究其原因是因為reti比ret多做一件事情就是將「優先順序生效」觸發器清零

原來在8051構架中--中斷系統中含有兩個不可定址的「優先順序生效」觸發器。一個用於指出cpu是否正在執行高優先順序的中斷服務程式,這個觸發器為1時,系統將遮蔽所有的中斷請求;另一個則指出cpu是否正在執行低優先順序中斷服務程式,該觸發器為1時,將阻止除高優先順序以外的一切中斷請求。由此可見,若要響應同級甚至是低階中斷請求,必須使得該「優先順序生效」觸發器清零。

但該觸發器又是不可定址的,所以無法用軟體直接清零。」

c51微控制器中斷程式中的interrupt1,2,3是由什麼決定的

interrupt x是指用的第幾個中斷。1 2 3是由中斷向量表決定的。也就是由微控制器的中斷入口地址的順序決定的。這個是硬體決定的軟體不能改變。例如外部中斷0就是interrupt 0 定時器0 是interrupt 1 外部中斷1是interrupt 2 定時器2是interrupt 3 串列...

c51微控制器 中斷,c51微控制器如何使用中斷

這個程式是有問題的,第一次中斷時,x先賦值0再加一,x為1,第二次中斷時,又給x賦值0,這樣每次中斷都為1,不可能為2,也就不可能執行到b,建議用全域性變數可以解決這個問題。還有一個問題,一直在執行中斷程式,下一次中斷來臨時,為同級中斷,同級中斷是否能觸發,這個問題要考慮。解決辦法 a和b放在主程式...

51微控制器的中斷服務程式能否用主程式中的某一段代替

可以的,但是得判斷中斷標誌位,判斷有中斷時跳轉到reti,正常執行主程式時不跳轉。其實還不如把主程式寫兩遍,一個是不帶rei的主程式,一個是中斷服務程式,後面要加reti 舉個例子,假設你可以判斷tf0 中斷0的溢位標誌 000bh ajmp main1 0100h main main1 jb tf...