S3C2440中斷代碼的深層次分析
小結:
我們可以將ARM中采用2級向量表的形式實(shí)現異常的中斷處理,其中第一級是CPU中定義好的向量表,也就是異常向量表。在這一級的向量表中,實(shí)現跳轉到對應的異常公共處理函數,另外每一種異常問(wèn)題都存在自己的子問(wèn)題,這時(shí)候采用第二級的向量表就可以解決各種子問(wèn)題。第一級的向量表一般來(lái)說(shuō)都是CPU定義好的,而第二級向量表則是我們在程序設計中人工實(shí)現的。
5、那么又是如何得到C語(yǔ)言中的函數呢,實(shí)質(zhì)上已經(jīng)很簡(jiǎn)單了,具體的分析如下:
//S3c2440init.s
^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved# 4
HandleIRQ # 4
HandleFIQ # 4
這邊就可以看做第二級中斷向量表
;@0x33FF_FF20
HandleEINT0 # 4
HandleEINT1 # 4
…
HandleUART0 # 4
….
HandleSPI1 # 4
HandleRTC # 4
HandleADC # 4
_ISR_STARTADDRESS在s3c2440中是一個(gè)具體的地址值,這個(gè)地址值可以在option.h中找到。因此依據這個(gè)值我們就可以知道我們的二級向量表的實(shí)際位置,這種處理的方式存在一定的巧妙性,同時(shí)中斷地址的選擇也需要我們恰當的設置。這里的“^”其實(shí)就是 MAP,這段程序的意思是,從 _ISR_STARTADDRESS開(kāi)始,預留一個(gè)變量,每個(gè)變量一個(gè)標號,預留的空間為 4個(gè)字節,也就是 32BIT,其實(shí)這里放的是真正的C寫(xiě)的處理函數的地址,說(shuō)白了,就是函數指針,這樣做就很靈活了。
//option.h
#define _ISR_STARTADDRESS 0x33ffff00
同時(shí)在s3c2440addr.h中又可以找到下面的定義:
//s3c2440addr.h
// Exception vector(異常向量,不是CPU的異常向量)
#define pISR_RESET (*(unsigned *)(_ISR_STARTADDRESS+0x0))
#define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0x4))
#define pISR_SWI (*(unsigned *)(_ISR_STARTADDRESS+0x8))
#define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc))
#define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0x10))
#define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14))
#define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0x18))
#define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0x1c))
// Interrupt vector(中斷向量)
#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))
#define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x24))
#define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x28))
#define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x2c))
#define pISR_EINT4_7(*(unsigned *)(_ISR_STARTADDRESS+0x30))
…
#define pISR_SPI1 (*(unsigned *)(_ISR_STARTADDRESS+0x94))
#define pISR_RTC (*(unsigned *)(_ISR_STARTADDRESS+0x98))
#define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0x9c))
從上面的代碼中我們可以知道pISR_EINT0之類(lèi)的實(shí)質(zhì)上就是一個(gè)地址,如果我們在這個(gè)地址中填充處理函數的地址值也就形成了函數指針,實(shí)際上只需要將函數名賦值給對應的中斷向量即可。這樣也就找到了適當的處理方式.基本的形式如下所示:
Void main()
{
…
pISR_EINT0 = (U32)Button_ISR;
…
While(1)
{
…
}
}
/*中斷服務(wù)函數*/
static void _irq Button_ISR(void)
{
…
}
幾個(gè)分析的比較清晰的網(wǎng)址可以去看看:
http://blog.sina.com.cn/s/blog_8c134b590100yke9.html
http://hi.baidu.com/%C9%B3%BC%D3%BB%C6%BD%F0%CA%A5%B6%B7%CA%BF/blog/item/fbc56f137f475a085baf5334.html
總結:

問(wèn)題?在其中的代碼中,我并沒(méi)有看到返回地址的操作問(wèn)題,我找了很多的代碼,但是好像都不是特別的準確。也就是沒(méi)有找到對應的subs pc, lr, =0x04操作。
代碼中經(jīng)典的片段就是如何實(shí)現了代碼的跳轉問(wèn)題:
sub sp,sp, #0x04;為保存PC值預留空間
stmfd sp!,{r0};保存需要使用到的寄存器值,需要使用多少,就壓多少的堆棧
…//使用r0進(jìn)行相關(guān)的操作
ldr r0,[r0];
str r0, [sp,#0x04]; //這個(gè)操作類(lèi)似于函數調用中的問(wèn)題
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
關(guān)鍵詞:
S3C2440中斷代碼深層次分
相關(guān)推薦
技術(shù)專(zhuān)區
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機控制
- 藍牙
- PLC
- PWM
- 汽車(chē)電子
- 轉換器
- 電源管理
- 信號放大器
評論