GNU ARM汇编(五)中断汇编之嵌套中断处理
时间:11-20
来源:互联网
点击:
str r4, [r3] @ disable watchdog ldr r0, =GPBCONldr r1, =0x15400str r1, [r0]ldr r2, =GPBDATldr r1, =0x160str r1, [r2]bl delaymsr cpsr_c, #0xd2 @进入中断模式ldr sp, =0xc00 @中断模式的栈指针定义msr cpsr_c, #0xd3 @进入svc模式ldr sp, =0xfff @设置svc模式的栈指针@--------------------------------------------ldr r0, =GPBUPldr r1, =0x03f0 str r1, [r0] ldr r0, =GPFCONldr r1, =0x2ea@0x2 str r1, [r0] ldr r0, =EXTINT0@ldr r1, =0x8f888@0x0@0x8f888 @~(7|(7<4)|(7<8)|(7<16))ldr r1, =0xafaaastr r1, [r0] ldr r0, =EINTPENDldr r1, =0xf0@0b10000str r1, [r0] ldr r0, =EINTMASKldr r1, =0x00@0b00000str r1, [r0] ldr r0, =SRCPNDldr r1, =0xff@0x1@0b11111str r1, [r0] ldr r0, =INTPNDldr r1, =0xff@0x1@0b11111str r1, [r0] ldr r0, =INTMSKldr r1, =0xffffff00@0b00000str r1, [r0] MRS r1, cpsrBIC r1, r1, #0x80MSR cpsr_c, r1bl mainirq:sub r14,r14,#4 @ 2 :stmdb sp!,{r0-r3,r12,r14} @ 2 : save context@ @BL read_RescheduleFlag @ 3 : more processing@CMP r0,#0 @ 3 : if processing?@LDMNEIA sp!,{r0-r3,r12,pc}^ @ 4 : then return @@@@@@@@@@@@@@@@ldr r10,=INTOFFSET @用r10保存中断的offsetldr r10,[r10]ldr r0,=EINTPENDldr r1,=0xf0str r1,[r0] ldr r0, =SRCPNDldr r1, =0x3f@0b11111str r1, [r0] ldr r0, =INTPNDldr r1, =0x3f@0b11111str r1, [r0] @@@@@@@@@@@@@@mrs r2,SPSR @ 5 : copy SPSR_irqmov r0,sp @ 5 : copy sp_irqadd sp,sp,#6*4 @ 5 : reset stackmrs r1,CPSR @ 6 : copy CPSRbic r1,r1,#Maskmd @ 6 :orr r1,r1,#SVC32md @ 6 :msr CPSR_c,r1 @ 6 : change SVC modesub sp,sp,#FRAME_SIZE-FRAME_R4 @ 7 : make stack space stmia sp,{r4-r11} @ 7 : save r4-r11ldmia r0,{r4-r9} @ 7 : r4-r9 IRQ stack bic r1,r1,#I_Bit @ 8 : msr CPSR_c,r1 @ 8 : enable intstmdb sp!,{r4-r7} @ 9 : save r4-r7 SVCstr r2,[sp,#FRAME_PSR] @ 9 : save PSRstr r8,[sp,#FRAME_R12] @ 9 : save r12str r9,[sp,#FRAME_PC] @ 9 : save pc str r14,[sp,#FRAME_LR] @ 9 : save lr@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@cmp r10,#0x0bleq blink1cmp r10,#0x1bleq blink3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LDMIA sp!,{r0-r12,r14} @ 11 : restore contextMSR SPSR_cxsf,r14 @ 11 : restore SPSRLDMIA sp!,{r14,pc}^ @ 11 : returndelay:ldr r3,=0xffffdelay1:sub r3,r3,#1cmp r3,#0x0bne delay1mov pc,lrblink1:ldr r0, =GPBDATldr r1, =0x000str r1, [r0]ldr r3,=0xffffdelay2:sub r3,r3,#1cmp r3,#0x0bne delay2ldr r0, =GPBDATldr r1, =0x1f0str r1, [r0]ldr r3,=0xffffdelay3:sub r3,r3,#1cmp r3,#0x0bne delay3mov pc,lrblink2:ldr r0, =GPBDATldr r1, =0x140str r1, [r0]ldr r3,=0xffffdelay12:sub r3,r3,#1cmp r3,#0x0bne delay12ldr r0, =GPBDATldr r1, =0xa0str r1, [r0]ldr r3,=0xffffdelay13:sub r3,r3,#1cmp r3,#0x0bne delay13mov pc,lrblink3:ldr r0, =GPBDATldr r1, =0x0a0str r1, [r0]stmfd sp!,{lr}bl delayldr r0, =GPBDATldr r1, =0x140str r1, [r0]bl delayldmfd sp!,{lr}mov pc,lrmain:ledloop:ldr r1,=0x1c0str r1,[r2]bl delayldr r1,=0x1a0str r1,[r2]bl delayldr r1,=0x160str r1,[r2]bl delayldr r1,=0x0e0str r1,[r2]bl delayb ledloopundefined_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就被覆盖了,程序不能正确返回了.
代码比较繁琐,有几点值得注意:在嵌套中断处理中,压栈后先保存INTOFFSET的值,再清中断(SRCPND和INTPND).因为SRCPND和INTPND清除后INTOFFSET就自动清除了,所以要先保存.在中断服务程序中,是可以用bl跳转到各自的中断服务程序的,比如blne blink1和blne blink3,值得对比的blink1和blink3,他们的不同在于blink1自己用代码做了延时,而blink3是调用bl delay做的延时,那么这个时候要注意的就是lr的push和pop操作,不然lr就被覆盖了,程序不能正确返回了.
注意了以上两点,程序上达到了嵌套处理的效果.因为采用的是下降边沿触发,而按键没有防抖处理,有时候单按一个键就有嵌套中断了.最后总结一下这种处理的优缺点:优点是在为一个中断处理服务完成前允许其它中断,以缩短中断延迟;而缺点是不处理中断的优先级,因此低优先级的中断会阻塞高优先级的中断.
GNUARM汇编中断嵌套中断处 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)