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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
# ]& r6 e8 B7 H5 f. B9 M
9.4 SWI异常中断处理程序
9 L1 r+ h3 O& ~# [* F; z: ~
5 _: a2 |: z8 d1 G! ]9 _  Q- ?* B在实时操作系统中,通常使用SWI异常中断为用户程序提供系统功能调用。
5 _7 |; J6 R9 V# T# n, C
0 q4 H6 V& t+ W( w通常SWI异常中断处理程序分为两级:
% [0 H0 v9 s& B' _- R
& D7 r) o, B) h3 U6 P第1级SWI异常中断处理程序为汇编程序,用于确定SWI指令中的24位的立即数;
* T* ?& ]' i$ F9 ]& ^
4 ~9 R: l6 i. j! k$ k0 v( F+ d第2级SWI异常中断处理程序具体实现SWI各个功能,可以是汇编,也可以是C程序。
$ C, ?+ X5 L2 ]# o7 o) I+ w" U, z1 @( f  Q5 K
4 m4 m5 e5 t2 m+ F; C  x
8 B3 B8 V" Y% K
第1级SWI异常中断处理程序1 Z2 Y8 _" D2 K; F8 }

6 k" Z: w% [6 V# h& c/ d# l        AREA  LevelOneSWI  ,CODE ,READONLY  k* D4 t7 |0 N( m" V! f* p( G

- \" ?* |: \( h8 V1 K% Z        EXPORT  SWI_Handler# K4 M* R3 p) E2 b6 A/ E
8 i( u  D& }5 e" `- B' K, i1 u
SWI_Handler  C% K; x4 u  D! f3 z, v6 n: T
( N3 r9 w9 F+ N# k+ G. m
;保存用到的寄存器1 ~" e& n9 `+ f& ^7 J1 M
$ x5 W% c* h6 }; N$ S6 W8 v& E0 h
        STMFD  SP!,{R0-R12,LR}
7 w/ g5 p) r0 O( _9 N* K1 A1 a4 p: k" I* W5 X$ H
;计算SWI指令的地址,并把它读取到寄存器R0中* q2 z) \4 h  r! W* K$ h$ Z  i3 ]$ B* M+ w
" N; B7 @& g7 F, n$ M
        LDR  R0,{LR,#-4}
5 a* w. H' P9 o' \$ R
0 E' m8 [! A, F* y# u;将SWI指令中的24位立即数存放到R0寄存器中1 k1 k! [( J5 C5 v2 |  r

' S' Q& E4 I4 e: W: H       BIC   R0,R0,#0XFF000000& e- \5 |: R0 `; J
1 D* h  E* i3 u) C: }
;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序# J$ N0 k! e+ s, P

( \: G" i5 J$ c# S& e$ a/ _/ B: Q;. X, T# P7 {5 c2 @! P* q, S

$ }) T7 _9 Y2 d;恢复使用到的寄存器,并返回
. q% Q6 L! ]% n, N$ [8 c% I' k* Q) {( H, t4 x
        LDMFD  SP!,{R0-R12,LR}
, T: W6 E$ ^, h( g  W5 m$ K3 ~9 X) x: H5 s" [8 q$ _7 |- \
        END
/ J: Q6 f. O" a; o& K# i* j2 w9 x4 @8 E, c" f

" E/ _; K0 T9 f( j7 p# Z7 ^/ d" {$ f/ [! Y
第2级SWI异常中断处理程序(使用汇编)
* U- Q* l  q  {. T# }8 Y2 r, G9 ~' X4 T
   ;判断R0寄存器中的立即数是否超过允许的最大值
& Y: Z- J# P8 F2 ]5 K8 l: H, k) ~) N4 a+ H6 `6 D& h7 u7 e
        CMP  R0,#MAXSWI9 q6 i( V( U  a8 C, d. O& g( W
$ d$ v2 }, Q! G/ A  l" f
        LDRLS  PC, [PC,R0,LSL #2]7 M" E, |; w# H; f$ j

  m% P/ I; i/ w& Y2 r+ v4 h        B  SWIOutOfRange
% z8 t+ ]- Z/ s( ~
$ M6 u6 `9 z. y; p5 D! e& Y0 nSWIJumpTable. U- O) u/ Z1 C% p4 t# b0 b

( O: E4 c% J( Q        DCD  SWInum0
( `4 }# s. ?" c, t2 w: T' O2 X: T1 O
        DCD  SWInum17 H2 R9 i8 i6 _& l% G
  @3 r7 t$ [6 d5 c; m6 ]$ U" _+ o
    ;其他的DCD$ _& |5 B+ }# u6 B; r+ V2 m
: Z5 N: Q6 b; S. i2 h6 p
    ;8 \+ X' o& `/ |

* X0 k+ y" v0 E2 L    ;立即数为0对应的SWI中断处理程序. S2 d, D8 O! k" p1 E$ [6 ^
9 d  D! z" R6 |9 K+ N1 k2 i9 S
SWInum0
" {) W' C4 l2 p2 ^
% t3 ]6 Z) @1 ~9 f9 {        B  EndofSWI
* w( A6 |; k& j0 l( d$ b( w0 B2 I( l! N  D. x
;
  Z  ^) \2 s. O% p# ]
6 |  C" Z, a. M% @7 Z4 i;其他的SWI中断处理程序
; h/ H: L7 q+ P6 `0 w
8 C- a, d) S5 T, W3 x- X  l;& j, x% l. j/ b) I+ b6 g3 T- Z$ e& x& r
- t( F. c7 M/ s% X# Y
;结束SWI中断处理程序
* d9 Q1 C0 i9 l! c, Q+ F3 q- L& y2 ~0 S' L" n
        EndofSWI+ e( E+ E; Q/ N3 t6 N' y) ^1 W/ ^

( \0 B8 A( l1 E( H& g/ ^. T, }, t
0 j6 {/ X8 `; X- C8 ?1 @3 }9 o$ c8 R. A: B7 |3 Q- U2 T: X7 t
将第1级和第2级程序组成完整的SWI中断处理程序
! O0 e5 V" h( m* _' K& j2 }/ @1 g& X; U6 J" Z& b
        AREA  LevelOneSWI  ,CODE ,READONLY
2 O* D2 ]: |/ Z) P% p
2 o# i" p* \( ]        EXPORT  SWI_Handler
; k2 C: [; `( `
' @) H. l* s3 H, c" f& z- ZSWI_Handler1 H7 V) r2 H( l# }1 E7 o0 Q0 {0 c

# g# M1 ?* K5 M$ r/ P# |1 U: f( m8 S;保存用到的寄存器7 |) }( U2 d# t8 s
/ D- O+ u1 K8 D, _3 i
        STMFD  SP!,{R0-R12,LR}( O( y0 W) }0 Y7 k: r7 E

( ~0 t" B% f, C- R7 d ;计算SWI指令的地址,并把它读取到寄存器R0中3 r  K. U+ a' [) R  w. r' f/ n

* N2 A% l- c, V# Z1 E        LDR  R0,{LR,#-4}8 i  L% ^$ t" e1 E+ |, }! W
9 ?3 h+ }1 n; {
;将SWI指令中的24位立即数存放到R0寄存器中  }7 h7 A5 j3 G9 v6 N0 t. q9 u

- O* l& U. ]2 h: r" X4 f       BIC   R0,R0,#0XFF0000009 w0 O* ^% E& V" `" k* f( p

8 `9 j* D  s' ?& u;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序
, @6 i4 e  ^5 E( w5 y! r1 s2 `: u: H  ]# o$ s2 j: Q9 l
;
* T2 x( A2 Q' V2 o$ v
, N, n+ R* ^* `% B# e; n   ;判断R0寄存器中的立即数是否超过允许的最大值
/ R2 w' Q  M/ J; n! Q; j& V4 ?4 d: E# b4 s/ p- f' t: b# o) }
        CMP  R0,#MAXSWI
+ J. B3 K+ S6 d, n2 D( _. K' D- c1 H/ v$ I
        LDRLS  PC, [PC,R0,LSL #2]
( H# ~3 [7 W+ t0 j9 ~% Q( h% t" u4 v& T" b- \. I+ A( u
        B  SWIOutOfRange
, Y7 l! c6 c" }' Q# D
0 C0 J) Q8 N4 ^# K' A5 KSWIJumpTable
) }/ Z/ k9 U0 h& g1 s/ u3 m' E' o2 n- n
        DCD  SWInum0
: `, u/ Z7 Y) H1 x7 e
) T3 S; j1 u2 h3 F- p2 ~! ~        DCD  SWInum1
& a- l. U* R9 C) R# H
, i% n0 u6 e0 p- [$ q    ;其他的DCD. @: e: z- c$ P
6 \* D# C" \: {
    ;
+ K# S. v  Q( @4 f! \1 s& w2 x& [: L, h
    ;立即数为0对应的SWI中断处理程序
4 _! E8 g2 y' r3 |) B; ^8 C2 f6 P( k- _* w" [& ]
SWInum0
* _/ r1 F* O& c6 W4 e9 |: E
  i; q2 x/ c7 I        B  EndofSWI
1 ]$ C' E( n7 H6 Z; [6 ?
& B' V( j; f; N# O& d) xSWInum1" S: Y3 o# {( G0 [
( h! v9 D; W, c/ B
        B  EndofSWI, K; E. s5 s! x" _
. D6 h; E7 V+ z5 z6 |9 i" l: o
;6 s, Z4 y  G, Y

* M6 L$ m. K6 B4 l;其他的SWI中断处理程序
5 s. u; `( J' h: L: Y9 ^5 u9 }: M3 S9 C/ ?. `( e
;
2 |- I# g& s* x2 D+ Y
8 ]: c1 x8 ~/ U" x0 t! g! A. c;结束SWI中断处理程序
% P6 p! z2 S* s
: K/ L% ~% `7 l  W1 g        EndofSWI
1 i+ v. T9 H5 u0 C1 e3 W! X% r* r6 s: s# N4 s; t2 e
;恢复使用到的寄存器,并返回, a8 Q% K" b" X" b

2 h# A4 d( e0 g! p, N        LDMFD  SP!,{R0-R12,LR}1 u0 H6 ]- v$ T( t! j  e6 o

7 m6 v1 O6 S$ ?+ \- G; z) Z  x$ u        END
- A9 T9 j& Y9 E' {8 D
2 i, N" `8 T! ^& [* w 4 y3 ]8 t; _3 C$ @
3 l" M/ L7 T4 G+ ^+ Q
第2级SWI异常中断处理程序(C程序)
2 l  H* @* [( ?6 x7 W$ F: n% u* }- h( l
void  C_SWI_Handler (unsigned number )
7 |- x' I3 y' k% R2 A% X  k7 R% H% M$ J
{* d+ j. _3 z; a  u; A
      switch  (number)9 d9 _/ y4 h/ P
4 m6 b, D+ R! v7 Q# A
      {7 ?$ l, I  M5 ~
         case 0:  i' [8 X) R9 R
/ r  E% Y7 W. o4 `
       //SWI为0时执行的代码1 p3 ?: G7 d" ]$ F
0 w* o3 t( z' v% E  C. I
        break;
- ~" ?2 t. m: w2 ~* s* ^: h1 x2 _  W& Q
         case 1:
1 P( p- ~; C3 k* ~$ Y1 Q9 a, y7 T' G
3 F% w6 o; Z3 w, _6 ^( S( P       //SWI为1时执行的代码
  v# s+ p- t. ^/ J4 I/ a3 }
0 G% R+ S2 m& U7 Z& i        break;: E3 X# J, h% S9 l+ V2 d! |
2 G* u, [: N2 T' K
        //其他SWI号执行代码
$ u* s  r% s6 U. q) N! `8 {3 R9 H& i+ \7 x7 _3 t1 K% U  Z: u
4 C9 y2 q- }5 |1 j0 }

6 y" l2 u; i3 |5 w       default:/ G3 {* T7 r1 |1 @' R1 Q% `

6 [7 {5 I5 O9 {. A$ o  P        }& A! I  B- j7 F1 ~, J
, [4 z3 g% h% C. g
}
7 h' ~* s3 R3 w. c9 c% |3 [6 C" |9 k, ~' R! B- i
9 y3 m" f& F: D* k  S/ ]  h
; L" N( l5 H4 _/ ^  r0 ?- a
一个完整的中断处理程序为C程序的SWI异常中断处理程序
. [% t9 n1 K% O. x6 j4 b6 o* G; H' k
        AREA  LevelOneSWI  ,CODE ,READONLY
% b' e) H6 [$ U$ }3 l( x% P# i: G% u6 e: y6 b2 c. ]
        EXPORT  SWI_Handler3 f7 t" ^2 o0 n) Q4 U
% e  B' }5 F2 M! o& Y; C+ K
        IMPORT  C_SWI_Handler6 L$ N8 W# p1 ]/ E" R

1 W. E' H) ?2 q. ^2 j1 K( cSWI_Handler
" b( |; z- m% u$ _0 r, o2 T7 X/ {% B  u- s3 R8 o
;保存用到的寄存器' Z' M- X" d  Z; O+ O# M
0 ?4 ?+ o6 e, x0 ~
        STMFD  SP!,{R0-R12,LR}
( w& |4 L! j- I, p- t- E+ @" g( F
0 P9 [3 D# t  n/ J# J8 W ;计算SWI指令的地址,并把它读取到寄存器R0中% ]' o: B! \8 A3 }2 L" d0 I
, P0 n' g% n* ^* K
        LDR  R0,{LR,#-4}
1 s- s: {$ a  a, n) f3 x$ _9 X0 R7 r% n4 r
;将SWI指令中的24位立即数存放到R0寄存器中/ \" X) Q9 I. O& a/ _; k
0 m" K) w% H, v3 p4 i  ^
       BIC   R0,R0,#0XFF000000. P  ]" w0 h+ K- E, l1 A) \

* p# Z& a3 R6 ^+ q4 X% Q;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序1 R2 y( B& N( b, z& v( j

5 p4 U  X6 p8 H3 r( Q7 o  ~;
3 z2 p6 i/ j$ L6 m) V% M
) r( c3 H7 u, l1 l% o8 t" a       BL  C_SWI_Handler
2 [) d- q/ B( O3 I9 G7 L1 [% g
;恢复使用到的寄存器,并返回
2 b% A8 Y- l$ P
. @& R8 B2 P! G7 Q        LDMFD  SP!,{R0-R12,LR}
  A6 a! D# c. ]* V
$ {* T8 Z4 K/ [) Z6 K5 G        END' x& j# ]: W4 z5 e0 d; ~

( @* Z5 l1 |- @6 ~ $ f+ x6 h& t: o

+ _' a+ a/ a. E* j9.4.2 SWI异常中断调用' ?, Q( D( c0 p2 x# R3 M$ V: T
1 h$ d& J  D4 w/ w) L5 x" C
1、在特权模式下调用SWI
! Q- o" o- C* O$ v6 l4 l6 C; T6 t" Z# g0 M. v/ y
;保存用到的寄存器,保存R14_svc! J! C4 Y: h$ I& O9 M
* k8 A. [$ ^/ V$ q  L/ n, Y
        STMFD  SP!,{R0-R3,R12,LR}
; }4 X; v: [% e- E8 L
. X+ [: b" ~' N5 N1 a;保存SPSR_svc
1 s& J  [% J* H0 N- v3 Z3 t
! a  f# s" R$ N' I) b8 x7 G: K5 h        MOV R1 , SP3 q, T& Z5 A& L8 J1 K7 y
7 m( ]( S& M7 _( E3 @  `
        MRS  R0,SPSR
& a! D6 ]2 o5 S! x, D- H0 ~) }% F3 d' Y
        STMFD SP!,{R0}- ~8 a5 L. M- J. _

' o0 j/ a% I1 U7 j* h- l1 ^        ( U6 h3 H! v: ~' l/ s& c, T6 O

1 a2 s: n* x  p7 k8 u' g$ Z4 {. a;读取SWI指令7 M6 y& ]; f1 V& p% P
( I9 J! b+ ^1 O' `0 v: E8 ]3 b
        LDR R0,{LR,#-4}
1 j( R' I/ ^0 U
- A( Z8 N% x) y ;计算其中24位的立即数,并把其放入R04 v7 ?- `. N* Z( |5 S0 g' G  M9 |

2 K8 O. {9 |: X& t* K$ r( O7 M       BIC  R0,R0,0XFF000000
" F1 e( M( g1 @- M: u6 @8 D: v
* p" c& C8 N) O& X- D2 W$ \3 s# R3 l;调用C_SWI_Handler
  P7 y% R; }& c  a8 ]* s: y* x+ D/ S" O- O" h. Y
       BL C_SWI_Handler; h, C3 _: {( ?. _8 p/ z6 k/ W" o

1 ^0 `/ d' z* ?0 i+ W* j# _;恢复SPSR_svc
- \/ V6 ?- p9 ^: s: t% r0 Y3 P) x! X! ?/ ^( X
       LDMFD SP!,{R0}3 `0 H0 \7 [2 x2 V5 m

: m3 s! v1 W$ w# m       MSR   SPSR_svc, R0# `* q, d* [0 c7 K; _8 n! r" Z. I
; S, U/ l/ w- C# K" v% I  j8 R0 a$ u
;恢复其他寄存器,包括寄存器LR_svc, e! ]/ G3 s! {, I0 g/ l' L

: g/ \$ Y4 h" q3 y# J/ U" z: k       LDMFD  SP!,{R0-R3,R12,PC}^
. t/ p% j4 [5 V" y) w% s4 w0 {1 L1 G" M. O

/ H* r0 O8 Z$ |  f9 M
6 r  k# Q: u6 b8 n' u; t4 A2从应用程序中调用SWI1 o) Z' @3 g3 B% J% p& n. W# f1 x

5 b2 W( \& Z3 F, j9 a" _2 {分两种情况:1是使用汇编指令调用;2是使用C程序调用
7 R- V) T1 G4 h2 l) L9 U6 r
6 X) d( k! X* T; [' p% O汇编调用:
* A+ C, K8 {0 J1 h( C  ?, J4 e# A
5 N" b+ X8 }; y6 V# ?, U          MOV R0,#100   ;将参数放到寄存器中" I0 w8 ~8 {" J) w2 a8 P

8 s& {: A1 h% E) m          SWI  0X0         ;调用的SWI功能号
; [6 t8 J* x( C. W2 K7 `$ Y: u/ a5 a6 K* K7 c. x
C程序调用:$ d( c/ C9 p0 T  l

: M* u5 k* v# g& J. a, n: |' a/ ]3 O//头文件swi.h
' F2 Y/ a& U4 z4 l4 @+ m" W8 o- S+ H- T7 w+ J( X* X5 F  L" S
__swi(0) int multiply_two(int, int);4 T! Q+ S" N# g4 l* q/ h
__swi(1) int add_two(int, int);5 o& d9 J9 `! B! R$ j* G
__swi(2) int add_multiply_two(int, int, int, int);, w& Q, @5 D, p- p4 h+ e

9 L0 G  a. \5 c8 qstruct four_results
6 p' {9 g: T2 L8 @: j5 P! D% ~9 ~{8 ^' e  h1 }) w( p: f3 j- A' o& h
    int a;
7 u6 l) }9 `0 r2 _    int b;
% H) ~+ a+ Z8 N( x6 d9 u    int c;) \2 e+ k) S; i  q# E
    int d;2 d0 S8 d# [% P& a# R7 I
};
+ Q/ B  p3 h  M0 X% ?+ f0 X3 t! T4 K1 q
__swi(3) __value_in_regs struct four_results
, z2 R% \) D2 a    many_operations(int, int, int, int);) l; ^7 o& d- p

: k. x* v. g: H: R* ?% P 4 Q9 W0 c& B$ p$ w( h2 p
3 \/ [+ W/ Q% j# j
//主函数
# f# I( v; |" q, E/ m1 Z) [9 v' H4 M) R
#include <stdio.h>/ T1 S% [0 R: V' Y
#include "swi.h"8 G. K% W5 r7 z6 E/ g; C! a

5 z, R7 F: A5 C" x" r( Funsigned *swi_vec = (unsigned *)0x08;* L& g0 }/ L; X' \" Y& d
extern void SWI_Handler(void);% M% i! @9 S! c
8 q* H6 P4 ~1 p
( V" X, o& _9 c9 }0 }, ]/ d1 f

/ b9 a' @8 M( l- h# `7 u//使用Install_Handler()注册SWI异常中断处理程序% s2 l8 z6 k( i+ M8 d( f
0 n6 ?( M. ?% \% w

! Y; R9 U# ~6 m  f2 P) V/ W, |- @7 H/ m- F) Y
unsigned Install_Handler (unsigned routine, unsigned *vector)
; X# @+ j( R( n  W; h/* Updates contents of 'vector' to contain branch instruction */
5 q% Z" o/ p7 ]/* to reach 'routine' from 'vector'. Function return value is */: O# J- P  n5 L  I- y
/* original contents of 'vector'.*/. ^3 [6 M! P0 f
/* NB: 'Routine' must be within range of 32MB from 'vector'.*/! G  O& D" t3 C! c. h8 v$ {
( ]  R' F% I" c' Z! _  I
{   unsigned vec, oldvec;: E) e/ a, X+ I7 H
    vec = ((routine - (unsigned)vector - 0x8)>>2);
9 U0 o2 B2 p2 K3 i    if ((vec & 0xFF000000))
  p/ o2 ~2 y4 ^) r! ]4 Q    {& ~! J2 S* S$ r0 i& h4 m( }
        /* diagnose the fault */5 o$ T) Q; J9 f: W: g
        prinf ("Installation of Handler failed");
/ X0 L4 O$ K$ q, Y- C. m4 ?        exit (1);
9 i4 u6 O# G; y    }
1 e5 A9 g. }& b    vec = 0xEA000000 | vec;
8 Z( x/ `2 G, m4 u; N2 B    oldvec = *vector;# E; }2 a  U, g) {' h9 t9 B
    *vector = vec;
% L) M  O% }: L1 g0 x    return (oldvec);
" a( `2 S6 S) s}+ @4 C% O6 K4 m0 I) i! e
3 e3 e/ O! u: Z. T4 T# s

$ \9 H; }. [$ z+ L, e$ T$ H9 F% x3 y6 a; j2 k
int main( void )
/ Q! P& i4 X, C6 V4 H7 f- u{5 l$ r7 i/ |! C+ P
    int result1, result2;
0 D/ v. h4 `  ^8 y& u: |    struct four_results res_3;
+ i% Y# L7 o( U4 V+ f; y    Install_Handler( (unsigned) SWI_Handler, swi_vec );( L% i4 p' j0 u# b0 C/ ^
    printf("result1 = multiply_two(2,4) = %d/n", result1 = multiply_two(2,4));
( R2 Z$ e6 Z+ X* f  E    printf("result2 = multiply_two(3,6) = %d/n", result2 = multiply_two(3,6));
6 D  ~, o4 s. s    printf("add_two( result1, result2 ) = %d/n", add_two( result1, result2 ));
; \+ t, ]( S7 T2 p9 D    printf("add_multiply_two(2,4,3,6) = %d/n", add_multiply_two(2,4,3,6));
7 [5 Z. {, c" ~* F" @3 O9 W    res_3 = many_operations( 12, 4, 3, 1 );4 E/ R& J- S" x: q# w
    printf("res_3.a = %d/n", res_3.a );
8 E  Y9 B  Q# _    printf("res_3.b = %d/n", res_3.b );0 F6 Q4 |1 i' T9 d: B
    printf("res_3.c = %d/n", res_3.c );
) w' h- o6 L3 C! o$ d! q2 p    printf("res_3.d = %d/n", res_3.d );# O7 G& s  I5 [9 y
    return 0;
4 S# g7 H1 D$ T6 y/ H" L6 B}% o8 J4 [3 ]* i6 ?9 M

- X# N* A3 C  O# ?0 [
4 F. A: Z/ M% a( x/ ]
) n3 t" w3 C# }- L. f5 Z//第1级SWI异常中断处理程序( R1 w2 c9 q' m0 c

3 D1 S; P- F9 F0 Z        AREA  LevelOneSWI  ,CODE ,READONLY/ [1 x& L4 r! i7 d) V1 C4 {6 b

4 ?/ D2 `- _& F: D+ P; a0 m        EXPORT  SWI_Handler
3 M+ @* n3 H6 w5 F" t# j2 b9 \" a" H$ g/ M. W7 u
        IMPORT  C_SWI_Handler
% _) E; s, Q* T' b& t- @$ A8 w6 v9 H- S$ _" e) }
T_bit      EQU   0X20. D: m$ |  t1 ?
8 u7 L5 p8 u/ G
SWI_Handler
# z; z' _: f; a/ J% Y
  P8 Z2 c) G4 n2 r8 R, |& g* v( l;保存用到的寄存器
9 ^( k# W# F0 L* V
0 q" x* z9 {( M- h  c        STMFD  SP!,{R0-R3,R12,LR}/ ~$ |, i: l# H( E* R$ q

. g4 A9 Y& n+ }. C2 ^( ~- i ;保存参数
2 J, k# G' w% q  q/ b. d8 @% N& G
( y% ~0 m) ^/ I1 Y( Q        MOV R1,SP  |: i/ ?7 k1 I. A8 {
0 c* F8 V( t" U8 Z
;保存SPSR
. \3 l1 [% @1 [5 g5 H6 a" }! \2 Z6 g: [
        MRS  R0,SPSR3 o- x' [  u4 I: d
2 v$ V5 ?# {2 X" Z
        STMFD SP!,{R0}: m) h$ K+ n0 p0 y# Z% d9 X/ v' R
# [5 c6 k0 e+ G) Q% k. W; L6 p
        TST   R0, #T_bit
4 U- C5 E# V+ [. y  ~( e
8 K& i# w+ [& I4 e2 X, o) {;如果为thumb状态
) q# w) \# y8 J; ~7 U/ ?
+ Q) I! M) V0 t+ ]" A" w        LDRNEH  R0,{LR,#-2}
1 r5 j  k3 s# n* E8 H9 |7 L& m/ Q
1 O2 J8 T0 m; H6 @( m/ a        BICNE   R0,R0,0XFF00& O/ A4 |( ]! X$ b9 A6 N
1 i. J7 D% M. ?3 P9 ^
;读取SWI指令
! x$ d9 n) F8 W+ ?0 r4 _3 V" r8 W) R; T% _8 _
        LDREQ  R0,{LR,#-4}
* }0 q5 n1 k) P9 ?5 T, }6 m' W( n2 M$ ^
;计算其中24位的立即数,并把其放入R07 T8 b4 g! t6 O, J8 p/ f
6 }9 h% B; ^; x
       BICEQ  R0,R0,0XFF000000
( N, w% ~. k6 j( w+ k8 u
' i; @6 @/ Z. s- {) _" Y;调用C_SWI_Handler7 q/ ^0 Q  F. U: Y( T
1 H& ^7 w2 \' C
       BL C_SWI_Handler; M5 R- H2 o" ]. J7 E! V

. `% x0 x; D$ O;恢复SPSR_svc, T8 C9 R& d% E2 [; }
# J+ J! ?* V# z* O2 l
       LDMFD SP!,{R0}
" l) Z2 N! o- p9 l$ R8 s, M# ?/ G
: _: h5 x/ R" A4 r       MSR   SPSR_svc, R09 f: p% s3 o, s2 }5 l4 O2 i* \3 h/ r
3 t- X- Q5 e* z9 n+ z) k# i4 l
;恢复其他寄存器,包括寄存器LR_svc
* w* J& p6 m3 y8 q* i: l# t5 r- [- [+ G
       LDMFD  SP!,{R0-R3,R12,PC}^* }/ G* o' u+ j3 J1 @5 o& s
  s4 y' n% a& P% Y& b
       END
2 ~9 w6 a( d" b- x$ N5 C/ F
1 h& q1 y; d6 D5 j2 S$ g
2 M6 Y" n3 x' ~* t% l! p8 t$ N# X: p
;第2级SWI异常中断处理程序) ]; p3 s! x9 `2 ^* k0 V/ g0 f

0 Y; t( g1 T& B( cvoid  C_SWI_Handler (unsigned swi_num,int *regs)( h- e, p! a, A5 J
% @. _9 [2 o5 c5 y2 O8 n
{
/ T3 u5 p/ A9 M! M6 F/ c0 y- `      switch  (swi_num)
3 R7 o$ p  o% S1 o5 h2 l$ v: ?5 L0 {. s. {, J5 ]5 P& b% D, u
      {
1 M1 j, ?: b' ^" v/ h4 Y% A+ N         case 0:" @9 m1 D) L% [: s. w8 b

# G, y, n$ u5 v" X' G                   regs[0]=regs[0]*regs[1];
' ^% }! U3 K* E2 Y7 s; O2 K$ b* H# r1 t1 e5 C7 O  U
        break;6 I  t$ u0 H( T) c; S! b6 g

: P$ f  `  O3 J6 R: T         case 1:
4 j, X. }* \0 e8 {8 d- d/ E1 H
5 t  y  k1 F: G9 x; g, a$ w                   regs[0]=regs[0]+regs[1];# E3 U, X; }+ v9 }4 v
: m9 z4 e" v) S
        break;
. z# `5 O# Q2 Q( `7 h( T( u1 \# Z0 B/ u: [2 A. N2 p$ `
         case 2:* a6 |4 O7 J7 z( v# n) s4 v

! t. k" K1 a. U                   regs[0]=(regs[0]*regs[1])+(regs[2]*regs[3]);2 N8 V/ e7 V  ]; P- I  R" y

; ]6 {" q0 t0 D- s, C( v- Z        break;
- j1 a* P+ M" d+ B
! p1 }8 ^& O+ s         case 3:
! N- V# c: p! \' ~/ e6 Z
1 A2 \6 Z3 f7 O) ^: \6 h6 c' X          {
4 P, p& u2 A, k% P% T              int w,x,y,z;0 P$ A- i" {( p

; Y7 `" F) j+ d& f$ _( R: [              w=regs[0];& ^! Q: p( \  N0 v

; V6 w* Z' @4 c4 }              x=regs[1];
3 s# g) x; I" B9 r
4 T6 k9 i1 l' U2 D3 b6 O5 N              y=regs[2];! V; ?' R6 ~# @& z8 t

' D9 h' y# q/ x. s. K% K8 d1 w              z=regs[3];
2 y4 \9 s/ i( L% \+ `$ r& s
+ |3 z$ R0 U  g# _  v7 U% i $ j  O. T5 q8 Z" v5 V) T- \
8 I7 U- B- T" q* ?1 X7 j* k
              regs[0]=w+x+y+z;
4 R* Q" _0 P8 X) D8 X5 F) d% Y2 m6 b. [6 v9 W
              regs[1]=w-x-y-z;1 c1 O0 i: c' X! y( z
' ~5 N5 [& O/ w6 K
              regs[2]=w*x*y*z;
' ^4 R) E% @) }& w: l3 q5 o! c4 X# s8 n+ e
              regs[3]=(w+x)*(y-z);
. m) q7 H. z, I  p- U9 k' X  c, v/ X  s2 V' K- o
            }( t+ R+ w0 I/ m" x! B

0 `# E) w) ^" s1 R9 O3 Q& j+ A          break; , T: {9 `+ t- T" B1 K( L1 Z
: f5 L5 K3 t) c: o
        }
- B( X/ A& G7 D9 Y6 N( E3 j( M7 S
, L3 M; ?/ x4 \  O2 J/ {, X, b$ R8 F6 g}
- \4 {; w. ?6 [, F) t6 A) A( H- @  n! F" P  `

' q  ~6 O- z! g9 I- H$ E3 C  u5 \# o5 N" Q2 S' C
3应用程序动态调用SWI
+ Z( O& S5 K  c8 K: J4 P! m0 l& A: \( s5 R
#ifdef __thumb
) R0 l" |0 r( [# @- j/* Thumb Semihosting SWI */
) [: I5 T) j5 B4 |2 k% A, j#define SemiSWI 0xAB' |! R: g8 C0 B% E! f! p0 w; h) T' M
#else
3 }, W: k: b: B6 v/* ARM Semihosting SWI */
3 `/ M5 W8 e' l' ]/ _" e* f/ T; U#define SemiSWI 0x123456
" h. S* J2 T. L: B: o#endif! }) K6 y, w% S6 u( ?
' L- Z0 F/ H0 W8 u
/* Semihosting SWI to write a character */
1 {2 x0 H1 z& e; g$ r__swi(SemiSWI) void Semihosting(unsigned op, char *c);
; A1 a- E/ H* N3 _7 [6 q#define WriteC(c) Semihosting (0x3,c)
: S+ T) D, S/ N( x. p; R( U, v2 p2 k; M/ Q
void write_a_character(int ch)
4 g6 o+ B% W/ g. j3 ?{
) i! m, a* T$ S. V' b2 b& L    char tempch = ch;
' ^$ S: C0 g1 c( X; Q9 c& n( w9 B    WriteC( &tempch );  q) q- x7 T8 U7 t
}* }3 S1 w% b0 U$ }8 B; z

2 c. @4 a8 o% F- t7 X6 E, G- e3 c' x) _, |" h. C

该用户从未签到

2#
发表于 2021-2-5 10:56 | 只看该作者
ARM体系结构与编程学习

该用户从未签到

3#
发表于 2021-2-5 10:57 | 只看该作者
ARM体系结构与编程学习,不错,挺基础的。先收藏了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-3 04:58 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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