新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GNU ARM匯編--(五)中斷匯編之嵌套中斷處理

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

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

      156. 代碼比較繁瑣,有幾點值得注意:在嵌套中斷處理中,壓棧后先保存INTOFFSET的值,再清中斷(SRCPND和INTPND).因為SRCPND和INTPND清除后INTOFFSET就自動清除了,所以要先保存.在中斷服務程序中,是可以用bl跳轉到各自的中斷服務程序的,比如blne blink1和blne blink3,值得對比的blink1和blink3,他們的不同在于blink1自己用代碼做了延時,而blink3是調用bl delay做的延時,那么這個時候要注意的就是lr的push和pop操作,不然lr就被覆蓋了,程序不能正確返回了.

        本文引用地址:http://www.104case.com/article/201611/321726.htm

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


        上一頁 1 2 下一頁

        關鍵詞: ARM匯編中斷匯編中斷處

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 平果县| 襄城县| 丹东市| 布拖县| 潢川县| 辽源市| 兴文县| 孙吴县| 增城市| 隆子县| 巴楚县| 东乌珠穆沁旗| 浦江县| 南宁市| 察隅县| 碌曲县| 昂仁县| 日土县| 通海县| 石首市| 孟州市| 海林市| 江华| 昆明市| 徐州市| 方山县| 盈江县| 南阳市| 铅山县| 乌拉特后旗| 棋牌| 崇州市| 长治县| 韶山市| 广宗县| 凤台县| 临邑县| 五指山市| 顺义区| 霍邱县| 普兰店市|