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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

( I- v. |/ h  M  S9 `" A7 U9.4 SWI异常中断处理程序
  E' D1 p: _# I9 n( d/ s! l) A: U1 U! I
6 g6 O9 x) j" l% H在实时操作系统中,通常使用SWI异常中断为用户程序提供系统功能调用。8 u* R( Q  l& A
" g/ B' f% c) T: e5 f
通常SWI异常中断处理程序分为两级:( O6 p( e  J( s! H# H
6 W1 \; X$ I( A4 f! u7 n2 L+ c
第1级SWI异常中断处理程序为汇编程序,用于确定SWI指令中的24位的立即数;
6 v& g4 d0 S- r- V. ]2 Z! X; d  I
第2级SWI异常中断处理程序具体实现SWI各个功能,可以是汇编,也可以是C程序。
& S* {5 I6 {) w/ N; a' R  O" }2 q6 t$ _
$ _5 [" A  a& D+ V
& l/ c6 o7 p- D- u( x
第1级SWI异常中断处理程序
' u2 L8 p9 H6 |4 D1 \5 b, o4 S% x8 X: M9 i# F
        AREA  LevelOneSWI  ,CODE ,READONLY
5 S# _" V6 r  u( [+ i$ D9 C' m
        EXPORT  SWI_Handler# d. y! l3 B; k& v$ [4 Q

4 A( P3 ^- n" u) y8 P# LSWI_Handler9 J" \+ W) a6 U6 s5 z/ a

4 G7 c, F# ?2 n0 F2 ?8 ~% y1 W+ J;保存用到的寄存器
" m: @. Q3 q* R; P2 ~4 u$ T! J% t+ w1 A8 C  P" q
        STMFD  SP!,{R0-R12,LR}
; _( J0 \9 i& K  E" E% m! k) l$ q: k
;计算SWI指令的地址,并把它读取到寄存器R0中" N4 n4 N: ~4 E9 Y: R
  d0 p0 g/ }6 }" X
        LDR  R0,{LR,#-4}, e9 E  B! @% h! R4 O- @" n; E
) O4 u! u8 x3 [
;将SWI指令中的24位立即数存放到R0寄存器中
8 E1 |/ U/ N. [8 P+ x) o: e( J) x6 h
       BIC   R0,R0,#0XFF000000* ~# ]& e/ e1 m& N) r% ?
4 {  q! ?7 V) S. l% F
;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序
, P$ I/ h1 k1 l+ m* }1 r3 R) j2 ?1 w4 h
;8 F0 y1 [7 Q' z! q6 p* b

, U$ P, D6 w5 W" N& c- a* q;恢复使用到的寄存器,并返回
- o  f+ g' ^/ w) W' L3 r+ \% K4 \/ Z# X
        LDMFD  SP!,{R0-R12,LR}9 B/ _2 r" O8 Z- L/ i( c

. _6 H4 a1 z+ X6 }        END% \; h$ n+ ?# z# H

6 ?4 o3 S, ]  p# I# _, M ; E4 [- K  L0 v- [  p/ U8 z' _
& A1 @9 ]* r9 Y9 {/ T# M) W4 q- Q
第2级SWI异常中断处理程序(使用汇编)! L6 q0 v3 p$ _9 k8 U
/ G% z# C, j" C8 T" S
   ;判断R0寄存器中的立即数是否超过允许的最大值$ ]3 T" m9 v6 r/ u0 a( w
+ `& }, ?  q' p& ]/ b
        CMP  R0,#MAXSWI2 y$ a- C5 o# B2 R; W
% g  O) ~/ F* T& `. p( `
        LDRLS  PC, [PC,R0,LSL #2]' E" a. r3 o$ t. n) h
1 x! a' O/ Y. P( ?- @: E, H- L1 F
        B  SWIOutOfRange. `+ p& |9 z4 c2 {

9 s5 E3 k: p- p% V7 H/ Y+ h+ k$ TSWIJumpTable/ E+ P) ?& M  r

' c' {) D9 W" b1 h7 ~. q! P        DCD  SWInum0# i9 q4 m' C' M7 Q

$ T% Z0 k. u) E! Q; B2 o/ U; n        DCD  SWInum1
; _2 r" E/ `" b; u  Q4 X+ a1 F$ Q# X
    ;其他的DCD
7 E8 x6 D, V1 T: g
. s7 S1 R; E/ p    ;
/ J6 b# A, k' Q; b# n  }9 D& Y/ O; O% l# e
    ;立即数为0对应的SWI中断处理程序
1 y  h# S' r7 Q9 k4 W) U' \
; H9 q" U7 R  M0 b' [# @4 VSWInum0/ }6 P6 b! B+ J, z

# f+ |. H& ~4 B9 F) Z) e9 K/ d        B  EndofSWI; j( g3 u  r) ~9 k8 q
, z+ Y$ N: G4 V' v
;! R' c3 D) Y2 x5 x, {

( d$ \2 t/ }' R5 \2 `5 N0 O9 v" K;其他的SWI中断处理程序4 d/ C/ j7 _5 h2 w8 Y! `/ F6 ]7 w

4 P/ n# Z" Q8 A3 [9 b; Y% Z4 g;+ j* [0 Z9 n% v

/ g5 F: N% R1 |3 K;结束SWI中断处理程序
' z& s: C0 X# a$ x5 W. }! w4 p" H8 t, A* ~* Z% ]9 K9 m1 C
        EndofSWI
2 A* Q; c' X. o' p9 @4 J4 ?( Z4 `. o7 B# ^1 D, l$ \( h
  U) ]! g/ w. Q& e8 x. C+ V

. d! A  g$ r9 D: Q* I& a3 B将第1级和第2级程序组成完整的SWI中断处理程序; R( [* v  x' z7 h! t6 s

/ h" o6 R& D# Q" S1 D        AREA  LevelOneSWI  ,CODE ,READONLY1 k0 s: ]- R5 t7 \0 A) W

9 {* d! k$ n2 [9 }        EXPORT  SWI_Handler
2 N4 V6 i8 c. c0 q7 {  F
; E( M2 `% @2 N1 ZSWI_Handler
* L2 M% ~+ I$ y: L# z9 Z9 x: O) A& q+ c# g
;保存用到的寄存器
: |; h- z% ]/ f( g  S
9 _  T* Q5 l3 b        STMFD  SP!,{R0-R12,LR}
" W9 m5 ?& s: ?9 H1 J1 U( n9 B+ n
;计算SWI指令的地址,并把它读取到寄存器R0中, v) b2 I$ Q# `; d8 S

4 n) u! J* c: I5 h2 z" e  E        LDR  R0,{LR,#-4}
; n) o6 y$ B" C; O9 T$ v6 X5 d; B' m4 E' t& W0 ~& }5 h
;将SWI指令中的24位立即数存放到R0寄存器中& e5 d) r$ |5 t! _% C
2 E, E! B! B" k' w( e0 R
       BIC   R0,R0,#0XFF0000000 I7 D- {* r0 l, l

/ `/ p8 P$ v, G. ]! j;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序
) E- q/ s( T1 n! u( V6 Z3 ?+ I: V) _* w+ T% h1 E+ Y
;
6 i5 f& y& Z# S1 N7 f
  P3 i. W! T7 t/ \; c, K1 @$ z5 t! T   ;判断R0寄存器中的立即数是否超过允许的最大值
- L: [7 T5 r& c6 K; W  ]4 v$ L) Z& |9 m/ w3 W
        CMP  R0,#MAXSWI
* O  c( _% h' j  W/ K: b: Y$ y1 d1 ]9 `: r; X2 U
        LDRLS  PC, [PC,R0,LSL #2]
1 \1 J$ d; ~, {: H, k- L5 Y6 m! {" w' i  g0 o: R7 P4 B6 o3 u
        B  SWIOutOfRange
$ M, j0 s2 k+ b2 c2 S
! e7 K( O  Z5 c: ~  U- BSWIJumpTable/ `; H, U) \9 B1 h* \. s  O5 `
( n% ?4 }  v1 W
        DCD  SWInum0
6 X- O0 ~: y7 ^! k& ^- t8 R5 ?4 _" i# H+ j
        DCD  SWInum1) {" E9 x; U, N, v9 s0 q0 c7 h# ~

1 l$ I+ M+ m8 H9 x1 z    ;其他的DCD
, k* H0 i5 n& F& l8 n6 Y" D
/ N. C& i3 ^! Y7 J* {    ;7 `; h  d: d8 X* G4 d/ Q) u

/ U$ g* ^7 X0 N6 w4 u    ;立即数为0对应的SWI中断处理程序
; I3 ^8 C1 J2 h' z7 g
) O+ J+ Y% p" nSWInum0
- \8 k0 @7 d% _5 e4 F; O4 K
- U& w$ i" c9 K1 J        B  EndofSWI2 O! b! ]9 o7 t$ D3 Z' i- j+ ~

4 V, H, W2 G: W9 n6 BSWInum17 N( ~# F. N2 b6 A: a8 k

0 O% Z1 ?; R, X) k6 F' p        B  EndofSWI$ ^8 i) D" `% d) L+ ~% k
) H/ F& y, H7 u0 v
;& w: `4 T1 D1 ?

& y+ g, n: O4 X, I; N- m;其他的SWI中断处理程序
& p! a& F0 F, g* \+ ]0 e2 `7 w+ N6 p, k! x( F: m+ ?
;
4 @  I: |# V" A% b
( {; R1 Y8 U/ X& r;结束SWI中断处理程序
& d/ _  q. }0 v3 d  i' H" {( b) C: B# g. y
        EndofSWI
2 w4 W$ X  W" ?- N+ P0 M
. D9 ^* q& @( D  t( A- ?% m2 K;恢复使用到的寄存器,并返回
& ?, L# f, }; u9 H) K; x; R4 m/ O
1 H1 I$ Q7 i& z9 S        LDMFD  SP!,{R0-R12,LR}
. g( K' m8 n; f3 b
, F0 L4 o2 a3 y3 b+ Q        END
  _& p# }8 r* o% P, F( @$ }( E  h( L' D
2 I7 M& t( T: A# ]3 B: L& |0 a

9 k3 ]6 }- C+ I2 W第2级SWI异常中断处理程序(C程序)8 S' S8 u' e. g0 Z( D0 T6 S; I

) f- M! `9 m- z4 \. X7 w: Tvoid  C_SWI_Handler (unsigned number )
/ a+ P/ h5 k, `! s7 h& L4 {) @% g0 @
{
( i8 j- s- ~, @      switch  (number); v9 \, ?, v; m( T9 i9 U4 h- k1 L1 x7 e

9 S' ]- {- O1 _) F' n      {
% T  I; g4 @1 U7 T         case 0:/ g% @( t) `' Z+ D' |
" ^% Z; J0 `: v8 T# ^5 J
       //SWI为0时执行的代码, |6 d7 V& ]: v# x# Q% C

2 a) e/ N$ T* y; }        break;
! E8 Q( O) [6 o0 ]: P8 M) [$ E" p% {( z7 H4 R, H
         case 1:
" o! k) w$ B( C" A3 D0 u) u  ?* }9 l4 @( @! e
       //SWI为1时执行的代码
8 |6 S  ?0 p5 B; ^- T
" [6 ]1 D6 }. C% s; O2 ?, Q' h7 }' [        break;
7 T4 V- _8 f6 o4 H, W8 l2 ^/ E& Z- T0 o) O) A- L
        //其他SWI号执行代码
) B* W& W  T5 Q, d' S0 m/ K7 i, ^* A9 m" W& N- X
" f- ~# D, d; \8 U  t) x

; R! S9 D# {0 M7 x8 D       default:
6 e4 h* q# _( y
9 P/ @" ^8 {; m7 M6 @& l3 c        }3 W: m8 }0 ]+ H
6 o; [- J/ {6 X4 J4 }
}: P3 E/ @3 B7 y' ?- E3 D1 N

, d. U/ V. K' g$ m7 B6 z 4 d1 W) L* l# }7 h% [

" K0 E' j. N) k* ?+ l  C$ s1 ?4 O一个完整的中断处理程序为C程序的SWI异常中断处理程序) z( z$ ^  D; A6 }: d8 e# Q

1 H; z6 D0 R4 g( b2 V- O0 U' P2 u        AREA  LevelOneSWI  ,CODE ,READONLY
) v# D$ B( `% E/ C5 F) Y& z/ m& e( y( @  X' L0 o4 ~! M; M" W6 l; \
        EXPORT  SWI_Handler, E  h* {& v& {9 h# b
, u. P' n; h$ A$ c9 G
        IMPORT  C_SWI_Handler
% b# e3 J. K( C- C' r+ [. ]
/ Z5 H2 C. A: g7 L( E0 iSWI_Handler
: u; g* ]2 k- O) Y! F8 T' ~4 |, G* ]4 r+ y! z
;保存用到的寄存器/ d6 ~! S, j2 h" _8 [
/ {! a5 v' j' e; e
        STMFD  SP!,{R0-R12,LR}6 u& U; W  g9 _8 {
: o( e& w9 [! @
;计算SWI指令的地址,并把它读取到寄存器R0中
3 X8 X& a& E5 ]' q( Y3 R- s4 d
9 ]0 E, O, W. _        LDR  R0,{LR,#-4}7 Y  S8 E, l" h0 |, j
7 j+ A# o' V" Q
;将SWI指令中的24位立即数存放到R0寄存器中8 V  y; Y7 w8 r. m7 N0 I$ G5 M  l; k' y

- L( Z( R% I7 D& _4 X3 x" g  o       BIC   R0,R0,#0XFF000000
, ?' l1 S7 s0 L5 a! y
8 M/ h# q' Q" d;使用R0寄存器中的值,调用相应的SWI异常中断的第2级处理程序
$ O; e  a9 j' ]. s2 r7 |
0 |' z& B3 w8 o. X9 Q4 I" q1 s; z+ K;
, ^1 e& j% t  t% o% t: J) j/ t- F4 ]
. R6 s8 g+ u( ]4 U       BL  C_SWI_Handler
9 F+ y9 m5 c4 L5 @% k' a! q, S9 n/ j2 j% k
;恢复使用到的寄存器,并返回! f- `5 G; v/ K% D, H
/ t. W0 n4 [, @- w+ ^4 F' o
        LDMFD  SP!,{R0-R12,LR}2 b8 {9 F' {" j" L8 V" G

" i1 V# y9 h7 h7 f6 Y* t) K) k4 U        END5 z7 J0 j$ u3 m3 w) i$ r8 O

! y( L: _6 Z  n6 ~% }. c6 [
5 J# j# B( N) \/ n& E2 Z2 I: U1 y# V$ l7 [4 L8 J
9.4.2 SWI异常中断调用! E' J: i) ]% ]. J  s
9 @* x1 n+ X, N: a% m5 ]! y
1、在特权模式下调用SWI0 {; Q% B5 \) t" ]: I$ d# ?
; e( H# R2 S0 ]- v- ^0 |! S! N
;保存用到的寄存器,保存R14_svc8 n* D3 @/ b1 P5 y
3 j5 C8 z( \1 V) q$ Y, ^% W( [
        STMFD  SP!,{R0-R3,R12,LR}
2 ]) ~2 D. A( O5 q) `* `4 p, Q: j  w' a& `6 o
;保存SPSR_svc# k5 s5 w( D! p, I+ [- N1 C
0 ^8 e2 t/ o( o/ ^! B$ f
        MOV R1 , SP
/ a) U4 c9 z- a& v8 N, ~3 J9 J. F
$ v- k( G. |- D4 D        MRS  R0,SPSR6 ]5 D5 N$ }6 B' @1 N! d
# z! U7 j& B2 f, K  Q+ {
        STMFD SP!,{R0}, v" d% ^" ?) a$ Y

! A6 k% O) h- R3 Y+ c  K        2 ?3 Y5 H) ~# A0 f7 j3 }1 k  y

5 V: U" E: c% X( R6 v;读取SWI指令! v/ \2 y3 y9 e. y4 @4 M1 u7 u
4 w6 b' l/ \- U. a
        LDR R0,{LR,#-4}% G" o2 c; P& Y' W
, B* E+ U+ ^- d/ E( k& o; E. l
;计算其中24位的立即数,并把其放入R0
  W5 N0 B5 @& o* _3 M! d  |' u" i% b% x
       BIC  R0,R0,0XFF000000
: k% ~) ?, a4 x! \8 _6 [
, w: p* G9 P8 l" ^;调用C_SWI_Handler
3 e% {7 Q  f+ _1 I9 `# L+ Q- ~# |  g4 [
       BL C_SWI_Handler# m% V( A' ?. T; A  [

5 h3 u3 `3 K+ j9 q;恢复SPSR_svc- |7 w1 b7 l/ o. a5 b) ]( \

) Y/ [  S7 q2 J% B; F       LDMFD SP!,{R0}
& ?4 S# x% S% A/ I* `( }! Z; p" S: e5 U3 p3 z
       MSR   SPSR_svc, R0- _. R2 P$ w8 o1 ^' ^
0 E# r, L1 B, @& f: X( s
;恢复其他寄存器,包括寄存器LR_svc
" l5 a5 C9 S( D  @" p# b8 V# h( M' o3 s1 k1 d, A  e2 H) n6 ~7 j6 l. Z
       LDMFD  SP!,{R0-R3,R12,PC}^
9 w% T; V' B( B& g" d! c0 C0 f& p" ?) V  d$ y

/ z6 C: ]' H( z: l- Z
; J1 s0 q) ]4 s8 y# v- `2从应用程序中调用SWI
6 C& p1 z  s, A8 R
  L8 d; B1 s' r; ], i) @* v7 f; h分两种情况:1是使用汇编指令调用;2是使用C程序调用
1 t/ P/ j" l$ @4 Q& I; b+ e5 a$ c' G6 [
汇编调用:% t1 {" o# _1 [, F, O

# K8 t2 U: M+ S! H          MOV R0,#100   ;将参数放到寄存器中' k+ _  g$ k, x( r* H  z1 i$ e

' |8 l; c  `: Q7 W          SWI  0X0         ;调用的SWI功能号# n9 H2 ]3 J: `4 [: u8 d5 V! U7 {7 ]2 w" G

  A# f! o0 x' w" C! y6 GC程序调用:
0 _$ Y* Q. p6 h" h- T1 H/ u# f
0 v, \& F% t% q//头文件swi.h! O- \9 h+ Y) N9 U8 R, a0 h

$ }+ Y. h$ A8 _2 a0 Q! L__swi(0) int multiply_two(int, int);
/ A% t- o2 S! e, Y- S__swi(1) int add_two(int, int);! K, N" s6 F" p; I, X
__swi(2) int add_multiply_two(int, int, int, int);7 S- P. k. z3 \& z2 j
- X# ~) u" O* Q# _% _# n# M1 \
struct four_results
, x9 n$ z! r; _0 s$ |; J" U5 j# _{0 z  R$ I8 L+ d2 \
    int a;
% [6 c) o: N9 |. {" F    int b;- a' ]+ X  w2 V% p
    int c;
' `: c) @1 j& Q8 u) Q; }1 }5 H1 ~4 T    int d;
& h! q$ K! @: g! l4 X  @};
9 N" Q; w# k4 k2 E0 o* d
- L4 z: j1 ?# [2 c( x) q: A2 h/ s* k__swi(3) __value_in_regs struct four_results
) d+ ]" D$ t" v3 n- O* }    many_operations(int, int, int, int);. {! J; y) {5 \- b* ^

$ {# b/ D& D5 b ' Y9 _" U8 `( Y% z. S

7 c. b7 Q, ~& W4 t! n//主函数
9 m  I' r- {9 ~6 s# C/ a6 V: ^& I9 f4 ^3 B/ _3 `- l
#include <stdio.h>
* k4 B0 G6 m, O1 `+ d  K& s" J; B#include "swi.h"1 ?% j2 J- W0 E3 \& w6 L

/ F- ]  ^' [2 D* U4 c! f5 T$ W+ wunsigned *swi_vec = (unsigned *)0x08;5 J- b& M  C" O8 {3 H( ~
extern void SWI_Handler(void);
/ K/ m8 l8 [2 k1 i7 t' ~3 G- M2 I3 p" |5 d7 D
2 V& E5 O5 {1 ]+ i7 v# A
, \( _' U/ h- j1 F. B) y
//使用Install_Handler()注册SWI异常中断处理程序
  c/ @! z( v. [7 P$ W
5 F6 X7 y7 P- m- r3 j
" _, G4 M0 ?0 b2 W) |% ~8 S( V3 y  o4 e  e( X! f% F5 Y
unsigned Install_Handler (unsigned routine, unsigned *vector)
1 }0 T. d. s' c" h/* Updates contents of 'vector' to contain branch instruction */
# W+ y+ E! C- a2 x/* to reach 'routine' from 'vector'. Function return value is */! j# |7 n" e/ f- R, H8 J. v
/* original contents of 'vector'.*/
6 E0 R3 Q( U- f6 |/* NB: 'Routine' must be within range of 32MB from 'vector'.*/# G  s% q$ x' X5 Z  m" e

% O2 V! J( V6 J; C& H{   unsigned vec, oldvec;
- n3 @$ I: I( g" T+ {    vec = ((routine - (unsigned)vector - 0x8)>>2);
# g; G4 J7 J* i4 E  u    if ((vec & 0xFF000000))5 n0 V* J# N$ v8 [9 P
    {- y% o2 A( D* v. C- m2 W% O
        /* diagnose the fault */$ K3 k; ], \* k9 z, N
        prinf ("Installation of Handler failed");
0 h6 N- w! S% w. v1 o        exit (1);
4 f/ j9 W5 @/ K1 x- Q0 |; e    }
- r# l# b" ?" X! y: `7 k    vec = 0xEA000000 | vec;
5 d, {; m) x7 {0 K8 b    oldvec = *vector;
9 C+ j+ K! c8 h    *vector = vec;( ~0 X. X% P# {/ @4 T* y9 E+ O
    return (oldvec);
( i: ^5 e8 Y* l1 }) |9 H}; Z6 }5 ^8 E& e9 U* H$ L' g& w+ X5 s

! M% W4 K* o8 [7 ]* u- R
1 }' m0 V% y9 ^! j. }( A1 F) g$ n9 h
8 Y- ^+ j3 j( P: wint main( void )
% A& L8 g. Q4 H: u1 E{. X# E5 @, w! M0 \. _
    int result1, result2;* q9 @; r  f0 i: k
    struct four_results res_3;
& c4 o% u/ s' t" J% C    Install_Handler( (unsigned) SWI_Handler, swi_vec );
5 z& o6 Y+ n# q5 x+ s) f- d6 ~% _% ~1 f    printf("result1 = multiply_two(2,4) = %d/n", result1 = multiply_two(2,4));
5 t- x4 }, _# |9 n! S3 J    printf("result2 = multiply_two(3,6) = %d/n", result2 = multiply_two(3,6));
- o4 _: I( s: Z* H/ d    printf("add_two( result1, result2 ) = %d/n", add_two( result1, result2 ));( a9 ^+ T' ?; p8 c6 T0 J
    printf("add_multiply_two(2,4,3,6) = %d/n", add_multiply_two(2,4,3,6));5 E& j+ x1 Z) V3 l( U
    res_3 = many_operations( 12, 4, 3, 1 );; @1 Y% {" V, f
    printf("res_3.a = %d/n", res_3.a );0 R3 N1 x4 o/ u' ?
    printf("res_3.b = %d/n", res_3.b );
# P1 _3 b# H' t9 {4 N& {    printf("res_3.c = %d/n", res_3.c );
* V$ I5 [8 r8 G' n% c+ W+ j" F9 z    printf("res_3.d = %d/n", res_3.d );0 o, d, V- ]+ [  q. B
    return 0;, Z8 J0 ^. J  n. A
}9 Q( w: ~$ }8 B, F3 e. a

: k. Y% E5 Q7 q' p2 E ! [/ ?# ^! }; e6 A

/ P( N0 }- P% _& W; A1 q//第1级SWI异常中断处理程序
6 K% J- s' \+ q" s- r& n: c$ Q3 I/ ~6 t+ v! e4 i
        AREA  LevelOneSWI  ,CODE ,READONLY
5 }  k& `0 N$ b7 p# ?/ v5 x$ Q& h2 x) X' I7 y# L3 }7 \3 b
        EXPORT  SWI_Handler
2 g; }4 F7 x8 B6 s! ^, ^! ~+ A( g
  _! `# y1 Z* z4 c        IMPORT  C_SWI_Handler2 {; e  K2 j  [. X& K8 z" W% z
! Q. _1 q( D; G2 ~% j( L
T_bit      EQU   0X208 ~& V4 x; H7 K( q# n8 F& ]& i
% Y, p# }9 X1 v  M6 ~$ u9 R
SWI_Handler
0 G' f2 r2 W, f! |5 g4 s6 a
$ i! X, y, y) h& r5 y) _0 ]# W( m;保存用到的寄存器5 E% o* D2 S. h( \. E/ v+ G

- w% C( T2 R! {1 O( z* n8 [- x5 s        STMFD  SP!,{R0-R3,R12,LR}# q# c+ W/ g3 O: A
9 [8 @. L8 Z5 D* A0 Z( P. b' ?
;保存参数1 O/ f& U3 {" U

% W, [9 a3 U& T9 I4 H        MOV R1,SP" ]1 A; G% C9 @6 T
8 c( X8 X/ P. U9 L
;保存SPSR
' _4 g; U* @* V6 y. [; b
) Y. x% Z7 ~% ?% l5 P+ }' I- y        MRS  R0,SPSR
% z8 ?7 G' w9 `6 G: M
; f. K0 w8 P7 N' @0 E! K. @$ T        STMFD SP!,{R0}, z& v! z& P2 i* |1 s$ w
: k9 _& B( q. B) Z0 n2 F: {
        TST   R0, #T_bit
5 u- w% Y, \0 j- q  |2 d! ^+ p2 o8 |; s# s7 s- p: n
;如果为thumb状态
  d$ N& j8 R( @/ \- p0 k, X2 H
/ {3 H( m. D9 q9 h8 K        LDRNEH  R0,{LR,#-2}; p% W7 v3 ]$ u! P7 h# M

* H9 d- C7 v7 j+ b        BICNE   R0,R0,0XFF00
3 s; t' C* M5 N3 K3 _: V& Z/ F
3 T& U6 S/ J: m# `3 m;读取SWI指令
! C- j" B' G% o' y+ y# V9 @5 c
3 m4 i, J) A# U        LDREQ  R0,{LR,#-4}
3 D( w4 J& y8 ~( s1 k" K9 [% f( d7 T. p
;计算其中24位的立即数,并把其放入R0
. l# D4 l9 I$ o* l' V. Z& n8 y# X8 g# x9 h* o1 X2 P" W. C* ?# u2 H
       BICEQ  R0,R0,0XFF000000# @' Q6 x- E4 Y, h
& ?& p/ C; Z) ~: b1 z: ?1 X
;调用C_SWI_Handler* M" ]# V! s$ q5 O: A; Y6 n

1 l" Z# I# A+ F: N+ x# ~; z& G' q1 ?       BL C_SWI_Handler
/ t! z2 G& B6 p, ?
, C/ _5 E' R8 ^;恢复SPSR_svc; U' g3 m: O8 t) I) z% K
9 i  k  f+ I9 a, c4 x
       LDMFD SP!,{R0}
7 y% H0 s- Q$ ]) a( `3 o9 k5 @% C( p5 S$ l
       MSR   SPSR_svc, R0) B9 S0 ^3 r2 J3 @. P( }5 `
, }! I" r6 }; C7 b$ }
;恢复其他寄存器,包括寄存器LR_svc/ R1 h0 \  K2 a+ y. m! }6 }# N" M
$ G/ O5 ?" i* C: N3 N
       LDMFD  SP!,{R0-R3,R12,PC}^9 }1 S# Q9 `9 `& {7 A) |+ A
( Q& H" }( V# T
       END; |( {' R9 A9 a, l% t
# Y3 @7 `7 S" e6 W, L

' {. U) N2 d/ ^. C2 t
1 K7 e0 R- C) V; \! J# O5 E* t* j;第2级SWI异常中断处理程序
' l4 J! Y, G4 ^, H2 n9 V' [+ K, j. K+ L# c. U% a7 m; C
void  C_SWI_Handler (unsigned swi_num,int *regs)
3 }6 {' [  p) E) J, m4 P6 _3 H$ d' m" _+ T& u1 D* X
{0 k1 e0 Z5 D& G0 d8 q2 ?3 b
      switch  (swi_num)8 N- x$ ]9 w6 S
2 N1 D0 n, x+ V
      {
4 ^& e9 H8 e  v- x         case 0:
& c# }5 k+ N9 f; O) t$ f7 U( D! [% Z( Y3 c. |+ u( D
                   regs[0]=regs[0]*regs[1];
7 l: b: H' e/ h3 p) R$ V8 v& D1 c" G
        break;, ~+ u8 N- X+ Q3 k6 }

- [- \- w+ l" K8 w9 e         case 1:
) `3 W2 S  K1 u% J* P
3 ?* Z7 }/ h! Z% e0 \                   regs[0]=regs[0]+regs[1];
$ D! j- s( {. D* y. _" Q* M2 K$ s1 [4 l
        break;" c, ~) K# u8 L0 A, }

0 k+ y4 B: C0 }         case 2:
1 e. ^7 ]5 S- m
9 J  L4 y  ?6 K  W2 q% j                   regs[0]=(regs[0]*regs[1])+(regs[2]*regs[3]);
, [. U: @; F/ @7 e7 G) v8 w8 k: g8 h2 W$ Q4 i- L0 I
        break;9 J! O% Z' P. ]+ t9 I* |3 l  P+ B
: V$ x; [# D3 o! i3 f! }/ M! b
         case 3:
" H+ I  ~+ R- S! H( Y6 k2 v: ^& L6 m! e( J- e/ e
          {
& L4 y' w9 p* a: E: R; s; O              int w,x,y,z;6 n: s2 s' `, K

2 z9 n' V: q. E8 T! C7 t              w=regs[0];
! {7 Z$ z: i! {; n7 E
$ c. z/ J5 G* [1 N) o  V/ ?. c              x=regs[1];) q% O+ k- s" j3 d! {
0 K. D) S: {- T* C( m2 j, R
              y=regs[2];
& C' ^8 T7 g$ U7 _. l
. v' B  x9 r, }3 T! H              z=regs[3];( B  p  a2 n- e# T" m+ e( G

% T3 {( h6 h" u) [
: o# w# o2 z0 ^3 }) ~; f% D
* {. K& M6 ]/ L' I% Z              regs[0]=w+x+y+z;& z& p9 o- i5 O/ ]  \! C

$ q: h8 h% L$ u' }% S              regs[1]=w-x-y-z;
5 {, ]; H$ N% S  b. y& x
. v2 d: I) ?: q1 F$ a  S3 |              regs[2]=w*x*y*z;" M, ]& D4 X+ E) a8 E
& q$ |2 U6 }- v+ F6 H; O
              regs[3]=(w+x)*(y-z);
1 }  A% d5 ?* |# z3 y$ k8 k
1 e: Q3 h* x, |: S; d$ l8 A0 M  B            }3 k& K7 k0 |6 E" n

4 ]8 i, y$ E& R% X+ F! t. V! m% K          break;
- J8 {9 T* G" ~; i
. F7 L+ D; y/ J2 I9 q$ J# T        }
' _/ P) Z: P- b+ _9 j3 ?4 W& g4 U( i* y) f$ D* I
}8 o/ `8 L. M6 `

. r' Y9 \. A  K+ O7 R& n; ?
/ z/ D( W- P7 A3 @6 z
2 ?" G+ b1 I& j: a, @8 p3应用程序动态调用SWI
& m! A( |# k3 U2 w, g3 e0 M; u) B7 _  J0 ~
#ifdef __thumb; d; _6 u/ ]- m5 _
/* Thumb Semihosting SWI */' _' o4 {4 i1 i- Q$ z
#define SemiSWI 0xAB. B" N) a6 z- ?
#else
9 k0 C+ C: G1 C/* ARM Semihosting SWI */
3 }6 ?" H5 n1 @( I0 S#define SemiSWI 0x1234569 Q/ ~4 `) B$ L
#endif, H* X2 L  a* x/ R: i: \
  O4 h5 R& a; @( o
/* Semihosting SWI to write a character */ , I# K8 H- t2 v- r
__swi(SemiSWI) void Semihosting(unsigned op, char *c);0 m1 R- m' Y2 J6 X
#define WriteC(c) Semihosting (0x3,c); f- @" U2 A8 e, C' {% x5 U
/ j3 f' `/ I/ }. U6 Z
void write_a_character(int ch)% u& t0 U5 d1 f5 W1 p
{; c+ b# e+ N$ a) h( C1 ]
    char tempch = ch;
5 V2 n- T# ]4 k8 q4 j    WriteC( &tempch );. L* f3 J) j2 @% B, U4 v
}- F( H: _. |/ _9 E
7 ^# V4 C/ w! {$ T4 j7 q9 d" I) P

7 I0 E# X1 D  c5 `7 N

该用户从未签到

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 19:55 , Processed in 0.203125 second(s), 23 queries , Gzip On.

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

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

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