找回密码
 注册
关于网站域名变更的通知
查看: 370|回复: 1
打印 上一主题 下一主题

ARM体系结构与编程学习(13)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-2-20 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

( n" J9 t2 n3 u1 f7 W9.5 FIQ与IRQ异常中断处理程序4 F$ R! Z6 k1 V( m

7 q# i! @2 p3 u( v% F/ D2 F( tARM提供的FIQ与IRQ用于外部设备向CPU请求中断。
6 E+ q% Q8 T! Y1 q" S* \
1 Q4 Z: O( L  m/ @7 `; h2 }9.5.1 不可重入的IRQ/FIQ异常中断处理程序
$ t9 ^1 ?- P' R0 Y1 K
# P# A; Q4 I0 m8 \# |  d; A;使用关键词_irq
0 M" J! j1 {" u, v' e; P  q, o/ L' b
__irq void IRQHandler (void)7 C9 U0 j% o2 O2 L/ P
{
5 B2 n9 k4 @  g" A' R2 Y    volatile unsigned int *base = (unsigned int *) 0x80000000;; z1 `9 s" v1 _* }0 A7 b

8 D4 r  y3 E7 q* |  @$ T7 R    if (*base == 1)          // which interrupt was it?
. P8 P0 M% W, A0 Q    {
) m) f- y2 j9 W  G9 F        C_int_handler();     // process the interrupt0 ]" ~  d- _4 Y; K- u: q
    }# ~9 d/ K3 V! \* @/ }( x2 I
    *(base+1) = 0;           // clear the interrupt! _' _1 v; L6 H" l0 Y6 j2 h$ h
}$ ~6 V. Y. |4 W& x+ G% `

" Q. g# S0 L( ]7 F/ q( ]: n;对应的汇编程序
; q. X8 V2 P" x
+ q5 l+ I0 p* |6 OIRQHandler PROC
% e$ J* \% T$ r* N5 G) N# T        STMFD    sp!,{r0-r4,r12,lr}0 l/ h5 V7 |7 U3 x
        MOV      r4,#0x80000000
; }2 ?. N6 F8 @+ j        LDR      r0,[r4,#0], v4 h1 L: p" {/ v8 G
        SUB      sp,sp,#4, B+ n4 R, ~* L  [  w
        CMP      r0,#1
1 S3 p* T/ c0 E1 x        BLEQ     C_int_handler
" j* H( ^4 P1 B! _# r$ N        MOV      r0,#0
: f  v& C- Z/ m        STR      r0,[r4,#4], ^5 k1 l% |8 K$ f& r7 k4 K
        ADD      sp,sp,#4
1 Y  q' g  t+ {5 u0 X5 Q. o- l        LDMFD    sp!,{r0-r4,r12,lr}
6 w/ _/ o* d& v( B/ w* j% \6 i" C        SUBS     pc,lr,#4
5 ?9 U$ i3 g- G$ Z$ h' b        ENDP+ P6 s: Z. ?- f( h+ o

2 T1 e5 y2 z3 E1 v: ]2 B;不使用关键词_irq
8 Z/ J: ^- C5 a0 D$ [
/ `# G: @; U' o2 e: `6 |4 `% Lvoid IRQHandler (void)
2 v9 v; o# V7 `* S{
$ s/ j- ~; _# P+ }0 H    volatile unsigned int *base = (unsigned int *) 0x80000000;. }3 z9 `* z3 }1 C5 N. F

5 m) i. W3 C5 W: T2 t6 @    if (*base == 1)          // which interrupt was it?& c! U* }+ H' k6 y1 G" x1 a% O
    {
1 Q7 F% O0 F3 t' k$ I" o! p1 y        C_int_handler();     // process the interrupt
# J3 V/ B9 ], V7 k    }
4 I; U, ]7 E, |# X) _/ L1 @) Y    *(base+1) = 0;           // clear the interrupt
; b# \/ }/ B' D0 {4 y% c- I3 P}+ |" `- N" W! N$ V% \
" T. g+ w# O9 C( P5 W7 X+ ^/ U
;对应的汇编程序
7 a; u+ j" o& z  a$ T, \- l' |  ^
IRQHandler PROC
! e8 t$ X+ T* J4 K1 T0 q2 T        STMFD    sp!,{r4,lr}# M' @; C, A& F- c
        MOV      r4,#0x80000000
0 N! L0 e5 v3 L! s        LDR      r0,[r4,#0]
% m# N1 A# N1 [4 j        CMP      r0,#1( v5 p) f5 h2 h" a4 z
        BLEQ     C_int_handler5 \6 s! _. J1 v% Y8 r  ]
        MOV      r0,#0/ t5 V5 X7 J6 R
        STR      r0,[r4,#4]1 z* Y, \) |# z" ?2 u8 s  R
        LDMFD    sp!,{r4,pc}
/ ~3 d$ H4 K: }7 V. |        END
9 Q9 Y2 c+ ], h8 P' e7 O4 F7 q  E0 H3 t; b" b5 ^* L
可重入的IRQ/FIQ异常中断处理程序  I8 C" N7 `- m' n

6 p3 u" S3 D  u, O' ?6 e1 Y& F. ]# \1、将返回地址保存到IRQ的数据栈中) E6 v; V3 G# L8 i, n1 @3 c& y

6 ~' o$ g5 F6 ?# E/ f- \0 N8 R2、保存工作寄存器和SPSR_irq4 f7 y; u; O  P3 U

: G5 Y2 H$ @2 D8 @6 z3、清除中断标志位
) S" U1 c# M$ l$ W% \. n: e* W8 Y$ Y9 T
4、将处理器切换到系统模式,重新使能IRQ/FIQ中断6 f; ^# j+ [1 p6 K0 i" k+ o
5 T% c5 p. W1 s! g7 p. b0 T
5、保存用户模式的LR寄存器和被调用程序不保存的寄存器
' P9 M, W  G+ [. h) ]) h
" V4 C, w: p5 U9 S" U* C! ?6 I6、调用C语言的IRQ/FIQ异常中断处理程序返回,恢复用户模式的寄存器,并禁止IRQ/FIQ1 s' z5 `1 K1 ?- q, \5 B

* j  Q. `) E& [" u. ~7、切换到IRQ模式,禁止中断
; g9 g" r! q4 ^# V( b
( u( C) z' }6 Z7 p, o6 s) {! V8、恢复工作组寄存器和寄存器LR_irq
, v$ h' a9 k" r) D3 R" _* X! S
; ~) o  s: Y" U' h: k6 w: H9、从IRQ异常中断处理程序中返回
( \( I7 C8 Q) D/ V7 j+ A- x& e' }/ g7 h# T$ M9 r3 o- W
PRESERVE8
! |5 T7 _% j5 a  k! W  n; k1 t4 X: m3 v4 |8 N' ^0 W# G* M/ N. O) v! q
    AREA INTERRUPT, CODE, READONLY% z! F! v5 _( k4 D  g
    IMPORT C_irq_handler, }/ o; Z1 M4 p6 C( c, S
IRQ
# F; F* X( u  R! V9 a" t    SUB     lr, lr, #4        ; construct the return address) s2 F5 x) O4 ~' T: s- |" W$ S
    STMFD   sp!, {lr}         ; and push the adjusted lr_IRQ( Y" ^* O0 @* N' T' x" d7 p
    MRS     r14, SPSR         ; copy spsr_IRQ to r14
+ S# U* R3 _3 x0 o$ s& c, d0 P& H    STMFD   sp!, {r12, r14}   ; save work regs and spsr_IRQ
. ^( k. M; o, j2 i0 n- f
9 x! A5 @1 d: u# C1 F6 D" s    ; Add instructions to clear the interrupt here
$ i. [. R7 x  I, X5 I    ; then re-enable interrupts.1 U5 ~+ O0 x, N) ?

7 w( K( Q* i3 c
, [% b6 c3 l* _MSR CPSR_c, #0x1F ; switch to SYS mode, FIQ and IRQ! s% z/ Q$ F5 N# `
                              ; enabled. USR mode registers
; |) l4 }; H! q" L$ M                              ; are now current.: w! e* w0 [! Z6 P
    STMFD  sp!, {r0-r3, lr}   ; save lr_USR and non-callee - `' g7 {8 U2 a
                              ; saved registers
; v- C) m, w( M- C( l! ^9 J3 ?    BL      C_irq_handler     ; branch to C IRQ handler.8 H% ~$ ~1 s5 y& m
    LDMFD   sp!, {r0-r3, lr}  ; restore registers
2 P2 K0 ]8 y" A+ d    MSR     CPSR_c, #0x92     ; switch to IRQ mode and disable
6 c" T; @9 y9 v5 p( S                              ; IRQs. FIQ is still enabled.
! f$ v( s( `2 D) g$ j2 I6 \
" q/ T' i9 a1 E( p  ~    LDMFD   sp!, {r12, r14}   ; restore work regs and spsr_IRQ
, m# t) V( e+ I" {8 `( d    MSR     SPSR_cf, r14
' V9 U' B7 `; {' [5 F. ~    LDMFD   sp!, {pc}^        ; return from IRQ./ \, _' s( w! w! v
    END
. D: n3 N% p% a2 c" `# L3 A
- I1 ]7 p; E) a. t* J9.5.2 IRQ异常中断处理程序例程
* q2 F: M' O8 q  x
9 a" V. g# _% m! `6 g;保存返回地址; G1 L7 Y  [  A4 ~9 k

6 t4 b, \, k$ b# f4 I" H, o. p# b+ ~     SUB LR,LR #47 W  z% }" L* F5 V. l

" B2 `" i4 E, d( @     STMFD  SP!,{LR}
9 f0 f& K# t$ o$ `; K! _
) q; q" I# F& ]# [, B     ;保存SPSR及工作组寄存器R12
! ^5 f7 Q. z! N. A& C) g4 c
! |, o; Y3 y, R) }* I" Z     MRS  R14,SPSR+ S5 F/ {/ s. ^0 v/ k  }
) ~+ h0 X. M/ l$ o
     STMFD SP!,{R12,R14}2 m3 |( c8 C$ v, X( N/ {

4 s" [/ d) K+ m2 c) m     ;读取中断控制器的基地址
* y2 L4 Q" ]$ V( \4 \$ X
3 q" n, B$ D: D) A5 r+ U     MOV  R12  , #IntBase$ ^- |4 D1 Z, Z* q* `5 j0 D( j

  m, ?" ?* K% V4 s; H) h0 o6 ^     ;读取优先级最高的中断源的优先级
0 T. s+ v! K9 d: B9 ?9 c* z" x% q
/ I! Q5 W: j9 u- C! D* L: I/ \0 T     LDR R12 ,[R12,#IntLevel]
4 L* H0 t& |0 k. a0 [  ?8 w" ^, S) }
" ?. \% n  c1 T7 s     ;使能中断
" m- U* C  F8 G  A
( ~) N2 k) Q& u     MRS   R14,CPSR
+ y  ]$ s- U1 X. y
% C/ W2 e2 F+ n- {7 `5 C     BIC   R14,R14,#0X800 R$ i. g( X' r# H7 [* L

6 Y6 V0 ~( j) G, [2 K     MSR   CPSR_c ,R14& L2 T8 ]" }8 n9 V- P* N

# w! ]5 {/ ?9 W$ Q. i8 |2 A" t, D6 R     ;跳转到优先级最高的中断对应的中断处理程序4 l, T: j0 n4 K- h( F. L; m6 O+ k6 |
& j2 t) ~  a7 h7 {: U$ \; F
     LDR  PC, [PC,R12,LSR #2]
" `% l/ C, O# b' o5 T6 ~
( l  z5 v1 M- j     ;加入一条NOP指令,实现跳转表的地址计算方法& l  `8 s1 I" p7 Z8 O

* W5 Q8 g% b2 j4 {3 B4 v! ~; Z1 R     NOP
1 o" K0 C# U; p# d8 r3 U* r
) U8 `; e3 z, ^: @6 ?9 u4 v2 }5 ^6 r     ;中断处理程序地址表# j/ H8 B2 j! y9 O: ~8 H
1 |+ x, J+ J' J7 _
     ;优先级为0的中断对应的中断处理程序地址7 G- i( t/ r, P7 u
1 r$ |: L. Z3 x# a8 h5 f% e$ Y1 E
      DCD  Priority0Handler
2 w' G& p& z# |) m# u# p4 Q
' b( `0 Z/ X1 I7 k: e0 g' P     ;优先级为1的中断对应的中断处理程序地址! U6 w  N$ d3 V+ j8 x! \
+ r, E' O/ H* }3 ~2 l
      DCD  Priority1Handler
  Y& o+ g$ a. W* S$ n& [  N' ~* h: h+ Q  j8 p
     ;优先级为2的中断对应的中断处理程序地址* G) O  P7 A4 n3 q
( ^2 N+ R0 m. \, G
      DCD  Priority2Handler
9 c# ^5 [% z) U$ ?# y) j7 V! g" W. B! _3 O, X3 g) B
   
; m6 _' F8 y- P3 ~  E/ ]
/ s& ~! w5 T* R     ;优先级为0的中断对应的中断处理程序! h- y" w, V' V- c

+ |& z# Q' |/ y9 R  C% e      Priority0Handler
0 X3 P, T7 g( h
/ p- L/ {3 I( D. u5 a      ;保存工作寄存器# F/ ?0 X+ k, G7 @: j# o
* k: N/ H. h) J+ q
      STMFD   SP!,[R0-R11]/ l' O  s" y* |) }+ z/ t
4 l6 i7 K0 k0 w1 E# A9 \' T
      ;这里为中断处理程序的程序体
' _6 I% {/ s& E% S$ D* h' d4 H  j  O  E0 L5 s
      ;...2 S( j0 p  P7 c  k

0 ^6 ~" \9 Y% T6 j      ;恢复工作寄存器6 i+ f. [4 j9 G# J
# y+ Y5 O5 B! W8 B6 p, F
      LDMFD  SP!  ,{R0-R11}' ]4 a/ F" D% q

# c/ G; A  R/ y& B' o      ;禁止中断
4 d) h  ^/ r& g0 J+ o4 a* y! _, x; E" m) U2 K
      MRS   R12,CPSR: Z& v6 S8 J7 i- n3 R/ ?
, f0 _/ ~- x3 F* F
      ORR   R12,R12
1 Q) F  E; h) w& p8 \0 u8 V% r( s4 n( F
      MSR   CPSR_c, R12" a8 V: B0 L$ Z4 R

3 Y9 O' ?0 P$ l      ;恢复SPSR和寄存器R127 q3 D& f: E3 O7 c* U3 V7 \7 r
5 j% s& u2 Q. o  o' Q3 z6 F4 ]
       LDMFD  SP!, {R12,R14}+ D# [( Y( W  z4 n1 q( U7 G4 U
, S' T5 K/ {# S: S: U5 r
       MSR    SPSR_csxf, R140 a( ?8 T/ D. U! ]; B* z9 f# j
- m1 B2 C+ \& `
       ;从优先级为0的中断程序返回
0 K8 ]7 P' h" ], O- x! o. d6 M1 f; n* ^8 |
       LDMFD  SP!, {PC}^
! s- o, e7 |" ~5 e; G
7 y  H8 c' L# G% U      ( J& J3 m2 s) Y0 L# h2 L3 N0 y
- t" o/ T9 T" R/ r# n7 c
     ;优先级为1的中断对应的中断处理程序地址
. x7 e- L) B% F( r
# c  ^6 D7 G& T      Priority1Handler
2 h0 P- }/ \3 U' z2 L' _
8 L' K" ?8 `3 C- ~$ f      ;...

该用户从未签到

2#
发表于 2021-2-20 17:04 | 只看该作者
ARM体系结构与编程学习(13)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-27 18:44 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表