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