微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > GNU ARM汇编--(五)中断汇编之嵌套中断处理

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

时间:11-26 来源:互联网 点击:

  1. Cr1,r1,#0x80
  2. MSRcpsr_c,r1
  3. blmain
  4. irq:
  5. subr14,r14,#4@2:
  6. stmdbsp!,{r0-r3,r12,r14}@2:savecontext
  7. @
  8. @BLread_RescheduleFlag@3:moreprocessing
  9. @CMPr0,#0@3:ifprocessing?
  10. @LDMNEIAsp!,{r0-r3,r12,pc}^@4:thenreturn
  11. @@@@@@@@@@@@@@@@
  12. ldrr10,=INTOFFSET@用r10保存中断的offset
  13. ldrr10,[r10]
  14. ldrr0,=EINTPEND
  15. ldrr1,=0xf0
  16. strr1,[r0]
  17. ldrr0,=SRCPND
  18. ldrr1,=0x3f@0b11111
  19. strr1,[r0]
  20. ldrr0,=INTPND
  21. ldrr1,=0x3f@0b11111
  22. strr1,[r0]
  23. @@@@@@@@@@@@@@
  24. mrsr2,SPSR@5:copySPSR_irq
  25. movr0,sp@5:copysp_irq
  26. addsp,sp,#6*4@5:resetstack
  27. mrsr1,CPSR@6:copyCPSR
  28. bicr1,r1,#Maskmd@6:
  29. orrr1,r1,#SVC32md@6:
  30. msrCPSR_c,r1@6:changeSVCmode
  31. subsp,sp,#FRAME_SIZE-FRAME_R4@7:makestackspace
  32. stmiasp,{r4-r11}@7:saver4-r11
  33. ldmiar0,{r4-r9}@7:r4-r9IRQstack
  34. bicr1,r1,#I_Bit@8:
  35. msrCPSR_c,r1@8:enableint
  36. stmdbsp!,{r4-r7}@9:saver4-r7SVC
  37. strr2,[sp,#FRAME_PSR]@9:savePSR
  38. strr8,[sp,#FRAME_R12]@9:saver12
  39. strr9,[sp,#FRAME_PC]@9:savepc
  40. strr14,[sp,#FRAME_LR]@9:savelr
  41. @
  42. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  43. cmpr10,#0x0
  44. bleqblink1
  45. cmpr10,#0x1
  46. bleqblink3
  47. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  48. LDMIAsp!,{r0-r12,r14}@11:restorecontext
  49. MSRSPSR_cxsf,r14@11:restoreSPSR
  50. LDMIAsp!,{r14,pc}^@11:return
  51. delay:
  52. ldrr3,=0xffff
  53. delay1:
  54. subr3,r3,#1
  55. cmpr3,#0x0
  56. bnedelay1
  57. movpc,lr
  58. blink1:
  59. ldrr0,=GPBDAT
  60. ldrr1,=0x000
  61. strr1,[r0]
  62. ldrr3,=0xffff
  63. delay2:
  64. subr3,r3,#1
  65. cmpr3,#0x0
  66. bnedelay2
  67. ldrr0,=GPBDAT
  68. ldrr1,=0x1f0
  69. strr1,[r0]
  70. ldrr3,=0xffff
  71. delay3:
  72. subr3,r3,#1
  73. cmpr3,#0x0
  74. bnedelay3
  75. movpc,lr
  76. blink2:
  77. ldrr0,=GPBDAT
  78. ldrr1,=0x140
  79. strr1,[r0]
  80. ldrr3,=0xffff
  81. delay12:
  82. subr3,r3,#1
  83. cmpr3,#0x0
  84. bnedelay12
  85. ldrr0,=GPBDAT
  86. ldrr1,=0xa0
  87. strr1,[r0]
  88. ldrr3,=0xffff
  89. delay13:
  90. subr3,r3,#1
  91. cmpr3,#0x0
  92. bnedelay13
  93. movpc,lr
  94. blink3:
  95. ldrr0,=GPBDAT
  96. ldrr1,=0x0a0
  97. strr1,[r0]
  98. stmfdsp!,{lr}
  99. bldelay
  100. ldrr0,=GPBDAT
  101. ldrr1,=0x140
  102. strr1,[r0]
  103. bldelay
  104. ldmfdsp!,{lr}
  105. movpc,lr
  106. main:
  107. ledloop:
  108. ldrr1,=0x1c0
  109. strr1,[r2]
  110. bldelay
  111. ldrr1,=0x1a0
  112. strr1,[r2]
  113. bldelay
  114. ldrr1,=0x160
  115. strr1,[r2]
  116. bldelay
  117. ldrr1,=0x0e0
  118. strr1,[r2]
  119. bldelay
  120. bledloop
  121. undefined_instruction:
  122. nop
  123. software_interrupt:
  124. nop
  125. prefetch_abort:
  126. nop
  127. data_abort:
  128. nop
  129. not_used:
  130. nop
  131. fiq:
  132. nop


代码比较繁琐,有几点值得注意:在嵌套中断处理中,压栈后先保存INTOFFSET的值,再清中断(SRCPND和INTPND).因为SRCPND和INTPND清除后INTOFFSET就自动清除了,所以要先保存.在中断服务程序中,是可以用bl跳转到各自的中断服务程序的,比如blne blink1和blne blink3,值得对比的blink1和blink3,他们的不同在于blink1自己用代码做了延时,而blink3是调用bl delay做的延时,那么这个时候要注意的就是lr的push和pop操作,不然lr就被覆盖了,程序不能正确返回了.

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top