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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
' y& J8 y3 ]% j. o+ W, X  ~9 H. W
9.4 SWI异常中断处理程序
3 |$ C. A9 b/ G& _3 Q, I* [3 S2 |; y7 t6 D
在实时操作系统中,通常使用SWI异常中断为用户程序提供系统功能调用。
; ]; Y9 d: a% @3 [. V
) K; e- l' J% c1 O% i通常SWI异常中断处理程序分为两级:
- ^( {4 B: B! @6 O* X  K8 A$ R8 [% H2 l" g
第1级SWI异常中断处理程序为汇编程序,用于确定SWI指令中的24位的立即数;( e6 u& v5 ~3 K& n7 M

. f$ ^. K5 S2 r) R& ]第2级SWI异常中断处理程序具体实现SWI各个功能,可以是汇编,也可以是C程序。: K6 J& `( }4 R& `

1 X! O% e* S3 s4 o9 x9 k, l
. @) @% i/ d$ `: X. ?
5 c' Z, C( Q7 H) P. d第1级SWI异常中断处理程序
/ @/ L0 W1 d/ R( Q! P; S7 w( D. `- }' @
        AREA  LevelOneSWI  ,CODE ,READONLY4 Q* d; d* X/ A
6 ]6 Q9 w3 K9 y& {  M; ]
        EXPORT  SWI_Handler
; L( m! i1 s9 B
9 }" {7 K4 m/ l# b: j, b0 JSWI_Handler* T% i8 D% Q% o

6 }$ j8 J) d+ |5 y% z: z% N;保存用到的寄存器0 B2 `# {9 R4 }
7 U* `) M+ h# f8 h: u5 M( U  z4 m
        STMFD  SP!,{R0-R12,LR}  q" s$ Z' Z% r. a/ d( L9 |+ w( K0 e) G

% p  \8 Q- Z5 j& u. q5 d( l4 L: M# W ;计算SWI指令的地址,并把它读取到寄存器R0中
& g" P/ U' G9 P0 B$ f$ f
0 L! ]8 ]* u+ N+ g        LDR  R0,{LR,#-4}$ G" A* m7 ~0 o. l8 |/ n4 R" ]
1 ^8 m5 x4 f9 Q6 Y! L2 j- {
;将SWI指令中的24位立即数存放到R0寄存器中. E) w1 a1 B8 o
& z' K& b$ k! L/ c9 ^! x
       BIC   R0,R0,#0XFF0000003 ^% x' E' {- H# I+ z

, v5 D9 t3 R' z0 e# X! m;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序! p, O, ^# m- W2 [7 f+ X
7 N6 @" Z: e) e3 i% s* V; l
;9 @% T+ x9 j; l, n- D% Q' N( K* T

/ m# H/ j. v. t5 p;恢复使用到的寄存器,并返回
5 D$ [. g( v& d( K3 f# i! f& _  w: u/ o2 H% m: p/ t
        LDMFD  SP!,{R0-R12,LR}
. e9 m# d# c" B7 _% L0 c: B# _
5 j: ?( {( k0 K1 q1 S4 w        END  |; Q- f( H; R7 U6 n
5 V& I) e! ?# n/ r0 d9 V
& D) z& k! h! }% J. G  z1 h

5 X* T1 V" U4 e7 P8 V9 x2 J% X. F5 ?第2级SWI异常中断处理程序(使用汇编)3 y- }5 N0 ?8 n& Z$ X: ~

* F* F- P! ~; ~- B0 L   ;判断R0寄存器中的立即数是否超过允许的最大值  R$ ~0 U. V3 Q- @6 r7 p

& _6 |) V6 c" a5 @/ z        CMP  R0,#MAXSWI: d- K1 @+ C" v- h2 p2 R! m
; [: w8 d  S4 ?1 {6 F+ Y3 D; g
        LDRLS  PC, [PC,R0,LSL #2]2 O4 T* y, O$ l* n  M

! C5 d5 ?6 \. H        B  SWIOutOfRange  u6 Y/ @4 R' Z. D4 m8 w

* K: p, B! Z, X0 u! g) bSWIJumpTable3 p7 q. L$ j' Y( M  H

$ o. y- a/ p9 M* V        DCD  SWInum0* x: S  {% g& i
1 e( F4 u6 Y4 q6 l) \3 i: g
        DCD  SWInum1( E' y% @9 p( |" W

' z9 M. ~' F, I! r; E+ c, n2 |    ;其他的DCD
* r* A  o% q, y" a+ U- l3 u) h4 f* [  i0 ?5 }5 i1 j& R2 }
    ;
, J4 u: H" _! J- y
2 `. [/ N- R6 B1 @    ;立即数为0对应的SWI中断处理程序
# y/ m% J  u3 `; Z
3 Z- k, o- V7 |  K$ bSWInum0
3 Z' F& @4 w& [# s0 c7 ^) q% h& T. f- B
        B  EndofSWI7 X. w7 `7 q& o% B, @9 a
1 K( x* l. |5 i# ]) f8 Q
;9 k2 y! E8 N' l/ P2 P

$ B$ l) a3 A  {; h% @6 `; o;其他的SWI中断处理程序' o! T0 \. @8 N6 ]

1 U: a9 }8 ~/ G;4 @9 N. C0 X- ^* I
: E3 v3 s0 ~: B
;结束SWI中断处理程序3 ^% H1 h. t/ ?1 Y5 D. A& L) a

: @& a( G3 i4 l% z        EndofSWI4 ]1 K* Y& f" `1 h* R

1 {. K/ A5 M- s( }5 _ ; X3 c2 f0 \& u# i( c! |: J

7 c2 h) Q1 |" T1 T将第1级和第2级程序组成完整的SWI中断处理程序
% X& I! D$ i# h" T. _2 F3 k
+ M( v) }2 F9 `% J. m/ h+ b9 E: Y        AREA  LevelOneSWI  ,CODE ,READONLY( Z! P# ]3 a; o! Q% S' K1 E# w7 N4 w

( R$ p  S. O! e5 [0 E' k        EXPORT  SWI_Handler
6 E: X( A6 r9 A: ~% {) g1 K& p
5 p" j; d4 M. q  f/ ISWI_Handler. \  z8 F) e& v# N
6 r# `9 x! T& i% g8 f% o
;保存用到的寄存器
5 W& d+ j6 y5 ~! n$ K- v7 a1 ~) e3 E$ o
        STMFD  SP!,{R0-R12,LR}- q* t( X5 G* q

0 u9 o1 f9 j- [2 e: L ;计算SWI指令的地址,并把它读取到寄存器R0中
5 p% ?# _; K9 u- m. @4 t- }6 o  E' T
6 N1 u( t6 @" [5 Y        LDR  R0,{LR,#-4}
" V# j9 d; |: R" @! |/ V- U, K# ^$ h7 T6 v* _
;将SWI指令中的24位立即数存放到R0寄存器中1 E, y$ L9 E6 z. m; d

: F7 M' f; T9 F0 {7 i, D1 z       BIC   R0,R0,#0XFF000000/ d- B0 d! K4 _# }
$ N4 k' j) m3 ~( N
;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序% L" Q! N8 m9 o

  a+ C1 s( W: b# ?+ X;' h( x: j; m. W! C# h/ E
7 W+ g( V" Z+ o' _
   ;判断R0寄存器中的立即数是否超过允许的最大值4 m% \4 O' P% @  J

; E+ i. r3 v# ]7 F5 w        CMP  R0,#MAXSWI
+ c8 e5 a# q/ r9 {$ Q2 R$ l% R; s" l; o- c! ~0 Y+ s- L! c) c% r
        LDRLS  PC, [PC,R0,LSL #2]
+ c* N! D  X$ L! K, E& j+ Y5 z" ~
& J* n/ V& G6 D' Z        B  SWIOutOfRange: P; h! F0 I; i# D$ U' ]; H

4 J) c' C& @1 c  ~* o4 O& RSWIJumpTable) |; W4 J/ y% q  u
- ^$ d% \: A: V/ K  F; C& w
        DCD  SWInum0  D  z+ ]. s* B" S; [; Z0 J
; w. @6 q7 t9 s0 d2 c* t
        DCD  SWInum1
( ^2 Y. Y" s& K( J6 v: c. P6 H% c' a( ~& C7 q) C# Y
    ;其他的DCD& n8 W5 N0 r& J# N" @5 F6 K
) R" g& d' l6 j' `
    ;9 y* s. P: ~0 x: ~
, o) z. z5 Z8 }- N
    ;立即数为0对应的SWI中断处理程序
3 t8 I$ T& M, v9 z9 P8 F
. r& ^% b5 J& BSWInum0
4 E0 k. E7 N* p, h# B
/ d4 d1 P6 U9 N: g        B  EndofSWI
- l. _9 m) N6 j: z
" d! n" e! p2 ~SWInum1
. j% E4 i) h# p. C8 ~5 @% V6 h
$ D1 Y( N4 G2 w+ Q: s        B  EndofSWI+ R4 H) Q) {9 |0 F
# H7 Q9 u3 N. c( P$ ?, P
;$ _+ N6 T* l7 N  k

, D3 R- a% Q& @1 N0 d;其他的SWI中断处理程序
' ?6 K0 E- E4 m
) P: ]: U$ r' W8 Z;
# ^, J2 {9 A7 F* q& S- q; M
, S9 {* H9 t5 H# ]1 O; y;结束SWI中断处理程序
! |; S$ G) @: j- g
1 u8 N4 U# U# [        EndofSWI" K, k: r* K) V2 m4 q% J
  z1 m5 J9 |3 W$ N- q5 f3 b; b/ D! a, a
;恢复使用到的寄存器,并返回
1 f2 T; h0 Z" F9 [$ C
. }  j) o5 t' ~7 g' n        LDMFD  SP!,{R0-R12,LR}
" z( x. ^% u2 v) l* m: g1 m- @1 O+ C0 H* [2 G
        END1 i* T* I1 u* n5 s2 D. k# U
2 U2 \0 I+ V: _) L

: l& k: I, y1 E3 L+ q/ X
: q2 t  y, N( d3 ]: f第2级SWI异常中断处理程序(C程序)
  v" n% L# i5 j# E) w! e7 s- P% L$ w# v! t: R1 U) d5 v7 E8 V
void  C_SWI_Handler (unsigned number )% g8 L, C$ G$ z: ]! `4 K5 u9 J) w

7 S( J7 K9 L% a" w+ V{7 R+ A& @7 F/ a, J! j
      switch  (number)
6 S$ i: U1 h$ _  [
4 ?* |) ?! k$ K  V. C      {8 B) c; N; N6 m' c: b6 F. S* J
         case 0:
/ z+ f3 `+ x) ^5 }8 S5 U. E, O" K
       //SWI为0时执行的代码
9 q/ v, K# A9 _/ `6 n9 A% S  p
! U8 D2 O0 ^% _; y+ ~        break;3 J# b6 P2 _$ u) t: V8 B1 |6 ?4 E" v0 T

6 y( M) V6 A4 ~) @- i         case 1:# c: l, M" B: M: M% [4 z. O4 _
7 D% b( C  g0 a# ?
       //SWI为1时执行的代码2 m3 u+ Z& u' x  ~3 n- q

9 B6 H# j+ N7 Z" D        break;
7 D( f) w  |* h2 m. k7 ^
- X) ~. A0 K' ~- A5 r% d/ P        //其他SWI号执行代码; }+ A: X# H7 f
6 z  n* z) t) W" [

3 ~4 [; x! c. m7 F
. x8 u3 l, U' R) c( w3 i       default:
8 ~/ Y* U) |! q7 x+ Q" I( U, F7 T" N
        }1 L' d  R. O5 M2 k: R+ W
. v" N6 h4 l4 B( P! J4 R  [) \4 s
}
9 x1 e4 o1 p9 v. e' v5 u
8 l1 E. O; Y: k
% B& J3 d0 u8 E7 P: I: D3 \4 W" H# ]  e! U
一个完整的中断处理程序为C程序的SWI异常中断处理程序
' J9 H  i) z. h( F4 k8 [  O
* E  @* d/ Z, r3 L/ j9 q- `0 \        AREA  LevelOneSWI  ,CODE ,READONLY' a4 \# z* r9 S0 u! P: I

5 ?0 u" g$ W; W7 X4 j        EXPORT  SWI_Handler
1 {' w7 a6 {! ~) A$ @* @' s- W0 b* L1 {
        IMPORT  C_SWI_Handler- z8 c6 \6 x, q2 i- D3 q  a

5 @# k) l, p2 }6 b: x& ?' }4 hSWI_Handler, D8 K, b" v* `7 u  D' G

: F8 V) z& ]+ n  P$ u; K;保存用到的寄存器
( q& p( F) S, s: H) C! v
; x/ }1 G% f, E8 c! g1 Y! p- |        STMFD  SP!,{R0-R12,LR}
! q/ N) v+ `' l# {6 z& O3 F4 z0 w3 T) y
;计算SWI指令的地址,并把它读取到寄存器R0中
, {# V' d; h. V
, a) m2 h/ i; |$ K- `! |9 t        LDR  R0,{LR,#-4}% e5 T+ V' X5 k
, U- X' ~/ a- r4 A4 O
;将SWI指令中的24位立即数存放到R0寄存器中
. U; R/ \0 z0 u9 Y) E, [: a1 M: P% L( o4 p2 j
       BIC   R0,R0,#0XFF000000" _1 i7 y! C( x6 e
. w' M: j; B: i# O  u
;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序, T! L  E8 @# A2 k3 l% ]
2 d9 q; R7 u. n; ?1 O( G
;
' a* d& I1 U9 U( ?% S- \+ E5 M; G) k# ?5 B
       BL  C_SWI_Handler  G/ e2 M- C9 T$ @8 ]8 W4 b
* B  h; k/ \3 T
;恢复使用到的寄存器,并返回# l) W6 y: s. C) \3 A' \! r

( L5 c0 ?; z5 D: B: \        LDMFD  SP!,{R0-R12,LR}
  |& @* v, R1 `* e5 v% ]
2 _. R3 ~2 e& y* w5 x! s        END
8 s( v2 K1 N+ Y3 d9 T4 I# h4 f4 k, [# U
8 Z* e1 G$ ^+ w0 P
' P! ~+ ?7 J$ ^
9.4.2 SWI异常中断调用1 L$ d- a& l3 s3 [' {& Z8 s
( v7 ~) A& R, L5 _- S
1、在特权模式下调用SWI
4 g  c8 |& p3 r8 d" }  N
4 s& a) Q4 B# t8 W- T$ C;保存用到的寄存器,保存R14_svc) a* W$ A# {& L1 x1 B7 J6 {

8 I" @# i  f" c* F& n        STMFD  SP!,{R0-R3,R12,LR}
8 j% I; R8 X2 u$ ~! G% w! V
. g4 {& C" R9 t- {3 J$ k7 `) ~: j* D;保存SPSR_svc5 D4 [- G7 ]/ u
. k1 P2 S1 v) S% F/ C
        MOV R1 , SP
  o5 d) R% T* B+ [" I& Y1 C: K& ?) v8 r4 k2 O* A
        MRS  R0,SPSR
  E$ _9 S$ P/ E7 E; ^/ W
5 _9 Z6 `, z* q7 l% S3 d0 s        STMFD SP!,{R0}
& T  s  c( S3 l2 v: M6 Y! `/ W6 }# m
8 }  v0 f% s: M        3 G- J  r/ h* c6 n8 U/ z

5 E9 {, v# ~2 U/ \8 y6 L8 L;读取SWI指令: P; a& h1 O4 P$ G5 `- l' h8 W6 l

4 C  \' z, m9 m# Z" a, Y5 t' w4 g        LDR R0,{LR,#-4}
* }$ B+ k# M/ P6 a' W5 Z( Q, I& {2 Z- T7 x. \; H$ z
;计算其中24位的立即数,并把其放入R0/ z; _! h' B: k* r

, S3 z' p% @( N: h       BIC  R0,R0,0XFF000000
+ i8 {$ T0 P- Z  c7 b& M0 I+ Z- A- {  t6 R$ n
;调用C_SWI_Handler
* r7 q! b3 [, W' l5 D
: G" L- {/ J6 l# W, G# E7 f       BL C_SWI_Handler2 T; y0 Q( {/ V* S. D4 o( W
3 O2 I# M& c6 `& Y& J, B& S
;恢复SPSR_svc
: k' x/ Q  _6 f- M3 Q
4 s8 |* x+ y$ j; Z7 W! Y       LDMFD SP!,{R0}# j) T1 V3 [+ C. [
" ~; h" h; u' E0 Q: M, t* S* Y* X
       MSR   SPSR_svc, R0  K1 ]5 n8 S% Y! e: f3 N5 A- m9 `
6 O0 x/ ]% t0 X
;恢复其他寄存器,包括寄存器LR_svc
3 q$ p! b4 l7 |" r& j8 f) j. g2 t4 x3 z3 q1 N
       LDMFD  SP!,{R0-R3,R12,PC}^5 ]% f+ A( F6 r! @/ j9 E: |

1 D& _8 r! P, k# r& X5 M ' l6 v* K8 S) S, W1 K

# ]& r" s( D2 Z7 Q0 ~$ I2从应用程序中调用SWI
  h; M+ d6 Z. F9 i0 v3 w" u
  q2 G* b3 k, }8 W; S) K3 d分两种情况:1是使用汇编指令调用;2是使用C程序调用
1 H8 h, g$ E  s' ^
$ @8 {% i9 H" Z' n* y汇编调用:
# Q' T7 P; J# h8 U* O
9 T" }# p' v9 a1 Y! A# Z          MOV R0,#100   ;将参数放到寄存器中4 q5 o! Z2 Z& x: j

0 g5 d) w4 j9 I# r& `9 T5 i6 z          SWI  0X0         ;调用的SWI功能号
& O: Z' H9 G, F/ ]4 m, z& X& m2 `
C程序调用:4 D/ w3 o7 f9 U

& h! ^2 v& I3 z  }/ _//头文件swi.h
' e% @! \. R8 V- `- K2 i/ b4 m+ _( }1 e. `0 C: k( ~
__swi(0) int multiply_two(int, int);6 p7 C$ t  n3 P$ p, l
__swi(1) int add_two(int, int);4 s8 @8 I  {2 w
__swi(2) int add_multiply_two(int, int, int, int);8 k5 s, f9 N- |

- \3 y0 h. x4 Q/ Lstruct four_results
* \9 S* v- u- i1 t3 F) D$ ?{
# \3 G3 D8 e( ]    int a;
; ?  p' _; H' u    int b;
0 D3 C+ u6 J' T4 z; U    int c;9 f# g: d1 ]6 A/ r  ~
    int d;
' K* s7 ?) r. O. r' v};, j0 s7 x+ N" T2 ^& B
1 ]: |* r: n+ X& [# S' ^  R
__swi(3) __value_in_regs struct four_results. b6 w% l- Z2 q# F: I6 S0 S
    many_operations(int, int, int, int);
- }  O7 W, k: L9 P4 y
8 k, S# n* H% y0 N: M2 G
  x5 V2 r! M3 v2 f
/ T: |# D# }; L* C//主函数$ {! l7 E8 `" d3 A1 A8 f, c! M2 h! j
, x0 a5 j5 B& ~& R
#include <stdio.h>
% N" [1 A  ]/ N! E& {+ l2 f#include "swi.h"
1 j2 y; f* q) v8 Y. w5 F# \! M% w6 ]" `
unsigned *swi_vec = (unsigned *)0x08;
& C" Z2 k& s4 dextern void SWI_Handler(void);! P% P* j- G9 G( ?
! \1 a2 O) M, g" u- I  F

- ^% R5 s; P+ b+ O% v
8 S, ]: N8 s/ ^; A" l+ s//使用Install_Handler()注册SWI异常中断处理程序
4 x8 M- i! \8 _5 V" ?2 C) q
/ M/ t* }5 i# b+ k2 `" R5 s9 w$ D" o1 Q0 G
/ x, S8 T* v5 ^) |5 \
/ T2 _" {& D/ L0 g% o) zunsigned Install_Handler (unsigned routine, unsigned *vector)
& \* a1 J6 j3 `/ G  L0 D0 L0 [/* Updates contents of 'vector' to contain branch instruction */
7 r$ e5 F/ n) y- u$ I/* to reach 'routine' from 'vector'. Function return value is */
/ u! m7 O: ^% K% k4 s0 \/* original contents of 'vector'.*/3 p+ z8 P! `& m' C% Y* c+ H5 I0 H
/* NB: 'Routine' must be within range of 32MB from 'vector'.*/
5 Z+ n! _8 H1 L1 w5 J2 Q, ~7 P, m  ^$ x( i# ^* m
{   unsigned vec, oldvec;
; ^7 `! u) h4 X. l: v1 p0 `8 Q    vec = ((routine - (unsigned)vector - 0x8)>>2);% O. c) u* u# J! N
    if ((vec & 0xFF000000))
7 H4 b, s  ~. K    {
8 F' q" L* @2 M  Q* K        /* diagnose the fault */
$ I: `. \8 |' Q, w! w( l        prinf ("Installation of Handler failed");& a* w7 z" Z, s6 g
        exit (1);3 W3 ]$ W" X* n% n* H
    }. L1 j0 ]4 i% h3 L
    vec = 0xEA000000 | vec;- w. H4 E, P) e. E) l3 O( U& p% V2 D
    oldvec = *vector;
& v$ j. N$ h% D8 ^$ E. n    *vector = vec;; {1 E2 Y# X4 g. D) N) p# Q, p5 r! ]
    return (oldvec);
1 v5 k) B0 w! n8 ]1 `}' d: g' v4 p" j( J

  _0 D6 g; S4 S' ?) l& C/ Q/ p& ] ( O9 \. E) J1 x( B( V
- Q: H7 K4 g: j. B
int main( void )
% p4 `& h; m: A2 k{' c6 ]' P" t2 H: h, j
    int result1, result2;
/ [& }  L+ `! l- B+ _8 r: K4 v% b    struct four_results res_3;5 g$ c& w+ T1 `( p/ _1 m
    Install_Handler( (unsigned) SWI_Handler, swi_vec );
# _- P) H; G- |& T* C    printf("result1 = multiply_two(2,4) = %d/n", result1 = multiply_two(2,4));! ~/ }9 S! M, h+ r, X5 g6 i
    printf("result2 = multiply_two(3,6) = %d/n", result2 = multiply_two(3,6));% h- ^# X1 F2 J* ]+ [$ u
    printf("add_two( result1, result2 ) = %d/n", add_two( result1, result2 ));
/ u7 c0 x/ _$ \! H# g" B% C. z    printf("add_multiply_two(2,4,3,6) = %d/n", add_multiply_two(2,4,3,6));! r. }8 E% {1 Q+ \
    res_3 = many_operations( 12, 4, 3, 1 );
8 t) n" l. u0 C2 G    printf("res_3.a = %d/n", res_3.a );" u$ X% {- O* T0 D% V
    printf("res_3.b = %d/n", res_3.b );1 N3 G# b" M8 m- h  Y3 N
    printf("res_3.c = %d/n", res_3.c );# Z# k: H4 I! i! _6 ~7 _  J  A
    printf("res_3.d = %d/n", res_3.d );  c8 c0 R5 _+ z7 B! b
    return 0;
9 P2 T* v) c$ `) q- @5 ~! v8 y}+ l$ k4 {3 Z2 `  U: v' a  e, A( W! }" e
& H+ `7 j" S' j) v# r
6 @. e, F' N8 D5 F# X

, @" Z. G! ?$ o8 t" y4 |1 ?//第1级SWI异常中断处理程序
3 T6 c" d- X$ e9 G. y7 P6 U* k7 h& [8 g
        AREA  LevelOneSWI  ,CODE ,READONLY
( V* W- `" t% D" `( R' |' c1 ~+ b7 G$ ], R3 L4 W0 E
        EXPORT  SWI_Handler
0 z; b3 |+ R5 i. A1 u% G! H
+ D! e7 r% Q( F4 l        IMPORT  C_SWI_Handler+ X7 c+ a7 z% @1 L" F9 a3 v

/ A$ ~/ O6 Z. U' B! U# {T_bit      EQU   0X200 [3 k9 C, E5 u& T2 n0 n
- b# L$ t# f! c4 ~. g+ w1 I
SWI_Handler
' E) e9 Z  x/ R' t3 a
! v5 Z" E6 P1 m3 ?  o3 B$ j9 V: v;保存用到的寄存器# l5 f6 k- ?. B/ s; |- }

9 y1 M, T! X0 j5 G/ T        STMFD  SP!,{R0-R3,R12,LR}8 ~9 \: ~+ |9 y1 ~$ X+ {8 h) {
8 H" a* e# O6 P
;保存参数* b  i) E! Z' O- `, k  v
  X' z3 U. f- o; z9 l2 F
        MOV R1,SP
7 }! w) r& p* ], J8 T3 E8 M
+ d" B* O( f4 O" n0 c;保存SPSR( k' }! h  v: h  L& M  ]
, a6 T+ k+ g& b% g( u8 A' a* Y; ]
        MRS  R0,SPSR
/ }9 R" H6 i8 q6 O/ A- Y0 R8 J# y+ D# \0 n* z3 k9 v# ]
        STMFD SP!,{R0}1 j0 J. G, K& {$ _$ b9 Z6 t

0 c5 x$ A0 r& j' [1 e0 q        TST   R0, #T_bit8 I4 z8 m% M4 ^9 B# I; b
( _6 s2 S/ r# I
;如果为thumb状态4 E) N: T; i. X" @$ F* q% p& z  i

, C& {9 Z6 r6 T) @        LDRNEH  R0,{LR,#-2}
: m2 m5 f6 c* u# a5 r
, K  E+ B% D) ?/ v9 I* b" D% i        BICNE   R0,R0,0XFF00- t5 Z/ C' x% V6 ]( L7 [
: T' }! U5 z0 ~8 S$ v: ]
;读取SWI指令
& o, ?5 y4 O, m+ B9 c. M9 u; p% x5 x' N, |
        LDREQ  R0,{LR,#-4}3 L4 G* H5 g0 {8 s6 ~! l1 I
: M: \  h  Y- Q7 C" U
;计算其中24位的立即数,并把其放入R0% ?  R, o) d* V% q, z) u; d

$ ~' k# w+ [9 a  i       BICEQ  R0,R0,0XFF000000
. u# \, G. X, N4 z) [5 q% L
. L' u: x# \; b;调用C_SWI_Handler2 h/ s0 x7 h1 l/ t8 a  l" _- O$ U6 h

. N6 F) z; }" S7 N! Q       BL C_SWI_Handler2 B- {! t% }9 I: r
2 f* }& o; J4 b4 C& }; Y, r7 ]
;恢复SPSR_svc2 [" b' j9 K. A$ Y) w

9 R% z) G. h. m3 I3 L       LDMFD SP!,{R0}7 E7 |" P0 Y& M+ V0 _
1 W' h# A  |1 i+ [* f
       MSR   SPSR_svc, R0
* N+ B1 v' j2 x8 z4 |+ A9 T% f$ R2 Z2 W6 S  Y, w( W& n
;恢复其他寄存器,包括寄存器LR_svc1 i1 ~7 {9 L. o, p; i+ l! u
6 K9 s3 R' N! E* N
       LDMFD  SP!,{R0-R3,R12,PC}^
4 A2 K% e0 q. S5 {" q- @& X
9 N$ q3 f5 ~: C' e  n9 M' m       END
) x5 x, A5 j: `2 h0 Z
  l+ n% s7 g/ k" W ! z8 }- u" a! C# S2 F2 m+ m- B- p

: D* ~9 O* b2 W;第2级SWI异常中断处理程序& x4 J) k5 [" `+ I+ }
3 N8 i5 B# X& j2 L
void  C_SWI_Handler (unsigned swi_num,int *regs)0 N. P. H# x9 {/ U! j& X
$ W, _7 z1 t* D1 w8 R
{1 ^5 g* X# I1 d" ~4 u# w
      switch  (swi_num)
& v# M) ?: {) F' C( C6 ^7 k% H* h8 o5 L) s
      {. B# `: K6 [$ T9 y: U# \* ~
         case 0:; C; Y4 @. D6 D0 W
9 C# V1 x  c  y$ Q4 w6 }' E
                   regs[0]=regs[0]*regs[1];' ~. q6 ?( f" {% b
- S: M7 e+ W+ z( \. A6 i& s
        break;
* ~" r: b2 u. p7 i4 @- r! v& U' P* h6 ^! _# a2 g3 F4 d
         case 1:
7 M1 D2 `1 w# U' I  b  t# M% f: M; s$ k+ J- t% f
                   regs[0]=regs[0]+regs[1];
# e& s! r8 Y0 b. h9 S
" L3 I7 T# A7 w. t8 G8 ?' a" [        break;
- ]) ~5 [/ u! K6 M6 Z1 s: L9 B$ P! l, X9 f5 ?1 T) j
         case 2:
. Y2 r6 a3 H1 l% U; f( M
& j4 C4 t. q% z. G2 i                   regs[0]=(regs[0]*regs[1])+(regs[2]*regs[3]);
7 N, s! S5 L$ d8 x( D8 Y
$ \5 d# B" ^& `9 Q( q# p2 X. W5 d        break;
0 [8 `! D) i1 Z8 B
$ n0 v0 }, O' }& |         case 3:
+ A$ \9 f1 z" B' O8 H0 U
4 x. o# Y$ J* b; P/ ^7 k% k          {
4 r8 Y* I# K! h& x/ H9 u: L1 m              int w,x,y,z;
0 l4 V$ F  v3 q; H0 i+ a# J0 s+ }7 s; x" F9 s
              w=regs[0];
& }' S, s2 b3 E% g9 L
! i- T% V7 r: E- m) M& [1 {              x=regs[1];5 |* z: |2 i- l

. O5 g. n1 z: C9 ~1 Z% N5 P1 C              y=regs[2];8 d! [- Z7 Q: i
. t% j4 \8 l  [4 p( c
              z=regs[3];
; M* m4 x  w) f% \; u2 l% i2 U. e$ l5 C( s/ q8 T; u0 m- w

5 M3 b0 I9 D) p& p( u1 }
  `' A( X( u( b6 D# `; w              regs[0]=w+x+y+z;
( {- ?3 r0 b  ^. Z. N+ i( D3 [* O+ A! V! j$ c" K
              regs[1]=w-x-y-z;* c- s* a; Z1 ^0 V% v
" W1 |" J# H, {9 U7 n0 n0 p
              regs[2]=w*x*y*z;/ g) U- Q& H  N) F+ I
7 O1 U/ ^" N8 B6 u) G
              regs[3]=(w+x)*(y-z);
; a. S% V& n! a6 p' b* u! R) Y, L( |
; K2 v0 [4 V8 X" U% R, t            }7 v5 Y: I+ P; v5 `3 u* ~4 u

7 G5 l7 I. M# W6 H8 t          break;
3 B+ Q! F+ K/ c4 p' j2 \- X6 ?2 H- O, i) _7 J
        }, j' k' P7 @) e- }
& v. ^$ l& t9 ~: i
}" m! k9 _0 f3 |  L. K

# k$ C/ ?+ q: N$ d  G7 w
6 b: \( U+ C2 M+ T( X! Q
  q& \2 w5 W: \! K1 T! ]! W. W3应用程序动态调用SWI, w7 g& q4 v6 }4 p4 x9 ?# H9 r
5 |) M) f0 u. |0 a, O) k
#ifdef __thumb
, J1 r) c. H/ \- d8 Z( w/* Thumb Semihosting SWI */+ _7 @7 p, D- c& T: \
#define SemiSWI 0xAB
/ p4 d; n6 n/ v% g#else6 w% k7 R7 O# f0 b0 |! K
/* ARM Semihosting SWI */
' L' U) c. x" o0 X$ M3 ^4 {. N#define SemiSWI 0x1234569 o& ^' B/ H4 m0 o* {' A  ?# h
#endif
# D+ G5 T! ^3 M+ s; b8 N. ^1 m) f7 z/ x6 V/ D+ W. r# E' o# E
/* Semihosting SWI to write a character */
; B& v$ K" c, ^5 J+ X" O__swi(SemiSWI) void Semihosting(unsigned op, char *c);
  g! S3 J. `6 T#define WriteC(c) Semihosting (0x3,c)
- S$ F3 k) _  T: C; j' a( `. Y1 |, C
% i6 K% |* }" evoid write_a_character(int ch)8 F/ Y+ _6 B3 X4 m+ v' l
{) t1 I: Y" `4 W, z: s/ E
    char tempch = ch;* l) M+ w9 d- N" a+ I8 M6 P. r4 G
    WriteC( &tempch );
: r5 w4 z4 T% v}& ^3 r/ g6 M- n4 ^; R# F
) {. \: n0 F& L$ J) Y) S) x" Y

1 m: O8 p1 H% k- D: V

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 18:36 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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