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