GNU ARM汇编--(五)中断汇编之嵌套中断处理
时间:11-26
来源:互联网
点击:
- Cr1,r1,#0x80
- MSRcpsr_c,r1
- blmain
- irq:
- subr14,r14,#4@2:
- stmdbsp!,{r0-r3,r12,r14}@2:savecontext
- @
- @BLread_RescheduleFlag@3:moreprocessing
- @CMPr0,#0@3:ifprocessing?
- @LDMNEIAsp!,{r0-r3,r12,pc}^@4:thenreturn
- @@@@@@@@@@@@@@@@
- ldrr10,=INTOFFSET@用r10保存中断的offset
- ldrr10,[r10]
- ldrr0,=EINTPEND
- ldrr1,=0xf0
- strr1,[r0]
- ldrr0,=SRCPND
- ldrr1,=0x3f@0b11111
- strr1,[r0]
- ldrr0,=INTPND
- ldrr1,=0x3f@0b11111
- strr1,[r0]
- @@@@@@@@@@@@@@
- mrsr2,SPSR@5:copySPSR_irq
- movr0,sp@5:copysp_irq
- addsp,sp,#6*4@5:resetstack
- mrsr1,CPSR@6:copyCPSR
- bicr1,r1,#Maskmd@6:
- orrr1,r1,#SVC32md@6:
- msrCPSR_c,r1@6:changeSVCmode
- subsp,sp,#FRAME_SIZE-FRAME_R4@7:makestackspace
- stmiasp,{r4-r11}@7:saver4-r11
- ldmiar0,{r4-r9}@7:r4-r9IRQstack
- bicr1,r1,#I_Bit@8:
- msrCPSR_c,r1@8:enableint
- stmdbsp!,{r4-r7}@9:saver4-r7SVC
- strr2,[sp,#FRAME_PSR]@9:savePSR
- strr8,[sp,#FRAME_R12]@9:saver12
- strr9,[sp,#FRAME_PC]@9:savepc
- strr14,[sp,#FRAME_LR]@9:savelr
- @
- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- cmpr10,#0x0
- bleqblink1
- cmpr10,#0x1
- bleqblink3
- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- LDMIAsp!,{r0-r12,r14}@11:restorecontext
- MSRSPSR_cxsf,r14@11:restoreSPSR
- LDMIAsp!,{r14,pc}^@11:return
- delay:
- ldrr3,=0xffff
- delay1:
- subr3,r3,#1
- cmpr3,#0x0
- bnedelay1
- movpc,lr
- blink1:
- ldrr0,=GPBDAT
- ldrr1,=0x000
- strr1,[r0]
- ldrr3,=0xffff
- delay2:
- subr3,r3,#1
- cmpr3,#0x0
- bnedelay2
- ldrr0,=GPBDAT
- ldrr1,=0x1f0
- strr1,[r0]
- ldrr3,=0xffff
- delay3:
- subr3,r3,#1
- cmpr3,#0x0
- bnedelay3
- movpc,lr
- blink2:
- ldrr0,=GPBDAT
- ldrr1,=0x140
- strr1,[r0]
- ldrr3,=0xffff
- delay12:
- subr3,r3,#1
- cmpr3,#0x0
- bnedelay12
- ldrr0,=GPBDAT
- ldrr1,=0xa0
- strr1,[r0]
- ldrr3,=0xffff
- delay13:
- subr3,r3,#1
- cmpr3,#0x0
- bnedelay13
- movpc,lr
- blink3:
- ldrr0,=GPBDAT
- ldrr1,=0x0a0
- strr1,[r0]
- stmfdsp!,{lr}
- bldelay
- ldrr0,=GPBDAT
- ldrr1,=0x140
- strr1,[r0]
- bldelay
- ldmfdsp!,{lr}
- movpc,lr
- main:
- ledloop:
- ldrr1,=0x1c0
- strr1,[r2]
- bldelay
- ldrr1,=0x1a0
- strr1,[r2]
- bldelay
- ldrr1,=0x160
- strr1,[r2]
- bldelay
- ldrr1,=0x0e0
- strr1,[r2]
- bldelay
- bledloop
- undefined_instruction:
- nop
- software_interrupt:
- nop
- prefetch_abort:
- nop
- data_abort:
- nop
- not_used:
- nop
- fiq:
- nop
代码比较繁琐,有几点值得注意:在嵌套中断处理中,压栈后先保存INTOFFSET的值,再清中断(SRCPND和INTPND).因为SRCPND和INTPND清除后INTOFFSET就自动清除了,所以要先保存.在中断服务程序中,是可以用bl跳转到各自的中断服务程序的,比如blne blink1和blne blink3,值得对比的blink1和blink3,他们的不同在于blink1自己用代码做了延时,而blink3是调用bl delay做的延时,那么这个时候要注意的就是lr的push和pop操作,不然lr就被覆盖了,程序不能正确返回了.
注意了以上两点,程序上达到了嵌套处理的效果.因为采用的是下降边沿触发,而按键没有防抖处理,有时候单按一个键就有嵌套中断了.最后总结一下这种处理的优缺点:优点是在为一个中断处理服务完成前允许其它中断,以缩短中断延迟;而缺点是不处理中断的优先级,因此低优先级的中断会阻塞高优先级的中断.
ARM汇编中断汇编中断处 相关文章:
- GNU ARM汇编--(四)中断汇编之非嵌套中断处理(11-26)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)