|
# L, C0 H: `( X) s在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
/ _4 X/ f: o$ t5 `+ q2 d/* 重新配置程序入口点 */
' t E, v2 D! X+ ]-e Entry- /****************************************************************************/; i# J. T6 `: H+ _6 [
- /* *// o. Y- r0 a+ ]+ T& q
- /* OMAPL138 及 DSP C6748 内存空间分配定义 */
6 a) p4 p+ z/ J - /* */
- |% W0 e. p* L6 Q# V - /* 2015年04月20日 */6 f9 ]1 A0 m, \2 u0 F: n
- /* */. ^( [2 R: l, y+ w# C% X
- /****************************************************************************/
) i- U4 Y W- g& N' Q - /* 堆栈 */
* o/ J9 ~. n8 Y. \( r" f - -stack 0x80008 V3 r4 s7 _0 h% N# G ~+ o# o
- -heap 0x20000 P) X9 D: R; I5 B a
, `: s+ j, @4 p- /* 重新配置程序入口点 */7 e3 ]% N0 u" Q
- -e Entry
! p6 H$ L6 n3 m1 y7 X
9 }7 g2 o1 M* p! w4 i- MEMORY) Z! l0 w, ^+ V) N6 R6 Y2 {1 e
- {* f* M( H g. x, x. N+ h$ V' g( _2 T
- #ifdef DSP_CORE% ^8 X- c# K* X k, T. J/ ?$ \0 C4 v
- /****************************************************************************/6 b% \0 L+ V. T. R% {
- /* */
, r- p$ L! R. ]+ Q ^ - /* DSP 专有内存区域 */# y2 ^5 A6 t" \) W
- /* */; g+ g5 o, z0 _- J2 X" B1 z" U7 q
- /****************************************************************************/
" G ?( j4 |- y$ H" U, o - DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */& j+ i3 O6 F' M1 m
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */) t" j& T k, D3 m
- DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
( X9 ], v; Z" j6 U$ Z- L' ~; c - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
: D) V9 u1 d7 l3 b - #endif
复制代码 这是一段汇编代码用于切换到特权模式
& }$ m5 D: S8 H7 i( H# L- Q
% q$ b- B v/ u2 v) y% z% POMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm
: A5 m: u. T( R- b- H5 Z/ f+ m- ;******************************************************************************" U4 d: N7 I1 `, v5 G" S D
- ;
% F% y( y/ {8 m# t9 H - ; init.asm - Init code routines
' _0 Q1 A x- W% [! q - ;6 I1 A. z4 Y- m
- ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
) D/ Q. T/ I# k' L# D, c' v! S - ; All rights reserved.
& g' [( s, Z6 c/ ~* u$ j$ O( |2 H, b - ;% F1 |% r! F5 j0 Y8 I! T4 ]
- ;******************************************************************************
! `+ u- b' W1 V, y - ;****************************** Global Symbols*******************************
; H- S: j" p& M$ `& m& j - .global Entry
: H; C! E4 H5 c* y$ z - .global start_boot) r% w/ N' o. G! I Y+ ]
- .global __TI_auto_init" e7 B1 D( Q N
- & Y) V, `5 L8 z
- .ref __stack9 ^4 s8 G- {7 ?: G2 [* }1 l
- .ref __STACK_END
. }6 }! d' r3 |$ a - .ref bss_start7 m) ~3 W2 B8 Z) R4 q6 e
- .ref bss_end, E2 M: [8 a* r2 e
- .ref start_boot
9 |, t" J; H1 t& C; Z
2 S! Y. q# m8 i2 \; L# v- ;************************ Internal Definitions ******************************$ P- s& {# c7 i6 g+ T6 Z
- ;' S) ~) A- R. I# }! _' J9 r0 k
- ; Define the stack sizes for different modes. The user/system mode will use: z, A/ v/ I( c3 `+ |& E
- ; the rest of the total stack size7 M4 y' M2 f3 D% T
- ;
* n$ `8 T- t2 ?9 z0 z. j# t - i" h6 R! v x1 y F3 U9 G
- UND_STACK_SIZE .set 0x8
+ n$ d2 _+ B5 ^8 f; v - ABT_STACK_SIZE .set 0x8' Q/ q- r" f2 H# N8 A, `
- FIQ_STACK_SIZE .set 0x8% w5 y! P2 i1 Q0 W' k S
- IRQ_STACK_SIZE .set 0x500/ Y7 d* C7 N0 p# u- P$ L! a! G
- SVC_STACK_SIZE .set 0x88 o2 b7 H ` ^; S
- : Q# Y/ a# X _5 p/ @
- ;
6 L* p) D% [* r5 p" S; m; f - ; to set the mode bits in CPSR for different modes2 C) W3 D8 M& G" [0 @9 F' W4 @
- ;
7 t7 Z$ N0 P4 I8 r0 z8 n
' A( V% F, O1 M ?. e- MODE_USR .set 0x10! I2 y, n5 h2 L: [1 i, }
- MODE_FIQ .set 0x11
. h% S/ a; S* } - MODE_IRQ .set 0x122 p! F! ^/ l% n( y- N; B
- MODE_SVC .set 0x133 O3 S7 \! z3 K% t# t
- MODE_ABT .set 0x17
6 p+ F3 n8 @) W) Z* R3 P% Z - MODE_UND .set 0x1B
' v. w/ K' K$ I1 b - MODE_SYS .set 0x1F' J2 z, u; t& ^4 }* g1 B* G: L8 W
- % L: T( R9 k7 H9 N
- I_F_BIT .set 0xC0
; J/ A7 z1 @, g1 b. ?
L' j+ u6 \1 V" i7 Z- ;**************************** Code Seection ***********************************! Z" ~& Z5 |$ }4 e: K v5 o5 q
- .text" J! a$ M. {. v5 `6 _& E2 _
/ y' M# x8 B! F+ B" i- ;
/ G; u$ Z* R w) ~1 U - ; This code is assembled for ARM instructions E# |% |: P/ l0 W0 K/ V
- ;
) n, i0 H/ M! B* h2 t, i - .state329 F. P* g1 N# ~# p4 S7 G
- 5 a2 W( t! Z3 P; P! _* ?% a
- ;******************************************************************************
8 L5 b8 ~, I& n2 t5 k! r. l - ;( _3 L j4 L, w3 p1 I& ~9 a7 v3 D
- ;******************************************************************************
0 N5 X& @/ T$ X, C( U0 @8 s, y" j - ;( \. t3 s' f, z$ _0 y
- ; The reset handler sets up the stack pointers for all the modes. The FIQ and
7 U7 l/ L5 ?$ _1 `$ f - ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
7 D8 j+ P+ M/ D0 Y/ \3 C) ~ - ; main() function.
* I% ^, K! |3 u3 D3 s5 |; d0 o. f- V1 ` - ;
6 _, O& z% _' |8 P" |! X# r - Entry:
! ]+ N/ j6 @) l! K$ y5 U, Z0 n - ;; Z8 p% L; \# V8 b, }
- ; Set up the Stack for Undefined mode# T/ {$ e/ [* M9 r3 I
- ;2 S' g7 T; K3 @+ O7 K
- LDR r0, _stackptr ; Read and align the stack pointer
* H/ b. i+ g# A7 R+ Z - SUB r0, r0, #8
0 }9 T; E1 m/ F$ _( q - BIC r0, r0, #7: s% @9 s' c1 ?, G8 D
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
9 P; l4 P$ Z1 m" _ - MOV sp,r0 ; write the stack pointer
- B2 k2 ^5 W' l( u% i5 s1 y4 F( t - SUB r0, r0, #UND_STACK_SIZE ; give stack space
. A' `8 H, ]! ~- m - ;
" k9 V4 ?1 u; ?8 w - ; Set up the Stack for abort mode: P& F* c% B& u; d. z6 P5 ~
- ;
' y9 a8 @: n3 X; r* c" x$ A - MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode% t+ B! I8 ]7 m, C4 o2 f. j
- MOV sp, r0 ; write the stack pointer* g% ~! Q; w" u7 N2 x
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space2 }6 {+ y2 e6 W4 t7 f9 g4 C
- ;7 `# o6 w4 B' Q8 R' o
- ; Set up the Stack for FIQ mode( b h: i4 Q7 m) C, O& F. a3 u! b) g
- ;/ b" ?+ C/ s4 z' }$ E4 S& U( [5 ?
- MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode/ R/ ~+ y- E( O3 Y/ D
- MOV sp,r0 ; write the stack pointer7 C, {. H: W# O5 _/ g
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space8 G2 N" M0 s3 k2 |# l) X1 Q6 V" S) S
- ;
; {2 g$ S4 G! E- z - ; Set up the Stack for IRQ mode
) [/ s" X& Q7 r - ;9 d" W2 n9 _; C+ T
- MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
) j, \; J- v4 x* }% H1 M G! p - MOV sp,r0 ; write the stack pointer
) e2 a, X) Z# n" s$ I h( q& I - SUB r0,r0, #IRQ_STACK_SIZE ; give stack space2 J" k0 G/ m& g& t
- ;
9 \% W. g& D3 i - ; Set up the Stack for SVC mode7 R9 o. m8 u5 W; |2 I* d$ u
- ;
' j8 C2 G( Z4 q! l8 c. Q8 g - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode2 k/ M& @9 f/ g! o T) Q
- MOV sp,r0 ; write the stack pointer5 f1 h( d/ x8 d8 F& o D: f1 p: y
- SUB r0,r0, #SVC_STACK_SIZE ; give stack space
8 A- f2 i8 [7 Y - ;
! _) [7 e2 ]4 o% b7 i; t; v - ; Set up the Stack for USer/System mode# l7 W' [5 ~' o9 }/ B3 y
- ;) O" Z: @& {- {1 F( i
- MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode3 B% N3 B3 C" R* f2 W
- MOV sp,r0 ; write the stack pointer
; G8 S: ?8 B% `- X
7 D6 H+ d( K' b0 f! m( `* Z- ;2 y/ q, V. G. D6 u
- ; Clear the BSS section here
/ l g! ^% }! {+ _ - ;
% T% M+ O) J: q6 _. M# Q - Clear_Bss_Section:
: D9 P, l) z, R1 l1 |! W3 D
" Q6 L4 B3 C4 r$ }& }- LDR r0, _bss_start ; Start address of BSS Y% e) L2 Y! O5 F9 |
- LDR r1, _bss_end ; End address of BSS
9 o! q3 O3 a3 N8 i - SUB r1,r1,#4
6 D6 t S3 \1 F) S" Z - MOV r2, #06 O7 L: E3 d, ~1 F; ?. [- k2 m% j
- Loop:1 o/ t' C/ A; v3 L+ I
- STR r2, [r0], #4 ; Clear one word in BSS
! C( W- Z) }4 {3 o6 b, K - CMP r0, r16 V' ^) T# d9 |" k5 R* J V
- BLE Loop ; Clear till BSS end
7 p* D) h! ^' }! |
* W) J0 } k3 D5 }- BL __TI_auto_init ; Call TI auto init
0 j7 k; U c: k" ?5 K* k1 U$ P# W, a - 0 v. {7 W: U! C6 z/ R }9 E
- ;
; \1 k8 o) H6 N) ` - ; Enter the start_boot function. The execution still happens in system mode
, K4 G8 V0 l$ Z - ;( I' u+ O+ d% s. |" B) j+ [
- LDR r10, _start_boot ; Get the address of start_boot
. j) F9 v( I) i5 W4 ]+ X" H - MOV lr,pc ; Dummy return * ?7 h6 b. W/ s) e4 q/ I
- BX r10 ; Branch to start_boot9 ~' S- ]9 O. ~% u V( O( B5 l6 ~
- SUB pc, pc, #0x08 ; looping6 c! w) d; r% b
- ' X- k5 p: n( L
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
. S& g# y6 c: s* ` - ; BX lr
) l2 B0 X f c* K* | - ;( D4 ~4 s @7 z6 } ^" N2 d1 N
- ; End of the file7 z; }% K, u% @, g/ {' W
- ;
1 Z. o, ?5 z' Y; Y2 @2 }
/ Q% ] i7 \% \- t, q9 z3 g- _stackptr:
, u4 T/ M9 Y0 |0 V7 Z+ V5 \ - .word __STACK_END
- ^+ s% e( n1 S4 I8 v! p. ` - _bss_start:- r" u0 j! u! _' F
- .word bss_start* R+ b, O. H; |6 e/ ]2 Z4 ^3 P% n
- _bss_end:4 y( P1 o9 O9 h! f8 J& f
- .word bss_end
' h" M9 l& R1 c - _start_boot:% v) {* k# v6 }6 s. ^' @
- .word start_boot7 E- r+ S" t1 z; H4 B
- _data_auto_init:2 [: c y) \5 A6 K9 f* b7 ?
- .word __TI_auto_init
& T5 s, K: p7 O/ a$ n - .end8 }- D5 ]% P4 q8 ]; ^! ~, T
- 4 S* ?/ _8 o5 V! f1 K- e
& H w" |. m% I2 M
0 {; G) ]: M5 \ x) q
复制代码
: K/ N! d5 }$ V! }+ q- s
, W# M) b& B* Z; w6 Z) h4 W6 M( q* i, F& y
# i1 A M- T& o0 O* j9 b
/ \% @( e4 G! ~( | |
|