在写这篇blog之前,不得不慨叹一句:纸上得来终觉浅,绝知此事要躬行.作为EE身世的,尽管良久良久没用汇编写单片机的中止了,但自我感觉对中止的了解仍是比较深化的,本以为在GNU ARM汇编下搞个中止会很简略,谁知道时断时续花了我几周.彻底用汇编写中止和用c中的_irq写中止仍是有差异的,谁用谁知道.仍是那句话:深化细节是有必要的,也是值得的.
这一篇blog的理论知识首要来源于:《ARM System Developers Guide》.
ARM的反常和相应的形式之间的对应联系见下表:
当一个反常导致形式的改动时,内核自动地:
1、把cpsr保存到相应形式下的spsr
2、把pc保存到相应形式下的lr
3、设置cpsr为相应反常形式
4、设置pc为相应反常处理程序的进口地址
从反常中止处理程序回来包括下面两个操作:
1、从spsr_mode中康复内容到cpsr中
2、从lr_mode中康复内容到pc中,回来到反常中止的指令的下一条政令处履行.
上面刚提到了反常产生时内核的一些动作,那对与IRQ或许FIQ而言,还多一项改变:禁用相关的中止IRQ或FIQ,制止同类型的其他中止被触发.
关于最简略的非嵌套中止处理的处理流程如下:
下面给出汇编代码:
[cpp]view plaincopy
- /*
- 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@进入中止形式
- ldrsp,=3072@中止形式的栈指针界说
- msrcpsr_c,#0xdf@进入体系形式
- ldrsp,=4096@设置体系形式的栈指针
- @——————————————–
- 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
- B%&&&&&%r1,r1,#0x80
- MSRcpsr_c,r1
- blmain
- irq:
- sublr,lr,#4
- stmfdsp!,{r0-r12,lr}
- blirq_isr
- ldmfdsp!,{r0-r12,pc}^
- irq_isr:
-
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/258070.html