新闻中心

EEPW首页>嵌入式系统>设计应用> GNU ARM汇编--(五)中断汇编之嵌套中断处理

GNU ARM汇编--(五)中断汇编之嵌套中断处理

作者: 时间:2016-11-26 来源:网络 收藏
  • ldrr0,=GPFCON
  • ldrr1,=0x2ea@0x2
  • strr1,[r0]
  • ldrr0,=EXTINT0
  • @ldrr1,=0x8f888@0x0@0x8f888@~(7|(7<<4)|(7<<8)|(7<<16))
  • ldrr1,=0xafaaa
  • 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:
  • 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就被覆盖了,程序不能正确返回了.

    本文引用地址: //m.amcfsurvey.com/article/201611/321726.htm

    注意了以上两点,程序上达到了嵌套处理的效果.因为采用的是下降边沿触发,而按键没有防抖处理,有时候单按一个键就有嵌套中断了.最后总结一下这种处理的优缺点:优点是在为一个中断处理服务完成前允许其它中断,以缩短中断延迟;而缺点是不处理中断的优先级,因此低优先级的中断会阻塞高优先级的中断.


    上一页 1 2 下一页

    关键词:ARM汇编中断汇编中断处

    评论


    相关推荐

    技术专区

    关闭