您的位置 首页 培训

GNU ARM汇编–(四)中止汇编之非嵌套中止处理

在写这篇blog之前,不得不感慨一句:纸上得来终觉浅,绝知此事要躬行作为EE出身的,虽然好久好久没用汇编写单片机的中断了,但自我感觉

在写这篇blog之前,不得不慨叹一句:纸上得来终觉浅,绝知此事要躬行.作为EE身世的,尽管良久良久没用汇编写单片机的中止了,但自我感觉对中止的了解仍是比较深化的,本以为在GNU ARM汇编下搞个中止会很简略,谁知道时断时续花了我几周.彻底用汇编写中止和用c中的_irq写中止仍是有差异的,谁用谁知道.仍是那句话:深化细节是有必要的,也是值得的.

这一篇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. B%&&&&&%r1,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:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/258070.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部