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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

, \  S' G7 a6 r# H+ ~/ i; H9.4 SWI异常中断处理程序
' K3 ]# ~, d9 g, J3 e
0 U, l* t5 l, e+ ]4 V3 @; a* O2 U1 J; h在实时操作系统中,通常使用SWI异常中断为用户程序提供系统功能调用。
" T: w! K3 _6 \! t+ E. N7 u1 U, J
# M$ P; d5 f2 f通常SWI异常中断处理程序分为两级:
% _2 G5 v/ m" o$ ?2 D0 }& i
( g% H! {  P) M9 o7 h1 P第1级SWI异常中断处理程序为汇编程序,用于确定SWI指令中的24位的立即数;
; e0 m  P0 ^# I& ]+ m9 t5 Z
5 e6 P8 Q" l. Y# g6 f2 U第2级SWI异常中断处理程序具体实现SWI各个功能,可以是汇编,也可以是C程序。
  x+ V# ^2 ~* Q* M' {
' R$ l9 T# M5 K: ?2 ~ : M. f! j! V6 l/ t2 d6 f8 M( u
( r) P6 D5 P) `8 ^
第1级SWI异常中断处理程序& o+ u' I7 C8 e7 @) d* c+ J9 y2 f

3 t8 _$ o+ Q1 l        AREA  LevelOneSWI  ,CODE ,READONLY
4 h% a# U, j2 d& w4 G
; I) g1 `- f- R. \" c( Q3 f        EXPORT  SWI_Handler
6 l: v" `! a5 ~4 F9 _! r
! [! Z" z8 v/ g* @SWI_Handler5 A. a2 U/ Y5 d7 ~4 S% a
" J& b- ]" o) N1 v8 M* F  E
;保存用到的寄存器, a# {+ q: P2 h1 a

. `9 e* u7 q" C& H6 X5 H( \3 N        STMFD  SP!,{R0-R12,LR}: y/ \) ^; ~" A4 T& n) ?& ]1 b2 M

- G4 Y0 G4 g* k: y# J+ p ;计算SWI指令的地址,并把它读取到寄存器R0中0 P, c/ |$ S& k. j% V( A& A

, A( v3 b7 m! S& @        LDR  R0,{LR,#-4}6 `, M9 p. z+ P' Y
8 [# k  w6 t  U' ~" J# ?
;将SWI指令中的24位立即数存放到R0寄存器中* t' `) `; D6 h$ I- n

& [  v6 |; f+ I% [& u- v       BIC   R0,R0,#0XFF000000
: \! O0 u1 ?" G8 J% q9 j2 F6 y# Z% U* ]( G
;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序
3 ~: w6 l1 i* u" o3 w6 W' `
. u2 x: y# r9 I' ?( `7 ]8 p;
2 C" N8 W: |( H  e. k# u5 j' d0 l0 T( A0 n& J4 e
;恢复使用到的寄存器,并返回$ s' n) ~* [" T- }$ ~# J
6 j# c9 C; z2 m( `# w- G
        LDMFD  SP!,{R0-R12,LR}0 I6 {9 O; N5 u! Z6 n3 S. k

; |/ e5 P) T2 m! z        END
. ]8 _. ^& G. \
' P! C# x2 }( q! A6 a
" {) ]- h- T; E5 U  O- g7 s( R& R2 X, {4 B+ G3 r6 |
第2级SWI异常中断处理程序(使用汇编)
% z1 b' ]! W& J* q# b1 [3 X" y3 W7 r# |$ m, b) @8 |
   ;判断R0寄存器中的立即数是否超过允许的最大值
/ }6 V7 Q) \7 y0 ?
5 S! O% E# E; v$ g: J        CMP  R0,#MAXSWI
- R9 u: {% N* S( D( l: R) ?/ G' l" X% F% ~4 d& k$ K* G' g
        LDRLS  PC, [PC,R0,LSL #2]
  m9 E( [, L: A0 a' T' ?2 C! N
. G! u# u  r+ C# k0 O        B  SWIOutOfRange
0 _4 p7 X# `$ P  j% v5 a4 I0 L: f( [- v: N% j: u, q  m
SWIJumpTable" g8 @) A9 _! ?# z0 G
& r% o$ E9 i$ }7 P
        DCD  SWInum0- _# E- o3 e& n. M9 k+ N5 k
+ Z1 |3 E1 z4 l( f% |; r
        DCD  SWInum17 E3 ~) }% Y+ E4 |

1 m) c1 g7 C* U4 C" [1 m; i* a    ;其他的DCD, r' N! k% U  e

4 W1 ~+ h' t3 p7 V( w7 n    ;, n3 E9 @; F& R0 v

( U1 i: L( v. X" f) e; p/ m    ;立即数为0对应的SWI中断处理程序' ]& n$ g& H0 c4 b  V$ B
8 y9 W" R5 U; X3 _2 q  f
SWInum0
# W! U) Z. G5 M& Z, q1 ?& e* q( h
" f6 x2 d- X# C9 o        B  EndofSWI, g) ^( i; Z1 l% x  Y& \: z+ y

' K% X* i, f- u+ F# M% P! c;0 |0 @7 o- a  B$ v$ p* M- c- ^- [

7 O; m8 t; r( B. o; ?) W;其他的SWI中断处理程序, y, }( h, x; N9 K- `1 j% v

! T& j; o  Y' I3 u: Z- i;( q0 R& F+ o. B3 }2 s' {

9 _# l: Z6 O2 ~% S4 x; S, R$ w! K;结束SWI中断处理程序
0 I( x; c6 O  @7 O/ T. G& K
2 x9 e; p: Q5 f, t3 y        EndofSWI  X" }6 n9 @; y: j- Y9 n- G
7 a& N( `8 m. p

% U- U& ?2 ?2 ~/ k/ M0 K7 q# X% f1 N) d1 _4 W
将第1级和第2级程序组成完整的SWI中断处理程序
( `: v8 @4 l* p& @3 }3 |% p" ~  p0 K5 {6 }7 p
        AREA  LevelOneSWI  ,CODE ,READONLY
* G5 D" }7 s& T* Y  z& f, n  J1 m* b5 w# Z. F: C$ ?" w
        EXPORT  SWI_Handler1 }" O$ O1 y: S& ?. _

+ m& T7 ~8 J7 xSWI_Handler/ s" X3 U( d; ?, h) G5 c

. K' [! E( ]! F! s;保存用到的寄存器: m9 g! n4 R3 m' f1 W7 d6 ^
) p3 T1 Y3 v8 b2 _9 z# x2 s
        STMFD  SP!,{R0-R12,LR}
- I; d1 d& a! V  q- w1 n0 Y
/ z1 M5 N4 o% `; }" @, o& S# Y ;计算SWI指令的地址,并把它读取到寄存器R0中
  y7 `" I; b. c# j' J: x
8 B, e( _$ Y# E, o3 g$ a        LDR  R0,{LR,#-4}- c  n6 R: j- N

5 X  B. t4 M9 Y9 [. |$ k' y1 v0 Y4 ~;将SWI指令中的24位立即数存放到R0寄存器中" ~# ^+ s$ d3 d4 g5 T5 F5 o" _6 b, G
6 a' \! d0 O: t+ G
       BIC   R0,R0,#0XFF0000005 U6 D7 Q1 L5 B3 \7 ^
8 Q/ L% S- \1 K, w. f5 K
;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序8 J2 y! c+ Q; W) N- t
" o! ~7 @: P/ c6 R
;' ?& X# c( `% m, D3 @% o! V2 Q3 W2 j7 Q

: J0 T# s" A$ o  N) t9 F   ;判断R0寄存器中的立即数是否超过允许的最大值
8 x5 K& t$ s' Z9 q% I' d  R8 O$ W" o
        CMP  R0,#MAXSWI
: Q6 O0 s* H$ g0 q* O8 D" E. u" T( x' f! w, K
        LDRLS  PC, [PC,R0,LSL #2]
) v8 N* k8 }" [* x% [) I
; Q$ C. p/ L" L1 I        B  SWIOutOfRange- I+ Q( E1 n( ]" w/ m. U

. a9 L8 ]6 |( C) GSWIJumpTable
6 s! o/ E0 i( k6 ^, A; v9 k- i+ B
% e9 Y) u7 p+ ?% w# V7 u- l4 w        DCD  SWInum0
- T0 B, j! L9 t  S2 j1 I! |& c# d+ m7 ^) {
        DCD  SWInum1
$ Q! t' q! \2 A0 F" _. c* K+ d9 \! Y8 t% q
    ;其他的DCD
& k9 Q. J2 }* R$ w$ }* v) ?0 t# y7 r4 j: u! F7 s  P0 R& a
    ;
, v0 k# q. U( O) L% r# d. c% Q0 Z$ P3 m5 Z/ m- q
    ;立即数为0对应的SWI中断处理程序' y1 b/ L$ U5 w0 y( }; g) Z
3 _. ]5 ]. v8 `( S# [! x
SWInum0- K6 H" T4 H$ l) ~/ q# _
8 A$ H/ J9 V% E6 A* }/ ^: N" ]
        B  EndofSWI  Z$ j6 ]2 B; t# l# h
7 X: f( O3 T6 @, _4 B# P
SWInum1( B7 x: a+ `0 ^' C, R1 U6 C
/ g& l6 M7 j1 @) f# V$ R8 w% Y
        B  EndofSWI
1 z8 c- M' l% z7 e0 Q5 G% Y. X8 Y7 u7 a+ K5 ]. z0 P
;
$ J! w3 H& ^- H. e0 `4 g7 c* v8 X$ I  @) B
;其他的SWI中断处理程序
$ b0 t! p, i* p  q
7 i; X, R; n- X8 ~+ O;
2 q, H& v( @1 y& n5 J# H7 v& c, K1 _5 V$ M
;结束SWI中断处理程序/ N& S* F8 `. L6 d2 o

4 P$ o1 ]4 b, H* |+ ?) j, j- Y% N% ?        EndofSWI
' Y" l( |! v7 P$ s
# {( K; g: z! D, c/ G3 y4 p& M;恢复使用到的寄存器,并返回8 G( G* }# q) E5 V1 e& B
  Q. }+ o0 z7 h1 v
        LDMFD  SP!,{R0-R12,LR}
8 E% o+ G$ h& u, D; q  ^4 i4 F  h8 ~* Z; \% r/ B  q: B
        END8 a, W/ g; {/ d: V- w$ ?4 \$ J, R

! v2 s2 M2 e$ `# x4 M
5 \" V8 W7 F8 i3 ~0 a
2 j6 j+ X( ~0 R5 d* p第2级SWI异常中断处理程序(C程序), |4 B' r/ G3 t8 N) W+ d* |
2 @( l" B: s+ h" I+ _* i
void  C_SWI_Handler (unsigned number )! W5 f$ Z8 p# _% f4 e! D: Y2 Y
$ @, F" Q4 q# S5 `4 {" w
{' j5 t# {- ^4 j1 T6 [9 T6 P
      switch  (number)6 [0 g- B4 ]. _: T4 L

4 \! j) v& A/ z1 _      {
- N6 w# T# V1 c* |         case 0:
" g) ~0 T+ i: |4 a+ R$ b0 Z& d! P# J# s
       //SWI为0时执行的代码2 o1 e' l" o- ]4 ?

& f0 C# l3 K$ u        break;- \& B3 ?$ _4 |
8 j  C, a. b8 G, Q4 @! X
         case 1:, H6 h5 R* M5 n! H  a% E

4 }9 V' i$ K9 L% H: g- C0 b8 }6 y5 ~       //SWI为1时执行的代码, z  }/ T! \8 C
! `5 G2 F* z! c5 s8 T2 k
        break;( c# D% d# u0 |* h

" Y2 E$ k' D, L. E        //其他SWI号执行代码* U8 j. V( t6 e; l$ y0 s# g5 C; c

- j' k- e" t) g) D/ G* s3 _
$ S  r$ X5 E) _, E) G% W) v9 E4 X$ {% x8 w+ N
       default:: E. V) C  E& C
$ `$ v/ t% t0 ?6 t% R2 r* z
        }2 N3 U$ E$ c& v7 F
& ?$ f/ ?  ^8 O
}* }# M+ K1 a/ |. U7 w& K; a

/ m' Z3 e2 L. m/ J3 u * W9 p; H9 @# \# T, ~: E
% x, h% L) E$ |7 L! J
一个完整的中断处理程序为C程序的SWI异常中断处理程序" T3 Q+ K2 K9 O# V" T; H, Q7 J+ t. X
  ^6 N+ o% s+ q, T( q8 L  y! R; Y
        AREA  LevelOneSWI  ,CODE ,READONLY
$ B8 Y# X1 P# b- K5 v1 \
) \, t" y/ k/ L0 [1 M        EXPORT  SWI_Handler
" z" P6 N- D" H# Y6 @+ p$ n) I% F0 s$ ^; e- B* ^$ S
        IMPORT  C_SWI_Handler
0 ]- O) ^$ A% d9 ~: F3 z) m
* y0 d' @$ |2 i6 ~0 P, P. sSWI_Handler
7 q, |5 v" I- Y& Q  i7 a8 O+ Y; z: F/ U
;保存用到的寄存器* q& A" T% {6 E9 D

0 e. D% Z  W7 O$ C( P' }        STMFD  SP!,{R0-R12,LR}
5 O! {0 m0 q% B/ q
. O" y2 h7 [; ]7 G ;计算SWI指令的地址,并把它读取到寄存器R0中
6 g4 a7 \9 Y/ `6 M* @& m! T3 }
* @* I+ a/ f! K0 ?0 |& M; m        LDR  R0,{LR,#-4}
5 ~" ?2 e1 _) V& x5 }$ q: L' z! [' [3 w9 U
;将SWI指令中的24位立即数存放到R0寄存器中0 h0 A! l! [1 k. {3 A* b! ~

4 o9 ~; @% S# z! D3 o+ H       BIC   R0,R0,#0XFF000000
$ B; A2 E$ r3 D5 _" H; ?
, T- h6 N3 |% ~) @9 J;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序: ^6 s( T" R5 ]" v2 k
! }1 F1 s1 ~! c+ L) c, C0 S
;
$ H0 P0 h  u, j" B" Z9 R( I6 Q" {, R* ]- Y% K8 J( K
       BL  C_SWI_Handler
5 ]& W+ m2 B  Y0 z# @/ I: X$ g$ y$ H$ W) {; D' A+ G2 t
;恢复使用到的寄存器,并返回
' l( O9 R0 {5 I- T' }0 L  g% F, N& g2 ?6 m& i& l* w/ h1 W3 `
        LDMFD  SP!,{R0-R12,LR}
, \  K1 f- ]  r5 j, c
$ S: }. J" Q3 B; P2 M6 U        END
3 T' D# S6 J- L+ M7 A" t, |% J& q: D% H6 |/ ?# f

/ F) \& u$ y& U# l2 P5 ]) _0 y
" v, \- H  b& P  _! G8 e" H9.4.2 SWI异常中断调用
: T, M4 _& f0 C& H7 e% k: F" t4 g) |/ I) P1 w$ y; O) K
1、在特权模式下调用SWI
: K; n$ @% k2 o# S# f$ F
, P8 r5 A4 b$ h+ [$ t1 N2 ~;保存用到的寄存器,保存R14_svc
: U- ^- {% \  c9 S0 y6 O! g1 e6 j1 Q7 b& L/ I1 [# @  _; f& {
        STMFD  SP!,{R0-R3,R12,LR}) u4 E$ t( V1 L# K, q8 h8 E( t
( T' z4 l4 S' M6 q! U, B
;保存SPSR_svc+ g4 p4 s6 x) \
* ^% d4 Z( A; q. o
        MOV R1 , SP
* M" N  x+ ?0 @! ^2 s- M
; f$ a2 i3 g. r' R2 k2 Y        MRS  R0,SPSR& x. V& F' v5 L4 ~' O  `
. R# I0 y1 ~. `. u7 q8 U% m
        STMFD SP!,{R0}- j6 a& G' X8 G/ Y. {% s0 ]
* u% E* L  E9 R2 _
        
: H+ i" g% X( C6 Z! l: K
, [8 ^" L) Q7 g! M% W: Y9 i;读取SWI指令
( V/ N/ M3 N+ l2 U5 ]9 B! @) C5 c4 [
        LDR R0,{LR,#-4}
- {% f3 c. U( y4 a9 r: a' t# `  J/ ]7 R# H% Z+ Y
;计算其中24位的立即数,并把其放入R0) z% ^5 Y- O; `8 B# e8 f/ Z! o* a

; c: x& s/ L7 T, z       BIC  R0,R0,0XFF000000( c& k4 \- J& U2 Z1 x& ~: I2 [# E
5 B! A! r0 \3 A
;调用C_SWI_Handler
; s$ c, b6 u/ r  i- F* x" |8 @7 H  u; N
       BL C_SWI_Handler  M7 Q* q2 h9 W+ n' L
& c# N9 N$ h) a$ j4 x9 b
;恢复SPSR_svc) c7 N8 z% D4 _2 \7 l& }8 ~# m: L" X
2 v+ b9 |+ i& j( S% o
       LDMFD SP!,{R0}
& K; w, C, @5 Y# L& d2 m6 O* i8 [9 E& W5 n
       MSR   SPSR_svc, R0
; i3 I  ^0 j# ?1 }2 u8 j8 n( T9 j6 n: S- X! L
;恢复其他寄存器,包括寄存器LR_svc; x# K3 C2 V8 M! _  S

) g# ~' U; W; b. i       LDMFD  SP!,{R0-R3,R12,PC}^/ R& ~' x; d( W7 i* t
8 f5 ?+ k3 d7 L& D; Y6 e5 {0 r
4 l9 A& \' {7 d1 Q$ y5 Y0 A

: c. {3 L" ]* c2 W7 u: g+ X2从应用程序中调用SWI' D& Q0 O* ]: F& r
& W) R" u4 U2 O5 R
分两种情况:1是使用汇编指令调用;2是使用C程序调用
* L& x, y1 l# i0 b  L/ v8 Q, o: s& \! E3 ^
汇编调用:$ m, B0 ~7 i  _9 B# ~' d

! ~- C1 F2 T) d3 [/ ]) q  @          MOV R0,#100   ;将参数放到寄存器中5 t+ a- J8 B2 A8 z4 e8 L) b# x

9 t8 g. P$ Q4 i9 V          SWI  0X0         ;调用的SWI功能号4 i6 ]  x# S$ Z: W
0 E& v+ o1 O* P& Y( J
C程序调用:
; t; O7 t5 `$ k, u) l: m# @7 _7 C6 b% `& S
//头文件swi.h
+ t. d* ^' v: m' D% w
9 J7 S9 G; v' O  R- ?6 B. K! i3 e__swi(0) int multiply_two(int, int);
: k6 R: X2 s8 r7 E6 A7 y  x__swi(1) int add_two(int, int);; e$ A2 R+ H  i8 S+ W8 @' X
__swi(2) int add_multiply_two(int, int, int, int);
2 s4 l' a4 D. o; J2 Q
) Z4 Y. t. c8 R5 y& f. _/ qstruct four_results+ j+ w1 C8 T8 O( l: J
{
9 o- ~5 Q2 O3 u5 [' |    int a;
" P9 D& E. _. K+ k    int b;
$ m! b# l, j; k    int c;! a0 @- _7 g" C2 ^' p( n/ X& C
    int d;
; {# I' j* L  @7 T) `};) \% Z7 O. l1 w4 g; P  r7 S. z2 g

1 C5 p& l8 r( u: G5 i2 A" ^/ a" ~__swi(3) __value_in_regs struct four_results$ X. e5 y1 ]4 |- _* f
    many_operations(int, int, int, int);
9 l9 R7 }. ?) l% D9 u' }+ b: U2 \
/ s( O- O" G: D+ Q: r  Y
& W! @* @- G& g5 Z+ |3 N
2 _, W% V: k+ ?# g//主函数
% [9 \  V4 @& I4 s, S/ N2 \- H% ]) o2 s
#include <stdio.h>
* \& q. c. p0 o0 p( g( g) C#include "swi.h"
% _! d) N2 k1 w: t( N2 h1 O% F3 d1 N: Z
unsigned *swi_vec = (unsigned *)0x08;- E" u. _/ X/ T2 F& Z
extern void SWI_Handler(void);
/ R  q; p9 c/ H  X  P% N4 F( _- c+ p0 {$ U# n6 E# Z3 c( V

3 R! |* x0 c# n# S0 f( n: y: y0 n) w) p6 b- m8 {: F
//使用Install_Handler()注册SWI异常中断处理程序
6 q: l- b9 W, O) r$ z# w( O6 E5 G9 C9 h' O2 Q: ?( F, N* \
! g% T/ R+ c4 R/ A, B# [

! ]2 f4 \/ E* ?2 _5 }  e. Funsigned Install_Handler (unsigned routine, unsigned *vector)* W" Z# N" }6 B9 D9 Z
/* Updates contents of 'vector' to contain branch instruction */9 e) a1 {' k8 S) g" \
/* to reach 'routine' from 'vector'. Function return value is */
4 T2 T6 C' o# P3 f/* original contents of 'vector'.*/  t& E$ u1 E. m$ k# ?- c, N% @' J
/* NB: 'Routine' must be within range of 32MB from 'vector'.*/
9 r# v% t  B: P# x& m  X- H) a6 G( D
8 ^0 L2 S( M6 Q  u7 Y{   unsigned vec, oldvec;9 N* R4 `7 g- r; i! [& M, B9 u
    vec = ((routine - (unsigned)vector - 0x8)>>2);
9 a) ^; {% C. Z* Y8 d0 X1 _    if ((vec & 0xFF000000))1 f3 x6 J* w( {2 H% g
    {
- @6 u: a( a9 y& U+ t7 L        /* diagnose the fault */
3 ^; s6 ?' \# b# v9 _3 F% H0 f        prinf ("Installation of Handler failed");
. m" p8 e1 Y+ a2 }: C1 U8 l$ M& q        exit (1);
) \5 A1 v! I7 _$ q8 H! b    }
; j4 C+ U1 Q, B% z    vec = 0xEA000000 | vec;0 e6 L/ y6 y; z3 @; [0 v2 x( d0 D
    oldvec = *vector;- F8 m; I/ [. P! l. B% G6 X
    *vector = vec;7 h5 c' s5 m* e- @5 r1 V+ P; i
    return (oldvec);
! y2 z0 l3 Q$ e% T}
  {  }) r* S0 P. C
2 l9 C( A; c" J
* o/ V. Z* L& {# u* p5 H, h/ G7 `0 C2 i& ?# Y
int main( void )) m' U' }4 w7 ?1 T4 W; }, }& M2 x; j
{
4 G# y4 l3 b7 E0 g: j% l    int result1, result2;
7 V7 n% H% T; ^' J* D    struct four_results res_3;9 |/ t) [& {# f$ |8 r
    Install_Handler( (unsigned) SWI_Handler, swi_vec );" j' p1 t$ A1 w9 j7 S
    printf("result1 = multiply_two(2,4) = %d/n", result1 = multiply_two(2,4));) [6 m( @' ^/ F5 l
    printf("result2 = multiply_two(3,6) = %d/n", result2 = multiply_two(3,6));  g  e% x% V7 B9 [
    printf("add_two( result1, result2 ) = %d/n", add_two( result1, result2 ));
3 e/ k" X+ N; V& x    printf("add_multiply_two(2,4,3,6) = %d/n", add_multiply_two(2,4,3,6));6 X/ L& c; w- i7 l, {6 t& r
    res_3 = many_operations( 12, 4, 3, 1 );
* n5 s! h0 g2 ~/ V/ M0 L    printf("res_3.a = %d/n", res_3.a );
# O" \1 n4 {: `+ p1 Z8 M$ p3 @' M    printf("res_3.b = %d/n", res_3.b );
  }6 V+ \) `# V! Y) ~- B    printf("res_3.c = %d/n", res_3.c );) [0 Y  F+ ?: o  Q1 y; \
    printf("res_3.d = %d/n", res_3.d );( {/ ^. R  L' [7 c# o: W' N
    return 0;9 }( f6 u6 r( C! f3 }3 s
}
1 D8 E9 \, t, P! x9 J
4 {! G% t8 j6 x& } 1 q' f( y! Q2 W4 f5 g! p

1 g; m1 N& W7 `  ]8 ~//第1级SWI异常中断处理程序
8 `. X6 o. J7 M% h* `8 W: A! E  o. e' K) P
        AREA  LevelOneSWI  ,CODE ,READONLY
- q" ]( i- R* |, P5 d+ W% M( o+ }2 n1 w
        EXPORT  SWI_Handler% S5 m% w" X' K8 O. a) l! m
6 c; C. \6 P0 |* r' B
        IMPORT  C_SWI_Handler7 @0 ~/ H" V/ T* x
1 \4 M# j: ^# T1 f8 G6 O
T_bit      EQU   0X20$ s" M; e3 B7 z8 D" |6 _
$ Y6 ?2 R, ^& R/ r" q5 e
SWI_Handler) H' s$ k9 j; G4 d
2 n9 N8 L7 V; v) ^
;保存用到的寄存器
: g* N* W* G* z% u$ P2 i3 w, O9 O4 F+ L4 Q& m
        STMFD  SP!,{R0-R3,R12,LR}" s" C# g, o( a; \9 X
" h' @) x/ D5 E' _3 A  Z" R
;保存参数  @9 t- s6 J, f/ R4 n

9 o$ [6 n( ^+ {+ [" D  k- s        MOV R1,SP
6 ?$ t( ?' ]% ~* w. A. ^* Q1 H* ^; p1 x$ B+ t! U
;保存SPSR
/ I5 F! S1 m" y# Y5 I  y3 C2 x% ?
: M$ Z$ l4 l* H        MRS  R0,SPSR
; j  N6 b. D" e$ D& I8 L
* |# |: a( X# \. i2 `1 T& [( i3 L        STMFD SP!,{R0}2 `! @& H) a4 O* B1 x

0 I9 M) b& A3 @        TST   R0, #T_bit
, ^, n; X# i- Q6 Q. O; L) `
' U" c7 O2 x( D5 a0 x' F8 s;如果为thumb状态
  b) o' z" a! B5 t1 i0 `; g
) e  s+ I# ^% M$ l  R        LDRNEH  R0,{LR,#-2}
4 Q- Q+ p  Z; E( N" {$ w6 v& R9 U4 s! R7 q" J$ \* m& y
        BICNE   R0,R0,0XFF00
4 _6 U' V  ~; |  M1 @5 u# w; g5 d7 D) p
;读取SWI指令' s* Q2 Y- M# j+ i( ]
! \- C' I) Z3 b
        LDREQ  R0,{LR,#-4}
) @' w5 c; ~* z$ [) f& }, X9 [4 B; G5 B
;计算其中24位的立即数,并把其放入R0% q$ X$ P2 S0 r) _; V8 F
8 [' g. u# G4 b5 `) Q* L+ v
       BICEQ  R0,R0,0XFF0000008 i* w* s( z" E2 L8 Z
' d" d  @6 ^' R
;调用C_SWI_Handler% n, }/ A8 O9 D! q, Z9 Q- R
9 O- t, J# K. p9 S5 f
       BL C_SWI_Handler
- V5 i( B8 L  q" g* Q2 n# Y; \2 {1 \; i0 n; X' C' Y$ \2 w+ A7 e
;恢复SPSR_svc
# N3 ]+ k/ R. X8 H6 i3 v4 L
/ q" ^$ n; m/ |6 X       LDMFD SP!,{R0}, \( B) k' ^9 k6 T; m* Q6 \

! l0 _  i0 B5 t3 Q# X6 T% B! {       MSR   SPSR_svc, R0
$ u/ B7 K9 d& Y8 J. f( ~* c! N$ m( X8 W7 I
;恢复其他寄存器,包括寄存器LR_svc
! C8 W: o! }# g9 V7 U
: ~5 Z* F6 F2 [6 A0 F! P0 f7 O5 V       LDMFD  SP!,{R0-R3,R12,PC}^9 c6 l/ q8 Q% o6 w% b5 x
! P2 `: v+ ]' L' Y  Y8 g
       END
, N) A. f) d  E, _
5 y; p, O% }: f7 H# J/ L, o1 J8 }
# d- {8 v+ ]. Z. y2 W0 \: {) V( v; U6 h& R
;第2级SWI异常中断处理程序' o7 C# l* @3 A, H! M

: t( k9 `0 E  Q$ d6 a! x: `" Y" I9 ivoid  C_SWI_Handler (unsigned swi_num,int *regs)
- [) w9 _2 A0 y' s" t
9 f7 v: U  E4 J- }' V" U{
( f; q! G! K3 P: R  T9 [/ o      switch  (swi_num)7 C) @( P; r+ H8 w7 P  X# l

% s8 R" \4 F1 L& y3 f% Y0 A      {: e& v/ l& W: k. X, {9 G
         case 0:( s7 c  V4 k; w

9 U2 I) Y0 Q- z1 p                   regs[0]=regs[0]*regs[1];; d- S: g2 V) S. @# s) _( ~

; S6 M4 ^+ S/ ~; f1 @- {# Q        break;
& i6 t, B0 Y. }3 J  @
5 d8 l# y  x9 A6 Q1 j/ i" g         case 1:0 W9 Z9 O+ G$ [& e# w/ V
0 R5 Q4 Y- y. w  X3 T
                   regs[0]=regs[0]+regs[1];! d$ p! e- o! T- F. Y% R. M5 F
" \8 Z, {( c: R1 S3 `0 a
        break;+ a: A/ P; r% t

& b" l( y* a/ Z$ T* @" C7 T; k         case 2:9 d+ S1 ~# t+ P, A
' }, L3 x) x/ }3 Z- {( d. Y
                   regs[0]=(regs[0]*regs[1])+(regs[2]*regs[3]);
' o( d! `, D& j0 ^  Q: v1 S0 v% B6 [- q, a9 d  Q! X
        break;3 x- ~$ u9 Q! F3 n- Q4 t

9 A; _2 l* r  N7 o9 d         case 3:
* t7 G2 ?; I& i/ a
9 n; |9 [- b! u2 @3 ^$ O          {! b: G+ j/ d$ j/ x* h# G
              int w,x,y,z;9 r+ }1 g8 q* L8 x/ ?
8 J4 Y' O8 H9 w, k& c% g8 i9 l7 f/ x
              w=regs[0];
& ~% j+ H8 w  B( M) }5 n$ o& |% H5 @8 O' U) ~/ Q
              x=regs[1];( j0 P' @, y8 p/ w0 |# h/ `4 v
" O/ A# T4 z4 t; H- O; E* u
              y=regs[2];8 J6 M5 R: ]: g$ {  s6 F4 w
/ W' ]" n: ^( S! H9 y
              z=regs[3];+ Z% F& n# K# h) w6 Z  ?# G

# ^4 J: A6 P$ }( O
; o, Q5 X% M% |  |- P1 z
% }1 _1 q" \$ q5 A; y% `              regs[0]=w+x+y+z;7 [/ m. I+ F4 @
. r" V$ t: a1 ?) H5 k4 _
              regs[1]=w-x-y-z;0 }& W. Z4 }: s5 K6 U
  v- n8 w* H- B7 r
              regs[2]=w*x*y*z;
: R  c3 ?# C$ q0 B. |, n, t7 h6 G2 f" N8 k# w! y2 X* ~
              regs[3]=(w+x)*(y-z);5 D! T: o( t; O3 B3 }  P

1 H0 |# s0 Z5 m            }+ z" a' [' y% |3 v& ]% y# v% P) D

6 d3 l- r5 P6 ]) S( F0 V/ G3 a          break;
- \; R1 b& B+ M" v
+ F* t6 @, y/ M3 }( E' ?8 z        }
4 H) J! q9 ~9 t! }  D
$ ^) _$ H6 J1 t6 a( y9 [}  a7 }3 X( V, Q  k

; H& N, R) x- S! w! c  w- ? - B6 a4 {$ Q$ J+ G1 |

5 k5 K! }8 v  z" M. F' x. d0 j& l- J3应用程序动态调用SWI
% k7 ^# V5 v+ \) @6 B3 V
" u$ h+ t9 j# b+ d- f1 i#ifdef __thumb" [  v7 j" S5 o! E0 `' S. }& g+ v
/* Thumb Semihosting SWI */
2 e2 z$ d; t. x#define SemiSWI 0xAB
" |- o: T. F' q0 n#else7 q0 L& C4 M3 o% r
/* ARM Semihosting SWI */
" A7 W/ H7 I, y# a1 K#define SemiSWI 0x123456
3 ?5 N; _1 s) ^+ t#endif
0 v, c# B% o) @3 C
' H. X: s1 C0 x- U/* Semihosting SWI to write a character */ 6 ^4 o+ ]+ a& _; o
__swi(SemiSWI) void Semihosting(unsigned op, char *c);
  y+ c3 Z. q/ y9 [; {6 U! U#define WriteC(c) Semihosting (0x3,c)( v4 |1 b, L" Q6 x: T

/ c7 x$ Q( H. Uvoid write_a_character(int ch)$ ~. [( h( O% J/ v4 t' G
{3 L$ n& u* S4 Q9 d) [- O& e
    char tempch = ch;
- e: l: e5 I9 _6 V4 h    WriteC( &tempch );6 \: k% M8 e, O% c
}
8 B2 M& \" w! X2 z- s) W: V; P* I
4 f' Q* H+ z9 ]
* l! ]7 ?0 }4 |

该用户从未签到

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 22:18 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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