GNU ARM匯編--(四)中斷匯編之非嵌套中斷處理
在寫(xiě)這篇blog之前,不得不感慨一句:紙上得來(lái)終覺(jué)淺,絕知此事要躬行.作為EE出身的,雖然好久好久沒(méi)用匯編寫(xiě)單片機(jī)的中斷了,但自我感覺(jué)對(duì)中斷的理解還是比較深入的,本以為在GNU ARM匯編下搞個(gè)中斷會(huì)很容易,誰(shuí)知道斷斷續(xù)續(xù)花了我?guī)字?完全用匯編寫(xiě)中斷和用c中的_irq寫(xiě)中斷還是有區(qū)別的,誰(shuí)用誰(shuí)知道.還是那句話(huà):深入細(xì)節(jié)是必須的,也是值得的.
本文引用地址:http://butianyuan.cn/article/201611/321727.htm這一篇blog的理論知識(shí)主要來(lái)源于:《ARM System Developers Guide》.
ARM的異常和相應(yīng)的模式之間的對(duì)應(yīng)關(guān)系見(jiàn)下表:
當(dāng)一個(gè)異常導(dǎo)致模式的改變時(shí),內(nèi)核自動(dòng)地:
1、把cpsr保存到相應(yīng)模式下的spsr
2、把pc保存到相應(yīng)模式下的lr
3、設(shè)置cpsr為相應(yīng)異常模式
4、設(shè)置pc為相應(yīng)異常處理程序的入口地址
從異常中斷處理程序返回包含下面兩個(gè)操作:
1、從spsr_mode中恢復(fù)內(nèi)容到cpsr中
2、從lr_mode中恢復(fù)內(nèi)容到pc中,返回到異常中斷的指令的下一條政令處執(zhí)行.
上面剛提到了異常發(fā)生時(shí)內(nèi)核的一些動(dòng)作,那對(duì)與IRQ或者FIQ而言,還多一項(xiàng)變化:禁用相關(guān)的中斷IRQ或FIQ,禁止同類(lèi)型的其他中斷被觸發(fā).
對(duì)于最簡(jiǎn)單的非嵌套中斷處理的處理流程如下:
下面給出匯編代碼:
- /*
- simpleinterruption
- copyleft@dndxhej@gmail.com
- */
- .equNOINT,0xc0
- .equWTCON,0x53000000
- .equGPBCON,0x56000010@led
- .equGPBDAT,0x56000014@led
- .equGPBUP,0x56000018@led
- .equGPFCON,0x56000050@interruptconfig
- .equEINTMASK,0x560000a4
- .equEXTINT0,0x56000088
- .equEXTINT1,0x5600008c
- .equEXTINT2,0x56000090
- .equINTMSK,0x4A000008
- .equEINTPEND,0x560000a8
- .equINTSUBMSK,0X4A00001C
- .equSRCPND,0X4A000000
- .equINTPND,0X4A000010
- .global_start
- _start:breset
- ldrpc,_undefined_instruction
- ldrpc,_software_interrupt
- ldrpc,_prefetch_abort
- ldrpc,_data_abort
- ldrpc,_not_used
- @birq
- ldrpc,_irq
- ldrpc,_fiq
- _undefined_instruction:.wordundefined_instruction
- _software_interrupt:.wordsoftware_interrupt
- _prefetch_abort:.wordprefetch_abort
- _data_abort:.worddata_abort
- _not_used:.wordnot_used
- _irq:.wordirq
- _fiq:.wordfiq
- .balignl16,0xdeadbeef
- reset:
- ldrr3,=WTCON
- movr4,#0x0
- strr4,[r3]@disablewatchdog
- ldrr0,=GPBCON
- ldrr1,=0x15400
- strr1,[r0]
- ldrr2,=GPBDAT
- ldrr1,=0x160
- strr1,[r2]
- bldelay
- msrcpsr_c,#0xd2@進(jìn)入中斷模式
- ldrsp,=3072@中斷模式的棧指針定義
- msrcpsr_c,#0xdf@進(jìn)入系統(tǒng)模式
- ldrsp,=4096@設(shè)置系統(tǒng)模式的棧指針
- @--------------------------------------------
- ldrr0,=GPBUP
- ldrr1,=0x03f0
- strr1,[r0]
- ldrr0,=GPFCON
- ldrr1,=0x2ea@0x2
- strr1,[r0]
- ldrr0,=EXTINT0
- ldrr1,=0x8f888@0x0@0x8f888@~(7|(7<<4)|(7<<8)|(7<<16))
- strr1,[r0]
- ldrr0,=EINTPEND
- ldrr1,=0xf0@0b10000
- strr1,[r0]
- ldrr0,=EINTMASK
- ldrr1,=0x00@0b00000
- strr1,[r0]
- ldrr0,=SRCPND
- ldrr1,=0xff@0x1@0b11111
- strr1,[r0]
- ldrr0,=INTPND
- ldrr1,=0xff@0x1@0b11111
- strr1,[r0]
- ldrr0,=INTMSK
- ldrr1,=0xffffff00@0b00000
- strr1,[r0]
- MRSr1,cpsr
- BICr1,r1,#0x80
- MSRcpsr_c,r1
- blmain
- irq:
- sublr,lr,#4
- stmfdsp!,{r0-r12,lr}
- blirq_isr
- ldmfdsp!,{r0-r12,pc}^
- irq_isr:
-
相關(guān)推薦
技術(shù)專(zhuān)區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車(chē)電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論