GNU ARM匯編--(五)中斷匯編之嵌套中斷處理
作者:
時(shí)間:2016-11-26
來(lái)源:網(wǎng)絡(luò)
收藏
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
代碼比較繁瑣,有幾點(diǎn)值得注意:在嵌套中斷處理中,壓棧后先保存INTOFFSET的值,再清中斷(SRCPND和INTPND).因?yàn)镾RCPND和INTPND清除后INTOFFSET就自動(dòng)清除了,所以要先保存.在中斷服務(wù)程序中,是可以用bl跳轉(zhuǎn)到各自的中斷服務(wù)程序的,比如blne blink1和blne blink3,值得對(duì)比的blink1和blink3,他們的不同在于blink1自己用代碼做了延時(shí),而blink3是調(diào)用bl delay做的延時(shí),那么這個(gè)時(shí)候要注意的就是lr的push和pop操作,不然lr就被覆蓋了,程序不能正確返回了.本文引用地址:http://m.butianyuan.cn/article/201611/321726.htm 注意了以上兩點(diǎn),程序上達(dá)到了嵌套處理的效果.因?yàn)椴捎玫氖窍陆颠呇赜|發(fā),而按鍵沒(méi)有防抖處理,有時(shí)候單按一個(gè)鍵就有嵌套中斷了.最后總結(jié)一下這種處理的優(yōu)缺點(diǎn):優(yōu)點(diǎn)是在為一個(gè)中斷處理服務(wù)完成前允許其它中斷,以縮短中斷延遲;而缺點(diǎn)是不處理中斷的優(yōu)先級(jí),因此低優(yōu)先級(jí)的中斷會(huì)阻塞高優(yōu)先級(jí)的中斷.
評(píng)論