用過GD32 MCU的小伙伴們都知道,程序是順序執行的,但當有中斷來的時候程序會跳轉到中斷函數,執行完中斷函數后程序又繼續回到原來的位置繼續執行,那么你們知道MCU是如何找到中斷函數入口的嗎?
今天我們就以GD32F303系列的EXTI0中斷來描述下MCU是如何進入中斷的。
首先來看一個簡單的代碼(以Keil為開發環境):
這段程序初始化了兩個LED燈,并將一個按鍵設置為中斷模式,這里用的是PA0,所以中斷號也為0,即EXTI0。
再來看一下中斷函數:
中斷函數也很簡單,當有中斷發生的時候,去翻轉一個LED燈狀態。
好,我們通過map文件看下這個中斷函數的地址在哪里(不會的小伙伴可以看看前面的視頻——《如果查看GD32 Keil和IAR工程的map文件》哦):
沒錯,中斷函數就保存在0x08000193開始的flash地址中,且該函數占用了24個byte的空間。
正常情況下,程序是不會跳轉到這個地址去執行的,那為什么中斷信號一來,程序就直接跳轉過去了呢?
下面重點來了,小伙伴們要仔細聽哦。
我們來看下GD32F30x系列的啟動文件:
其中用匯編寫了一段代碼:使用DCD指令(DCD指令是為特定的數據分配地址)將棧頂指針__initial_sp和中斷函數分配到flash最開始的地址中去,我們看下flash中的數據:
用紅框標注的數據就是程序的棧頂指針,再看下第23個地址也就是0x08000058保存的數據,就是0x08000193,剛好就是中斷函數EXTI0_IRQHandler的入口。
實際上,flash最開始保存的這一段數據有個專有名詞——中斷向量表,可以通過GD32F30x的用戶手冊查到:
注意:因為向量編號是從0開始的(0號即為棧頂指針),所以EXTI0的中斷編號為22,也就存在flash第23個地址(按字對齊)中。
當有EXTI0中斷發生,MCU會知道是22號中斷來了,內部總線就會去查flash最開始地址中的中斷向量表,找到第23個地址(0x08000058),并取得里面的數據也就是中斷函數的入口,然后就跳轉到中斷函數中執行程序了。
本期視頻內容會有點繞,小伙伴們可以多看幾遍哦,了解MCU是如何進入中斷函數對于平時的開發是非常有用的,如果有不懂的小伙伴,歡迎評論區留言討論哦。
-
單片機
+關注
關注
6032文章
44525瀏覽量
633258 -
mcu
+關注
關注
146文章
17019瀏覽量
350373 -
嵌入式
+關注
關注
5072文章
19026瀏覽量
303516 -
GD32
+關注
關注
7文章
403瀏覽量
24235
發布評論請先 登錄
相關推薦
評論