新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > GNU ARM匯編--(五)中斷匯編之嵌套中斷處理

GNU ARM匯編--(五)中斷匯編之嵌套中斷處理

作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
  • 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就自動清除了,所以要先保存.在中斷服務(wù)程序中,是可以用bl跳轉(zhuǎn)到各自的中斷服務(wù)程序的,比如blne blink1和blne blink3,值得對比的blink1和blink3,他們的不同在于blink1自己用代碼做了延時,而blink3是調(diào)用bl delay做的延時,那么這個時候要注意的就是lr的push和pop操作,不然lr就被覆蓋了,程序不能正確返回了.

    本文引用地址:http://butianyuan.cn/article/201611/321726.htm

    注意了以上兩點,程序上達到了嵌套處理的效果.因為采用的是下降邊沿觸發(fā),而按鍵沒有防抖處理,有時候單按一個鍵就有嵌套中斷了.最后總結(jié)一下這種處理的優(yōu)缺點:優(yōu)點是在為一個中斷處理服務(wù)完成前允許其它中斷,以縮短中斷延遲;而缺點是不處理中斷的優(yōu)先級,因此低優(yōu)先級的中斷會阻塞高優(yōu)先級的中斷.


    上一頁 1 2 下一頁

    關(guān)鍵詞: ARM匯編中斷匯編中斷處

    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉