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

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

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

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

中斷向量

bHandlerIRQ;handler for IRQ interrupt

很自然,因?yàn)樗械膯纹瑱C(jī)都是那樣,中斷向量一般放在開頭,用過單片機(jī)的人都會(huì)很熟悉

那就不多說了。

異常服務(wù)程序

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

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

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

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

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

上面說的就是思路,跟著這個(gè)思路來(lái)接著分析。

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

HandlerIRQ HANDLER HandleIRQ

這里是一個(gè)宏定義,我們?cè)僬业竭@個(gè)宏,看他是怎么定義的:

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 將這個(gè)宏展開之后得到的結(jié)果實(shí)際是這樣的

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 還是一個(gè)標(biāo)號(hào),IRQ異常向量就是跳

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

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

真正的處理函數(shù)應(yīng)該是這個(gè) 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 ,^ 其實(shí)就是 MAP ,這段程序的意思是,從 _ISR_STARTADDRESS

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

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

這樣做的話就很靈活了

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

于是我們?cè)诮又恼业桨惭b句柄的語(yǔ)句

; 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對(duì)應(yīng)的地址里面,前面說了 HandleIRQ 放的是中斷處理的

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

IsrIRQ

subsp,sp,#4 ;reserved for PC

stmfdsp!,{r8-r9}

ldrr9,=INTOFFSET

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

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

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

ldrr8,[r8]

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

ldmfdsp!,{r8-r9,pc}

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

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

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

^ _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

.......

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

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

ldrr8,=HandleEINT0

addr8,r8,r9,lsl #2

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

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

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

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

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

放的就是函數(shù)指針?。?!下面再看看怎么跳轉(zhuǎn),繼續(xù)看 IsrIRQ 里面就實(shí)現(xiàn)了跳轉(zhuǎn)了

strr8,[sp,#8]

ldmfdsp!,{r8-r9,pc}

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

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

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

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

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

/src/keyscan.c 里面的代碼

很簡(jiǎn)單,里面只有3個(gè)函數(shù)

KeyScan_Test 是按鍵測(cè)試的主函數(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ù)的地址,注意了,是地址,這是一個(gè) U32型的變量。送到幾個(gè)變量,我們以pISR_EINT0

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

// Interrupt vector

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

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

^ _ISR_STARTADDRESS; _ISR_STARTADDRESS=0x33FF_FF00

HandleReset # 4

HandleUndef # 4

......

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

所以說到尾

pISR_EINT0 = (U32)Key_ISR;

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

HandleEINT0# 4

這個(gè)IRQ向量表里面?。。?!

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

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

bHandlerIRQ

然后是執(zhí)行

HandlerIRQ

sub

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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