|
! @5 K' N4 Z8 m$ F1 Q
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
6 K7 e* d9 m7 l4 X; A/* 重新配置程序入口点 */) t6 W! a* \7 A" `
-e Entry- /****************************************************************************/
) R9 O* ?8 O1 Q" i - /* */
6 P* O1 P$ l. f7 L3 E* v - /* OMAPL138 及 DSP C6748 内存空间分配定义 */
$ L* a/ c: H! ]# \0 M/ C% Z0 b x7 \ - /* */
9 W1 \# ~- q- g4 u* B# B - /* 2015年04月20日 */
. }& A! K* r( Q0 c* \- a" R - /* */+ e; w/ [* U3 J% p" l: [+ Q; K% W! y
- /****************************************************************************/
8 {9 g( V! U6 d( u4 {: M. f r. X: v1 t - /* 堆栈 */
: n% y5 P. D3 m$ ~ - -stack 0x8000( M3 a$ C" T2 q4 o
- -heap 0x2000
U3 }* ]9 h& O - 6 ^& R) o# j% t7 y" T
- /* 重新配置程序入口点 */
* i5 p! \( R' T6 a - -e Entry
0 n" o- V8 }6 Q( { I& j; I - $ J, w. r5 k8 p: B
- MEMORY
% U5 D8 S3 O+ \0 d& J7 s - {' j; B6 a9 M5 q( I7 N
- #ifdef DSP_CORE
0 p3 @2 d- j7 n" _. i. K/ o - /****************************************************************************/
& b: t. g( o- P" V - /* */
. B: @4 I" q5 s$ t2 F4 w0 d! u - /* DSP 专有内存区域 */
) z6 Q ]' |6 [: _0 M7 [ - /* */
/ R( K; E3 h7 g' Z; k _ - /****************************************************************************/( [ y$ Q5 I. I( d& {% Z" H
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */# P/ u3 k3 \. T. W& d' M4 _5 S
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
; `! z. B2 J( J% F - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
E( [9 V0 H5 [7 J* S - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */9 F/ T; g/ W$ D& U( W
- #endif
复制代码 这是一段汇编代码用于切换到特权模式
. w$ z4 q9 x) O* A7 u7 I; C L3 c* }7 O, E0 ~
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm
, H# ~, z9 G' Z X' @5 C* C$ b- ;******************************************************************************
' B+ i( V% e# E$ `2 X1 |8 i; f - ;0 x5 g: C" U4 i7 P. t
- ; init.asm - Init code routines
" U. c, [; H/ E - ;
: W( X3 a3 \' @- M - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
( ?/ X% m9 ?0 U$ k% c - ; All rights reserved.# w$ w; [1 \: b
- ;
$ a8 Z/ \5 p1 N$ ~' v# X1 B - ;******************************************************************************- V0 u0 @% Y9 T+ q. G5 x" y/ V" v
- ;****************************** Global Symbols*******************************1 d9 B8 d# X1 c: Y" R6 N/ ?
- .global Entry/ o( I- P4 d+ T0 v% u
- .global start_boot% H# C8 d" `& w. n% ~! K9 [( u+ I
- .global __TI_auto_init1 E0 j* h6 z- g" N n( B5 k( x
4 }1 p) E( e/ ^ a% k0 T6 U: M- .ref __stack
% i6 [0 O/ l7 E0 n - .ref __STACK_END
+ v5 T2 @. G0 ^$ K& g - .ref bss_start
9 G6 S G. Y( }3 `9 Z* u& p - .ref bss_end0 Z y" [* Y" B! C
- .ref start_boot
. i0 y* q3 V$ C% K) H- D
( d, ~9 B3 J2 u; T4 i- ;************************ Internal Definitions ******************************+ N2 `$ Z' F/ n I4 K
- ;% [+ w9 r6 D, w4 w0 ~8 o
- ; Define the stack sizes for different modes. The user/system mode will use
# G3 C5 \9 I' m9 E; c( l - ; the rest of the total stack size
$ g+ t* N' J2 V/ X - ;' } b: \# x6 X7 t2 u
- ( d! t/ g# P; \3 d% L
- UND_STACK_SIZE .set 0x8& k( P! X" v' D
- ABT_STACK_SIZE .set 0x8
( s9 V. N* T$ ]7 a+ k" X6 U1 d( _ - FIQ_STACK_SIZE .set 0x8
. }' c% W; y" B6 N: f( \2 m - IRQ_STACK_SIZE .set 0x5005 X9 o. i- B9 e: V# u
- SVC_STACK_SIZE .set 0x8& l7 l8 q& U+ B2 x9 t
! }: s+ S6 C" z( S- ;
7 ]& C3 \+ [7 } - ; to set the mode bits in CPSR for different modes
& v1 R/ p* I+ e! ]& S - ;
: ^- t! Z8 k4 N0 s+ w0 {# Y- F
! T" [1 V2 U* C5 d: ~% z- MODE_USR .set 0x109 F- E9 U$ c0 J
- MODE_FIQ .set 0x11
! y* h1 O4 G8 W: _ - MODE_IRQ .set 0x12
' Y4 T- t4 U+ f1 S& s - MODE_SVC .set 0x13
. j! ]# O; N5 h6 E - MODE_ABT .set 0x17- D% m. o$ U1 e1 e( Z' H
- MODE_UND .set 0x1B; p, A, @1 m2 j @: o+ C9 x
- MODE_SYS .set 0x1F
& k( | L9 }$ k# `( C - ' Y: ~, s. H, Z4 `
- I_F_BIT .set 0xC0
9 X2 u9 ?$ ~- Q" e( |9 o - 5 P8 h* Y! X' x* X
- ;**************************** Code Seection ***********************************! G3 u1 Z) `0 D4 @5 I) y8 F
- .text: ~* ?- P6 t" [4 n2 n9 F
- + C6 F# \7 m) Q4 |
- ;. C' d3 B9 @; a+ Q- G
- ; This code is assembled for ARM instructions* x0 r" ]+ B' a' _- M1 z
- ;
4 W3 _( Y% [' x* k& o - .state32
% x1 @+ A9 A/ C, ^& m3 l - ! M$ z' v Y1 D7 ^4 v- a9 @3 `
- ;******************************************************************************) u# Z! Z) f) N* z
- ;( Z. ]8 ]& M! {# W8 B) u; U/ r
- ;******************************************************************************" s/ a1 W* g9 K0 t
- ;. h9 ?% J( {2 I6 h' l
- ; The reset handler sets up the stack pointers for all the modes. The FIQ and# h2 y8 g0 b) K+ s
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the) O1 }$ w4 v9 o0 o4 b, F
- ; main() function.
5 c6 E/ j$ h& r) e! l1 E - ;2 ?$ y+ Q2 J, y3 E
- Entry:7 D( U: p0 P8 r9 c# M8 _
- ;
6 F, G2 M% K2 H3 C% B - ; Set up the Stack for Undefined mode2 p- R7 t5 l4 q; `6 v1 ?( a; }. W) }* R1 p
- ;# ^- E+ Z+ _7 B, n
- LDR r0, _stackptr ; Read and align the stack pointer. r+ e/ F0 i! q# R( p( B2 u
- SUB r0, r0, #8, l: K7 {8 Y, z) x- p% ~: N# G3 O: d
- BIC r0, r0, #74 v$ o2 K7 e* m" e9 V
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
3 E0 k+ i2 Y' ]3 b6 @ - MOV sp,r0 ; write the stack pointer
0 a$ o% \( x6 w9 Q" `6 s# R' y( f - SUB r0, r0, #UND_STACK_SIZE ; give stack space- j. p1 ]6 k/ |# I/ ^* E
- ;
* `) x8 c' p6 Y, N, b - ; Set up the Stack for abort mode
* t& `* R+ y1 L& d6 ~5 P - ;7 {+ r; C) j( ?2 l, y
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode) C- h: z+ L/ {7 G* O- q/ H. |
- MOV sp, r0 ; write the stack pointer: b; R. W0 T' H7 W/ k3 ?- o# v
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space2 X/ ^3 ^: j$ B
- ;5 V# B9 x$ v5 H
- ; Set up the Stack for FIQ mode# ]' t1 X7 J1 r
- ;
" T0 B. A P/ c3 `: n) d5 _ - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode
& @$ \' z: |3 y/ m' D - MOV sp,r0 ; write the stack pointer0 O* c. k5 y/ m& x
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
3 A! _; n5 i9 r7 G - ;
, e' A Z# m a: L( x4 G - ; Set up the Stack for IRQ mode
0 G6 k- f: A% T - ;
3 W* q0 e! Y* K6 G' B0 d - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
- d, l& p" G( A. [ m4 T; y$ n) U/ I" @- w - MOV sp,r0 ; write the stack pointer
* N# W* r- _5 e - SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
4 ]! I3 q/ f7 ` - ;
' T0 W9 R3 A. q# _) N1 _& R - ; Set up the Stack for SVC mode
; j0 B% Z( t% E' b - ;# @& v- o% c6 z& k: m
- MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
' a6 f4 ]3 e4 G4 W# f# G* _/ @1 z - MOV sp,r0 ; write the stack pointer) E1 W" d" e) d0 H a! z+ _1 R
- SUB r0,r0, #SVC_STACK_SIZE ; give stack space
! z; s7 L0 ^# N7 Q" e* T9 |9 a - ;
: }/ N3 l- R% l/ n - ; Set up the Stack for USer/System mode' |% }9 M/ e! I$ @. V1 _7 K& r) B
- ;( Q( F7 t( I5 ?8 K& G% i5 P
- MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode+ W$ s: h3 S i; H+ V
- MOV sp,r0 ; write the stack pointer1 e2 N' \# ]9 W6 F. ?
- 1 H, Y! d5 j- ~8 e/ O
- ;& N( D% K* M$ S0 v+ _ s
- ; Clear the BSS section here. v- E% K; f1 }) N: s
- ;
- V1 X" D O7 \6 a4 N) t - Clear_Bss_Section:' ^$ [1 X* F2 m1 W
- : H. i7 ^$ m! G7 i/ ]# C" M+ ] p7 V
- LDR r0, _bss_start ; Start address of BSS) m- v; E. {9 W1 y& [1 u
- LDR r1, _bss_end ; End address of BSS
( J( D; Q9 P5 Y& Q. o: Z$ w8 J - SUB r1,r1,#4
+ ^ q1 M! K5 U' Z' q, u - MOV r2, #01 o* ?6 t* V( @) J( X7 D. t! y ^5 z2 X
- Loop:
- t; p* |6 B: E - STR r2, [r0], #4 ; Clear one word in BSS
. B( K4 A6 ]2 p+ m" q' g3 U - CMP r0, r1
( _; Q) A: {" r# [2 }; P - BLE Loop ; Clear till BSS end4 y4 \2 R$ J/ ~6 g
- ) v9 ^7 p9 t: G* o
- BL __TI_auto_init ; Call TI auto init
! L3 w1 z; B7 m! ^7 |/ I- ?
2 v/ y% [1 p# B' t7 N% u& M- ;4 B$ \" r9 Y- l
- ; Enter the start_boot function. The execution still happens in system mode
( P# L" f# J. e; r C/ J - ;+ q# A. ^+ D1 l& g
- LDR r10, _start_boot ; Get the address of start_boot
6 E$ e& k% d' x {. r0 s - MOV lr,pc ; Dummy return # A+ G2 D7 t" R4 g/ d
- BX r10 ; Branch to start_boot5 S' ?0 _) T8 e0 M
- SUB pc, pc, #0x08 ; looping
4 w6 j& M8 U: ^% [& ]! s3 v
2 R8 S: Y( I. w, D5 I0 T6 @7 S- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode0 t8 l6 G0 e# Q+ v) y
- ; BX lr
2 {! P1 M: T9 c$ W - ;, w h* J+ |3 \3 J, z
- ; End of the file
) y5 d# f& m. o8 S( \ - ;
8 L1 |2 \0 m$ p- q
$ c; e' L1 D6 P2 T" m- _stackptr:* J& f0 |2 d7 C/ l$ |. X0 ^
- .word __STACK_END
3 p9 P) {; s8 }. O - _bss_start:3 Z% S# ^( K3 a4 ~, A: e' j/ s
- .word bss_start
) v2 ~$ h) P& B - _bss_end:& s6 s. ^5 B: j7 l, K+ g
- .word bss_end4 m9 S+ F3 E2 t/ |- w: d) K4 i: ~
- _start_boot:
! h5 z0 m- e! h9 H- L5 ~ - .word start_boot
" A! w; o9 I* r2 y4 k( c' ` [2 R - _data_auto_init:
( i3 W g. Q9 } - .word __TI_auto_init! ^3 ^& O# t! ^. L. I
- .end
7 g5 o, h( r5 t2 J7 d -
5 G* q! ^4 O0 _* E - 1 W' s: I$ ^" ]1 w& Y" a
! b7 K( X) w( H
复制代码
7 V& R5 D6 Z L7 H
1 g* R1 `. P; Y$ ~, o
# r% k4 d; q# r
) N3 _$ @$ ^- D( n# |, v) Q
3 n( [1 X- g+ @& g) k/ p I |
|