GNU ARM汇编--(五)中断汇编之嵌套中断处理
作者:
时间:2016-11-26
来源:网络
收藏
ldrr0,=GPFCONldrr1,=0x2ea@0x2strr1,[r0]ldrr0,=EXTINT0@ldrr1,=0x8f888@0x0@0x8f888@~(7|(7<<4)|(7<<8)|(7<<16))ldrr1,=0xafaaastrr1,[r0]ldrr0,=EINTPENDldrr1,=0xf0@0b10000strr1,[r0]ldrr0,=EINTMASKldrr1,=0x00@0b00000strr1,[r0]ldrr0,=SRCPNDldrr1,=0xff@0x1@0b11111strr1,[r0]ldrr0,=INTPNDldrr1,=0xff@0x1@0b11111strr1,[r0]ldrr0,=INTMSKldrr1,=0xffffff00@0b00000strr1,[r0]MRSr1,cpsrBICr1,r1,#0x80MSRcpsr_c,r1blmainirq: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保存中断的offsetldrr10,[r10]ldrr0,=EINTPENDldrr1,=0xf0strr1,[r0]ldrr0,=SRCPNDldrr1,=0x3f@0b11111strr1,[r0]ldrr0,=INTPNDldrr1,=0x3f@0b11111strr1,[r0]@@@@@@@@@@@@@@mrsr2,SPSR@5:copySPSR_irqmovr0,sp@5:copysp_irqaddsp,sp,#6*4@5:resetstackmrsr1,CPSR@6:copyCPSRbicr1,r1,#Maskmd@6:orrr1,r1,#SVC32md@6:msrCPSR_c,r1@6:changeSVCmodesubsp,sp,#FRAME_SIZE-FRAME_R4@7:makestackspacestmiasp,{r4-r11}@7:saver4-r11ldmiar0,{r4-r9}@7:r4-r9IRQstackbicr1,r1,#I_Bit@8:msrCPSR_c,r1@8:enableintstmdbsp!,{r4-r7}@9:saver4-r7SVCstrr2,[sp,#FRAME_PSR]@9:savePSRstrr8,[sp,#FRAME_R12]@9:saver12strr9,[sp,#FRAME_PC]@9:savepcstrr14,[sp,#FRAME_LR]@9:savelr@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@cmpr10,#0x0bleqblink1cmpr10,#0x1bleqblink3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LDMIAsp!,{r0-r12,r14}@11:restorecontextMSRSPSR_cxsf,r14@11:restoreSPSRLDMIAsp!,{r14,pc}^@11:returndelay:ldrr3,=0xffffdelay1:subr3,r3,#1cmpr3,#0x0bnedelay1movpc,lrblink1:ldrr0,=GPBDATldrr1,=0x000strr1,[r0]ldrr3,=0xffffdelay2:subr3,r3,#1cmpr3,#0x0bnedelay2ldrr0,=GPBDATldrr1,=0x1f0strr1,[r0]ldrr3,=0xffffdelay3:subr3,r3,#1cmpr3,#0x0bnedelay3movpc,lrblink2:ldrr0,=GPBDATldrr1,=0x140strr1,[r0]ldrr3,=0xffffdelay12:subr3,r3,#1cmpr3,#0x0bnedelay12ldrr0,=GPBDATldrr1,=0xa0strr1,[r0]ldrr3,=0xffffdelay13:subr3,r3,#1cmpr3,#0x0bnedelay13movpc,lrblink3:ldrr0,=GPBDATldrr1,=0x0a0strr1,[r0]stmfdsp!,{lr}bldelayldrr0,=GPBDATldrr1,=0x140strr1,[r0]bldelayldmfdsp!,{lr}movpc,lrmain:ledloop:ldrr1,=0x1c0strr1,[r2]bldelayldrr1,=0x1a0strr1,[r2]bldelayldrr1,=0x160strr1,[r2]bldelayldrr1,=0x0e0strr1,[r2]bldelaybledloopundefined_instruction:nopsoftware_interrupt:nopprefetch_abort:nopdata_abort:nopnot_used:nopfiq:nop
代码比较繁琐,有几点值得注意:在嵌套中断处理中,压栈后先保存INTOFFSET的值,再清中断(SRCPND和INTPND).因为SRCPND和INTPND清除后INTOFFSET就自动清除了,所以要先保存.在中断服务程序中,是可以用bl跳转到各自的中断服务程序的,比如blne blink1和blne blink3,值得对比的blink1和blink3,他们的不同在于blink1自己用代码做了延时,而blink3是调用bl delay做的延时,那么这个时候要注意的就是lr的push和pop操作,不然lr就被覆盖了,程序不能正确返回了.本文引用地址:https://www.eepw.com.cn/article/201611/321726.htm 注意了以上两点,程序上达到了嵌套处理的效果.因为采用的是下降边沿触发,而按键没有防抖处理,有时候单按一个键就有嵌套中断了.最后总结一下这种处理的优缺点:优点是在为一个中断处理服务完成前允许其它中断,以缩短中断延迟;而缺点是不处理中断的优先级,因此低优先级的中断会阻塞高优先级的中断.
评论