新聞中心

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

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

        作者: 時間:2016-11-26 來源:網絡 收藏

        在寫這篇blog之前,不得不感慨一句:紙上得來終覺淺,絕知此事要躬行.作為EE出身的,雖然好久好久沒用匯編寫單片機的中斷了,但自我感覺對中斷的理解還是比較深入的,本以為在GNU ARM匯編下搞個中斷會很容易,誰知道斷斷續續花了我幾周.完全用匯編寫中斷和用c中的_irq寫中斷還是有區別的,誰用誰知道.還是那句話:深入細節是必須的,也是值得的.

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

        這一篇blog的理論知識主要來源于:《ARM System Developers Guide》.

        ARM的異常和相應的模式之間的對應關系見下表:

        當一個異常導致模式的改變時,內核自動地:

        1、把cpsr保存到相應模式下的spsr

        2、把pc保存到相應模式下的lr

        3、設置cpsr為相應異常模式

        4、設置pc為相應異常處理程序的入口地址

        從異常中斷處理程序返回包含下面兩個操作:

        1、從spsr_mode中恢復內容到cpsr中

        2、從lr_mode中恢復內容到pc中,返回到異常中斷的指令的下一條政令處執行.

        上面剛提到了異常發生時內核的一些動作,那對與IRQ或者FIQ而言,還多一項變化:禁用相關的中斷IRQ或FIQ,禁止同類型的其他中斷被觸發.

        對于最簡單的非嵌套中斷處理的處理流程如下:

        下面給出匯編代碼:

        [cpp]view plaincopy
        1. /*
        2. simpleinterruption
        3. copyleft@dndxhej@gmail.com
        4. */
        5. .equNOINT,0xc0
        6. .equWTCON,0x53000000
        7. .equGPBCON,0x56000010@led
        8. .equGPBDAT,0x56000014@led
        9. .equGPBUP,0x56000018@led
        10. .equGPFCON,0x56000050@interruptconfig
        11. .equEINTMASK,0x560000a4
        12. .equEXTINT0,0x56000088
        13. .equEXTINT1,0x5600008c
        14. .equEXTINT2,0x56000090
        15. .equINTMSK,0x4A000008
        16. .equEINTPEND,0x560000a8
        17. .equINTSUBMSK,0X4A00001C
        18. .equSRCPND,0X4A000000
        19. .equINTPND,0X4A000010
        20. .global_start
        21. _start:breset
        22. ldrpc,_undefined_instruction
        23. ldrpc,_software_interrupt
        24. ldrpc,_prefetch_abort
        25. ldrpc,_data_abort
        26. ldrpc,_not_used
        27. @birq
        28. ldrpc,_irq
        29. ldrpc,_fiq
        30. _undefined_instruction:.wordundefined_instruction
        31. _software_interrupt:.wordsoftware_interrupt
        32. _prefetch_abort:.wordprefetch_abort
        33. _data_abort:.worddata_abort
        34. _not_used:.wordnot_used
        35. _irq:.wordirq
        36. _fiq:.wordfiq
        37. .balignl16,0xdeadbeef
        38. reset:
        39. ldrr3,=WTCON
        40. movr4,#0x0
        41. strr4,[r3]@disablewatchdog
        42. ldrr0,=GPBCON
        43. ldrr1,=0x15400
        44. strr1,[r0]
        45. ldrr2,=GPBDAT
        46. ldrr1,=0x160
        47. strr1,[r2]
        48. bldelay
        49. msrcpsr_c,#0xd2@進入中斷模式
        50. ldrsp,=3072@中斷模式的棧指針定義
        51. msrcpsr_c,#0xdf@進入系統模式
        52. ldrsp,=4096@設置系統模式的棧指針
        53. @--------------------------------------------
        54. ldrr0,=GPBUP
        55. ldrr1,=0x03f0
        56. strr1,[r0]
        57. ldrr0,=GPFCON
        58. ldrr1,=0x2ea@0x2
        59. strr1,[r0]
        60. ldrr0,=EXTINT0
        61. ldrr1,=0x8f888@0x0@0x8f888@~(7|(7<<4)|(7<<8)|(7<<16))
        62. strr1,[r0]
        63. ldrr0,=EINTPEND
        64. ldrr1,=0xf0@0b10000
        65. strr1,[r0]
        66. ldrr0,=EINTMASK
        67. ldrr1,=0x00@0b00000
        68. strr1,[r0]
        69. ldrr0,=SRCPND
        70. ldrr1,=0xff@0x1@0b11111
        71. strr1,[r0]
        72. ldrr0,=INTPND
        73. ldrr1,=0xff@0x1@0b11111
        74. strr1,[r0]
        75. ldrr0,=INTMSK
        76. ldrr1,=0xffffff00@0b00000
        77. strr1,[r0]
        78. MRSr1,cpsr
        79. BICr1,r1,#0x80
        80. MSRcpsr_c,r1
        81. blmain
        82. irq:
        83. sublr,lr,#4
        84. stmfdsp!,{r0-r12,lr}
        85. blirq_isr
        86. ldmfdsp!,{r0-r12,pc}^
        87. irq_isr:

        88. 上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 启东市| 大石桥市| 马山县| 大英县| 大安市| 平南县| 宾川县| 达尔| 杂多县| 永川市| 政和县| 锡林浩特市| 凤台县| 拜泉县| 葵青区| 罗田县| 旅游| 鄄城县| 祥云县| 商都县| 淅川县| 绥德县| 黔东| 抚顺市| 阳新县| 宜章县| 台江县| 五家渠市| 陈巴尔虎旗| 璧山县| 高要市| 娄底市| 南平市| 萝北县| 西青区| 金沙县| 望江县| 辽源市| 安西县| 辰溪县| 承德市|