日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]這個 2440test里面的中斷寫的向量有些隱蔽,兜了很多個圈,也難怪這么難理解,下面就對這個東西抽絲剝繭,看清楚這究竟是一個怎么樣的過程。中斷向量bHandlerIRQ;handler for IRQ interrupt很自然,因為所有的單片機

這個 2440test里面的中斷寫的向量有些隱蔽,兜了很多個圈,也難怪這么難理解,下面

就對這個東西抽絲剝繭,看清楚這究竟是一個怎么樣的過程。

中斷向量

bHandlerIRQ;handler for IRQ interrupt

很自然,因為所有的單片機都是那樣,中斷向量一般放在開頭,用過單片機的人都會很熟悉

那就不多說了。

異常服務(wù)程序

這里不用中斷(interrupt)而用異常(exception),畢竟中斷只是異常的一種情況,呵呵

下面主要分析的是“中斷異?!闭f白了,就是我們平時單片機里面用的中斷?。?!所有有器件

引起的中斷,例如TIMER中斷,UART中斷,外部中斷等等,都有一個統(tǒng)一的入口,那就是中斷

異常 IRQ ! 然后從IRQ的服務(wù)函數(shù)里面分辨出,當(dāng)前究竟是什么中斷,再跳轉(zhuǎn)到相應(yīng)的中斷

服務(wù)程序。這樣看來,ARM比單片機要復(fù)雜一些了,不過原理是不變的。

上面說的就是思路,跟著這個思路來接著分析。

HandlerIRQ 很明顯是一個標(biāo)號,我們找到了

HandlerIRQ HANDLER HandleIRQ

這里是一個宏定義,我們再找到這個宏,看他是怎么定義的:

MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

subsp,sp,#4;decrement sp(to store jump address)

stmfdsp!,{r0};PUSH the work register to stack(lr does not push because it return to original

address)

ldr r0,=$HandleLabel ;load the address of HandleXXX to r0

ldr r0,[r0];load the contents(service routine start address) of HandleXXX

str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

MEND

用 HandlerIRQ 將這個宏展開之后得到的結(jié)果實際是這樣的

HandlerIRQ

subsp,sp,#4;decrement sp(to store jump address)

stmfdsp!,{r0};PUSH the work register to stack(lr does not push because it return to original

address)

ldr r0,=HandleIRQ ;load the address of HandleXXX to r0

ldr r0,[r0];load the contents(service routine start address) of HandleXXX

str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

至于具體的跳轉(zhuǎn)原理下面再說

好了,這樣的話就容易看的多了,很明顯,HandlerIRQ 還是一個標(biāo)號,IRQ異常向量就是跳

轉(zhuǎn)到這里執(zhí)行的,這里粗略看一下,應(yīng)該是保存現(xiàn)場,然后跳轉(zhuǎn)到真正的處理函數(shù),那么很容易

發(fā)現(xiàn)了這么一句 ldr r0,=HandleIRQ ,沒錯,我們又找到了一個標(biāo)號 HandleIRQ ,看來

真正的處理函數(shù)應(yīng)該是這個 HandleIRQ ,繼續(xù)尋找

AREA RamData, DATA, READWRITE

^ _ISR_STARTADDRESS; _ISR_STARTADDRESS=0x33FF_FF00

HandleReset # 4

HandleUndef # 4

HandleSWI# 4

HandlePabort # 4

HandleDabort # 4

HandleReserved # 4

HandleIRQ# 4

最后我們發(fā)現(xiàn)在這里找到了 HandleIRQ ,^ 其實就是 MAP ,這段程序的意思是,從 _ISR_STARTADDRESS

開始,預(yù)留一個變量,每個變量一個標(biāo)號,預(yù)留的空間為 4個字節(jié),也就是 32BIT,其實這里放的是真正

的C寫的處理函數(shù)的地址,說白了,就是函數(shù)指針 - -

這樣做的話就很靈活了

接著,我們需要安裝IRQ處理句柄,說白了,就是設(shè)置處理函數(shù)的地址,讓PC指針可以正確的跳轉(zhuǎn)。

于是我們在接著的找到安裝句柄的語句

; Setup IRQ handler

ldrr0,=HandleIRQ ;This routine is needed

ldrr1,=IsrIRQ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c

strr1,[r0]

說白了就是將 IsrIRQ 的地址填到 HandleIRQ對應(yīng)的地址里面,前面說了 HandleIRQ 放的是中斷處理的

函數(shù)的入口地址,我們繼續(xù)找 IsrIRQ

IsrIRQ

subsp,sp,#4 ;reserved for PC

stmfdsp!,{r8-r9}

ldrr9,=INTOFFSET

ldrr9,[r9];讀入中斷偏移碼

ldrr8,=HandleEINT0;二級跳轉(zhuǎn)表的首地址

addr8,r8,r9,lsl #2;R8=R8+R9X4得到相應(yīng)的中斷入口地址

ldrr8,[r8]

strr8,[sp,#8];中斷入口地址送進SP(第一個代碼留出的4字節(jié)空間)

ldmfdsp!,{r8-r9,pc}

要理解這個代碼,得先學(xué)學(xué)2440的中斷系統(tǒng)了,INTOFFSET存放的是當(dāng)前中斷的偏移號,根據(jù)偏移就知道

當(dāng)前是哪個中斷源發(fā)生的中斷。

注意了,我們說的是中斷,而不是異常,看看原來的表是啥樣子的

^ _ISR_STARTADDRESS; _ISR_STARTADDRESS=0x33FF_FF00

HandleReset # 4

HandleUndef # 4

HandleSWI# 4

HandlePabort # 4

HandleDabort # 4

HandleReserved # 4

HandleIRQ# 4

HandleFIQ# 4

HandleEINT0# 4

HandleEINT1# 4

HandleEINT2# 4

HandleEINT3# 4

.......

可以看到,前面幾個是異常,從 HandleEINT0 就是 IRQ異常的向量存放的地方了,這樣就可以理解為

什么上面 IsrIRQ 里面里面要執(zhí)行那條指令

ldrr8,=HandleEINT0

addr8,r8,r9,lsl #2

道理很簡單, HandleEINT0 就是所有IRQ中斷向量表的入口,在這個地址上面,加上一個適當(dāng)?shù)钠屏浚?/p>

INTOFFSET ,那么我們知道現(xiàn)在,到底是哪個IRQ在申請中斷了。

至于具體怎么跳轉(zhuǎn)的?

首先,我們說了,HandleEINT0 開始的一段內(nèi)存里面,存放的就是中斷服務(wù)函數(shù)的函數(shù)指針,ARM的體系

的話,每個指針變量就是占4個字節(jié),這里就解釋了,為什么這里為每個標(biāo)號分配了4個字節(jié)的空間,里面

放的就是函數(shù)指針!?。∠旅嬖倏纯丛趺刺D(zhuǎn),繼續(xù)看 IsrIRQ 里面就實現(xiàn)了跳轉(zhuǎn)了

strr8,[sp,#8]

ldmfdsp!,{r8-r9,pc}

其實最核心就是這兩句了,先查找到當(dāng)前中斷服務(wù)程序的地址,將他放到 R8 里面,然后出棧,彈出給PC

那么PC很自然就跳到中斷服務(wù)程序了。至于這里的堆棧問題又是一個非常棘手的,需要好好的參透ARM的

中斷架構(gòu),需要了解的可以自己仔細(xì)的閱讀 《ARM體系結(jié)構(gòu)與編程》里面說的很詳細(xì)。我們這里的重點

是研究怎么跳轉(zhuǎn)。

最后,我們看看在C代碼中是怎么安裝終端向量的,例如看 按鍵的外部中斷,是怎么具體設(shè)置的,參看

/src/keyscan.c 里面的代碼

很簡單,里面只有3個函數(shù)

KeyScan_Test 是按鍵測試的主函數(shù)

Key_ISR 是按鍵中斷服務(wù)函數(shù)

在 KeyScan_Test里面,我們發(fā)現(xiàn)了有這么一句

pISR_EINT0 = pISR_EINT2 = pISR_EINT8_23 = (U32)Key_ISR;

可以理解否? Key_ISR就是上面提到的按鍵中斷服務(wù)函數(shù),函數(shù)的名字,代表的就是函數(shù)的地址!?。?!

將中斷服務(wù)函數(shù)的地址,注意了,是地址,這是一個 U32型的變量。送到幾個變量,我們以pISR_EINT0

作為例子,查看頭文件定義,在 2440addr.h 里面找到

// Interrupt vector

#define pISR_EINT0(*(unsigned *)(_ISR_STARTADDRESS+0x20))

_ISR_STARTADDRESS有沒有似曾相識的感覺?沒錯,剛才分析的匯編代碼里面就提到了

^ _ISR_STARTADDRESS; _ISR_STARTADDRESS=0x33FF_FF00

HandleReset # 4

HandleUndef # 4

......

對,地址就是這里,然后 _ISR_STARTADDRESS+0x20 就是跳過前面的異常向量,進入IRQ中斷向量的入口

所以說到尾

pISR_EINT0 = (U32)Key_ISR;

完成的操作就是,將 Key_ISR 的地址存放到

HandleEINT0# 4

這個IRQ向量表里面?。。?!

當(dāng)按鍵中斷發(fā)生的時候,發(fā)生IRQ異常中斷

當(dāng)前PC值-4 保存到LR_IRQ里面,然后執(zhí)行

bHandlerIRQ

然后是執(zhí)行

HandlerIRQ

sub

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在ARM架構(gòu)中,中斷處理是一個關(guān)鍵機制,它允許CPU在執(zhí)行主程序時能夠響應(yīng)外部或內(nèi)部的事件。對于ARM MCU(微控制器單元)而言,中斷處理程序入口通常分為兩類:ARM保留的標(biāo)準(zhǔn)中斷處理程序入口和外設(shè)中斷處理程序入口。

關(guān)鍵字: ARM 中斷處理

中斷裝置和中斷處理程序統(tǒng)稱為中斷系統(tǒng)。中斷系統(tǒng)是計算機的重要組成部分。實時控制、故障自動處理、計算機與外圍設(shè)備間的數(shù)據(jù)傳送往往采用中斷系統(tǒng)。

關(guān)鍵字: CPU 中斷處理 自動處理

STM32Cube HAL出來六七年了,還是有很多初學(xué)者沒有適應(yīng),今天就分享一個讀者問到的關(guān)于中斷處理的問題。

關(guān)鍵字: 中斷處理 回調(diào)函數(shù)

在介紹2410的中斷處理之前,我們不得不先看看先把ARM的異常向量表(Exception Vectors),下面對異常向量表(Exception Vectors),做一個簡單的介紹: ARM的異常向量表一般存放在0x...

關(guān)鍵字: s3c2410 中斷處理

幾個基本概念:?1.ARM?cortex_m3?內(nèi)核支持?256?個中斷(16?個內(nèi)核+240?外部)和可編程?256?級中斷優(yōu)先級的設(shè)置,與其相關(guān)的中斷控制和中斷優(yōu)先級控制寄存器(NVIC、SYST

關(guān)鍵字: 中斷處理 中斷控制器

ARM有七種模式,我們這里只討論SVC、IRQ和FIQ模式。 我們可以假設(shè)ARM核心有兩根中斷引腳(實際上是看不見的),一根叫 irq pin, 一根叫fiq pin. 在ARM的cpsr中,有一個I位和一個F位,分別用...

關(guān)鍵字: ARM 中斷處理 中斷控制器

中斷:中斷是一種使CPU中止正在執(zhí)行的程序而轉(zhuǎn)去處理特殊事件的操作,這些引起中斷的事件稱為中斷源,它們可能是來自外設(shè)的輸入輸出請求,也可能是計算機的一些異常事故或其它內(nèi)部原因。中斷處理程序:當(dāng)中斷發(fā)生時,

關(guān)鍵字: 中斷 中斷處理

STM32的USB雙緩存接收代碼其實已經(jīng)可以在ST提供的USB示例代碼中找到,只要稍加修改,就可以得到將近1MB的數(shù)據(jù)接收性能。雖然Datasheet中說明USB發(fā)送也同樣可以使用雙緩存,但并沒有示例代碼,由于為了測試性...

關(guān)鍵字: STM32 USB 中斷處理 雙緩存

單片機中的中斷系統(tǒng)對電子工程師來說是解決突發(fā)事件和多任務(wù)實時處理的最好方法,熟練掌握中斷技術(shù)的應(yīng)用是一個合格電子工程師必備的能力。 PIC與51系列單片機一個顯著的區(qū)別就是:PIC只有一個中斷入口地址(為04

關(guān)鍵字: pic系列 中斷處理 單片機 注意事項

中斷函數(shù)注意如下:(1)中斷函數(shù)不能進行參數(shù)傳遞,如果中斷函數(shù)中包含任何參數(shù)聲明都將導(dǎo)致編譯出錯。(2)中斷函數(shù)沒有返回值,如果企圖定義一個返回值將得不到正確的結(jié)果,建議在定義中斷函數(shù)時將其定義為void類

關(guān)鍵字: keil51 中斷處理
關(guān)閉