|
|
! E. _5 T! i. p2 v9 u! \( u
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
, |& {* ?1 V/ p. j5 q r/* 重新配置程序入口点 */( I }: m9 U/ D" g4 {
-e Entry- /****************************************************************************/4 J8 b; k* r9 @6 v. |% ]% t: y
- /* */
3 V, d( A4 F7 L7 ]( m2 i - /* OMAPL138 及 DSP C6748 内存空间分配定义 */
! ~ U- o& ?0 h e0 ^6 m9 y - /* */0 S6 a+ u6 s' m* j* C
- /* 2015年04月20日 */
1 Q+ J! ? V9 e - /* */0 i3 Y9 u1 A3 ^/ d9 I
- /****************************************************************************/6 @) I! ]' H4 a7 c% r. q
- /* 堆栈 */
: H, H4 E* J. \/ j/ w - -stack 0x80008 q6 f1 n$ P: s# Y% ?+ ~, x
- -heap 0x2000
( m- e: |% L/ u' e/ }3 r p/ l
* U, U: Y- ?" W$ ]8 E- /* 重新配置程序入口点 */
& } J6 @" y0 c' h - -e Entry4 j( E1 Y$ i' t7 d, O/ c
- - J/ ]. _) p, w+ l: A! I
- MEMORY$ l0 s' e# N7 R9 B
- {
0 i' T O; B; l1 m6 _ - #ifdef DSP_CORE
* i# U8 T) [$ r - /****************************************************************************/
y+ {- |' s! ? - /* */
& f" ~; q c. ?/ v - /* DSP 专有内存区域 */% m4 U6 p- m, t; v* b8 j. m
- /* */3 ]# n! q, q7 S. U8 l1 x
- /****************************************************************************/
. ^& S- {+ z) }. p" x; ~ - DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */' q3 k5 u, F, i1 k, \) K. w$ O& d6 ^
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
7 C8 N; c; x# v/ z - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */# F' Y: X- G9 z. k& E7 n
- DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */6 p' Q' U2 w: [8 G
- #endif
复制代码 这是一段汇编代码用于切换到特权模式
% i2 C5 S, ^, z+ n$ {9 N0 N0 j8 h, _; H A) p, L/ f: l+ ?
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm
" g0 `" ?) u; S, z6 [8 ?& u2 ^- ;******************************************************************************
& P* @) b) o9 ~- i) a7 V- |7 {1 E6 O - ;; `% I& U6 d4 ^- v
- ; init.asm - Init code routines! F0 X8 O6 L" w _( a
- ;
/ G' J* X5 R& M1 P3 B8 u - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/8 V% A' u! g9 l8 d6 D
- ; All rights reserved.
; i9 F( z% ?+ O2 t) b - ;, P! [) P1 R2 ?$ w8 h
- ;******************************************************************************' v/ [7 ]" ^1 P) K2 D) _+ L7 l5 `
- ;****************************** Global Symbols*******************************
" ?+ X) v+ X' i) V - .global Entry
3 @3 V& _' C7 x: V5 x1 _ - .global start_boot
' Q8 B0 X! r) D; v7 M' i0 a - .global __TI_auto_init% ?+ e/ K5 ]2 ^
2 J+ p5 R1 _2 A8 n, b* j- .ref __stack
3 b# Y& D5 L. v' \& w - .ref __STACK_END
; O% \" n8 w* p3 d! i - .ref bss_start/ J# Y+ k) w8 ^3 |% P" J# r
- .ref bss_end
! J" l% y' z$ G9 z% _ - .ref start_boot6 j+ L; m* Q+ E. v
- ( P! v( y, w$ A
- ;************************ Internal Definitions ******************************- ?& [+ q w" S/ ?6 w3 @
- ;+ `+ x8 a, d! S! i% D' g' Q
- ; Define the stack sizes for different modes. The user/system mode will use
7 Y: F; t7 @, V8 T( M1 S- _8 v - ; the rest of the total stack size
) Y& v: s: B! ^ - ;
2 s5 C" e8 q- Z7 B5 C
& C) `/ }: R, A) i5 F4 \1 T7 t- UND_STACK_SIZE .set 0x80 C7 H$ }: g1 p8 ~& ^
- ABT_STACK_SIZE .set 0x8
% D) F. p$ q% _* L - FIQ_STACK_SIZE .set 0x86 A# ` _* k9 g1 P$ x
- IRQ_STACK_SIZE .set 0x500, [$ R5 b3 F7 t/ ~& {
- SVC_STACK_SIZE .set 0x8* j8 x1 F! a" U- a) Y8 j! I
3 }" t6 ^2 e. a) N W- ;- V6 _6 w- W& F: b
- ; to set the mode bits in CPSR for different modes
/ a b( ^4 h% ~3 F, K) E5 X8 G/ l- [ - ;) B& |8 e u0 f1 M% u; O+ k
- ; r/ a: U# ^: q
- MODE_USR .set 0x10
% A9 |# P" J' g. {$ h0 r - MODE_FIQ .set 0x11. b3 V9 P* E% T- J- G! C$ K
- MODE_IRQ .set 0x12+ b* V; g5 m7 s2 R
- MODE_SVC .set 0x13
$ k9 X1 ]1 Y4 g& N0 k2 W1 S2 D; t6 Y - MODE_ABT .set 0x17
$ n3 Q# E; D1 _, W - MODE_UND .set 0x1B# d8 O# W* T& \+ T2 P
- MODE_SYS .set 0x1F' b4 F5 I8 p. g# e- ~
/ ]( j; Z5 S T, I! M+ i- I_F_BIT .set 0xC0
( @) a" |' I# M0 M
( s% g! A: R. X/ V6 i- ;**************************** Code Seection ***********************************
8 `' x" v) C2 s7 Z7 p* S - .text
, W1 C; Y- O; X1 f0 B8 s - 5 y4 L/ h- g: E+ g5 s6 ]# W' u) n/ w
- ;
7 p! Z# }, z( t - ; This code is assembled for ARM instructions: q$ ~3 m u+ F0 P9 S% D4 [
- ;$ `) I* k7 u/ B9 X( n. \2 g2 K' a+ e' |
- .state324 e* }9 J% `6 s
& f0 c$ S/ ?6 `5 Y, K. p" u: e6 _- ;******************************************************************************) y2 I8 [; P0 U# b
- ;. E" R2 ^; L+ p8 l0 P
- ;******************************************************************************: W% P2 W* S o0 ?" a4 M
- ;. t: ~/ Y: c% K% k5 U$ p. w6 T$ k
- ; The reset handler sets up the stack pointers for all the modes. The FIQ and
9 N6 y+ M7 w( S# S% `9 P) A - ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
' w6 E8 \( ]( C* v( Y6 @ - ; main() function.& N! c* {' h H; L3 k: ?0 S
- ;
1 d! i- S* f0 a& i0 }5 n( e - Entry:
( i# O0 f7 l; A8 _( g& z4 v - ;
6 e0 M; U; D% ^$ K9 J; m( ?) u - ; Set up the Stack for Undefined mode
; w& n; u5 i! M) s - ;. N& K# q4 p3 y' k3 B0 F( ~. {. j
- LDR r0, _stackptr ; Read and align the stack pointer
2 s; B( V7 e" z, i6 J - SUB r0, r0, #8
, E+ H" u/ w' W* x% t - BIC r0, r0, #7
: a" Y0 O, b `5 t2 x+ T# o1 k - MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode8 t# C! F/ s/ \" P: {. ^' U, p
- MOV sp,r0 ; write the stack pointer# m& z: A3 E) U$ ]7 W4 ]
- SUB r0, r0, #UND_STACK_SIZE ; give stack space# e% h( Z. n8 J4 m: D3 m
- ;4 _& E) P5 G, g7 W" V. {
- ; Set up the Stack for abort mode2 y1 W' V: }! L3 }8 @ ?
- ;
( }- w4 Z, x4 o! X0 J$ ^# D0 v - MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode$ W* H5 b* `& L& O8 m! \
- MOV sp, r0 ; write the stack pointer: l) @) o, s' D' x
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space
' T* Q! c; k2 N$ \; v4 g% |# |! V - ;8 s0 e1 J$ {" K m# E+ H8 R5 E
- ; Set up the Stack for FIQ mode8 F, N: l6 Q! e
- ;, x/ Z( T8 A6 v4 _. ~9 Y
- MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode
2 h& p' G' p8 g1 X% j8 m6 W, _0 P - MOV sp,r0 ; write the stack pointer
/ o' j, j! F+ d7 V( b' G( G - SUB r0,r0, #FIQ_STACK_SIZE ; give stack space2 p# Z6 S' H o$ G- S+ G' O
- ;1 U: ^% B# T7 O9 S# g
- ; Set up the Stack for IRQ mode
7 D6 z( S, r' M- ?# X - ;' \, W3 S0 T& G# S; S' i
- MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode+ o- n5 Q8 o/ k$ ?& B; \
- MOV sp,r0 ; write the stack pointer
! _/ @6 O! F% Z, U* u - SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
$ I t$ _( y+ `# A( S- g, n2 w9 D; ~ - ;
$ y$ P4 w) I# b# Z9 V - ; Set up the Stack for SVC mode
6 c! a+ n+ h; q, }4 |1 u" s - ;
( I- [0 I9 ~( g- _/ Y - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
; [# i( ?* s& U, p - MOV sp,r0 ; write the stack pointer) |' C" n( l0 X2 ]; I
- SUB r0,r0, #SVC_STACK_SIZE ; give stack space( N* I" c, j" m: l" w) Y& w5 a) G
- ;4 B( d; n* w3 f
- ; Set up the Stack for USer/System mode
/ f4 ?7 F5 x# q$ `; g, [1 l - ;
' s: G) f* N- c* l7 l - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode
' E9 v* ^/ } r E1 q - MOV sp,r0 ; write the stack pointer
8 U2 @7 q) K/ O( c2 o8 A
, L$ H& B' k' V- ;
9 x, C3 A. N8 C5 K! v4 S - ; Clear the BSS section here: T% n' x* o. m. ]2 R4 f1 V5 E
- ;4 M" L. e' G9 }
- Clear_Bss_Section:( u r% M2 D/ C9 D: w3 O% p! B
8 F. \) S: p ~; [3 k0 o- LDR r0, _bss_start ; Start address of BSS
! q h: G6 f- e1 v$ Y5 m - LDR r1, _bss_end ; End address of BSS
# ~8 R4 R2 `# t/ d5 M8 D - SUB r1,r1,#4
, i5 {6 z: J9 ?2 {3 l8 b - MOV r2, #0
( k& U. ?" h! [5 O/ l - Loop:
$ q K7 `( I( d. I6 w9 }- e - STR r2, [r0], #4 ; Clear one word in BSS5 K8 b+ ]' o% S$ \" Y
- CMP r0, r14 m2 Z8 I% V; [3 m8 [' F! D
- BLE Loop ; Clear till BSS end& G7 z- b2 D# n: M O) A+ w3 W, m0 h
- , X# e! n( S7 \5 s3 b" o
- BL __TI_auto_init ; Call TI auto init
" b5 g# X1 M, k p
s6 I, e# O4 G2 A2 |- ;6 L& m$ r* v# a: V
- ; Enter the start_boot function. The execution still happens in system mode
7 V# @7 U3 V" p' {$ T( b" [ - ;; Y/ [% U& Z+ `8 D
- LDR r10, _start_boot ; Get the address of start_boot: [) o. @, m+ S Y( b; |. D
- MOV lr,pc ; Dummy return 6 M# P. d6 X0 p' `0 M K( j# f* b
- BX r10 ; Branch to start_boot0 X6 U/ B8 o( i. T
- SUB pc, pc, #0x08 ; looping; I6 h) A; o6 ^8 O, a" ?% O& ]
- $ }8 Z& a8 k3 [$ o/ C
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode. G4 h5 h( R" s R8 A
- ; BX lr
" R5 F2 t, g6 f - ;, t, N- y7 w2 X, H& U* G
- ; End of the file
' c" O) I+ K D6 c5 o2 N5 v- j; C - ;
9 |) T) C4 Q* C" _) i
9 Q/ I5 J0 V5 x, q- ` N- l- _stackptr:( y0 \" p3 g$ l, B& Y2 b5 z
- .word __STACK_END
; B* ]3 p" x' V0 { - _bss_start:
) \: S: U& M3 w1 g$ N G5 F - .word bss_start: u4 T9 Z4 E- O& c% i
- _bss_end:
8 u2 a* M/ x/ _. }. r, y( A - .word bss_end$ ^8 E7 O7 z. C+ j+ ^, j) ]& N: s9 `& ~6 D
- _start_boot:
' L$ }( h8 T+ {- q - .word start_boot. |$ y: Z3 |: Q* V( x8 m# g8 B
- _data_auto_init:# X( V+ c3 |7 o0 E! m. e6 U
- .word __TI_auto_init& M% h2 c; {8 \; I: W
- .end
' C$ E. z+ r- |7 ~ -
' i; I( u% r- q+ |) E1 q' e, V
; `. ^( K; f( ]$ k; D7 p: I- 7 {& V/ I1 j; g" ?. I0 P5 U
复制代码
" e2 j- C& {3 S/ X: b
/ d* I. L0 P" _- }4 q9 A9 B$ v i* o u6 d* d! V( z
/ c& A3 b ?, @8 ~* a; [( o3 Q$ S9 H/ h! p
|
|