|
4 V8 o4 s4 h- v1 e4 r
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句( y) I/ g2 @$ t2 W3 u& a
/* 重新配置程序入口点 */
! N- _; j- y w0 L-e Entry- /****************************************************************************/
+ R1 b8 a* y/ ~( j - /* */
: R' e- s2 n: s; d0 C - /* OMAPL138 及 DSP C6748 内存空间分配定义 */6 w. }! i& R- \" i, |; p# h1 e J0 |
- /* */
; [" _- W1 e1 M. W- J7 P, u4 }$ K - /* 2015年04月20日 */
1 x& }; H- K' n4 ^ - /* */, Z, z1 K2 x/ I+ K
- /****************************************************************************/
" g: H( y! y, d! }, e: H - /* 堆栈 */
5 [1 p8 _9 y/ O( e, f - -stack 0x80001 w6 w. V0 B7 |2 s2 s' ~
- -heap 0x2000! z! _6 Q" q) c' O7 ^1 e- r) K; R+ \
/ \- s1 A- U# s: Z+ {- /* 重新配置程序入口点 */3 l& R! e" E& K% G: `
- -e Entry
% Z4 H' J9 U3 g. R* N
& X3 P) h t5 J& _# z- MEMORY
' x% G9 L7 t+ m7 m - {
0 ?2 s/ c1 T: S5 e - #ifdef DSP_CORE( g3 {7 i$ G% D- ]' ^ ?9 h t
- /****************************************************************************/$ i& l, i+ e0 k
- /* */0 E/ O# E( s( B7 N6 V- p. e% z
- /* DSP 专有内存区域 */* A2 a4 c8 {2 H7 M0 F& U9 d
- /* */$ V& ~3 `& ]% {$ U; a
- /****************************************************************************/" T3 g2 A. M* { f
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */
: H& N. m" J# j) c: [ U$ Q+ V6 P - DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
9 B1 |4 Y: _2 V- n0 L - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */$ ]7 L* @2 | v j' X$ f i
- DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */$ T2 Q4 i0 C) |3 y; c- p
- #endif
复制代码 这是一段汇编代码用于切换到特权模式; C6 [6 t, e+ r
: e0 J7 M; W5 ^
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm, q# t% V! ^- K# E0 P7 N
- ;******************************************************************************# t2 @8 W1 J( |3 C
- ;) q5 z1 x G+ {6 i3 z. V; i
- ; init.asm - Init code routines5 h9 m/ [, r" h( P2 A$ z
- ;6 D$ ]) [; A* ^! Y0 F6 j* C
- ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/: f$ V! c0 `7 O3 ]
- ; All rights reserved., | R ` G8 b n9 z/ T2 r' \
- ;
% n9 y/ _1 w6 {( p" F; r - ;******************************************************************************; U; \; Q' z& K# S, ~
- ;****************************** Global Symbols*******************************
x" C* p: q- Z. Q - .global Entry2 d# A% E$ u: f5 x
- .global start_boot `" v' `# ]( R1 M7 e( N
- .global __TI_auto_init
' f! K* f7 e: Y1 a! J5 M; t' ?
5 r+ \9 f5 V: L9 I+ W- .ref __stack
: L2 R3 K1 q' k* r7 o - .ref __STACK_END& T" ~! Y( ]6 f) N
- .ref bss_start
. S7 ^, t) P, f a C6 w - .ref bss_end
2 \7 s* m( H& n# d0 v8 u& b - .ref start_boot- H* k7 _, ~! a- l# o7 O! ^( o$ x/ l
# k* W. _4 i9 @2 o' a, y& [- ;************************ Internal Definitions ******************************- t T8 P D' t
- ;
+ K6 |# L9 X z5 u! _ - ; Define the stack sizes for different modes. The user/system mode will use: X' }: l+ ~6 H& N( G' F
- ; the rest of the total stack size1 z( a. [( v4 N5 s2 r- q
- ;& x/ k' Y3 T" i" K) ~! c/ |
6 k0 ~- f7 ]5 a6 h9 ^- UND_STACK_SIZE .set 0x8
9 |0 g& i h* G% x7 V - ABT_STACK_SIZE .set 0x8
1 l# m8 v( E4 ]: B - FIQ_STACK_SIZE .set 0x8- H( g: s7 Q+ @2 b4 u1 F4 [( U
- IRQ_STACK_SIZE .set 0x500
G; w4 f$ h- n$ x6 ]! y - SVC_STACK_SIZE .set 0x8
# O# f" c5 c2 l5 B' R! I- S
7 k, Y/ G( O' g- q* ?& j F. C2 T5 u- ;3 r( G2 |9 g/ Y" ~: G& s
- ; to set the mode bits in CPSR for different modes
( D3 h; l" J @+ @8 \' `( H - ;4 Q" \; h+ z+ M5 M& L7 w
4 O1 L8 \% L! B' h. p$ f& {) o- MODE_USR .set 0x10
0 {2 {( I; k& i/ J - MODE_FIQ .set 0x11
; g8 c% }* x! z7 F4 F2 @- M - MODE_IRQ .set 0x12! x& w) Q2 u4 l0 G1 [$ b+ s% i [
- MODE_SVC .set 0x13
t* R8 r- c! P' l2 s% o! q% m: H5 D3 Z - MODE_ABT .set 0x17
. P. ]" L- y6 f# o0 s - MODE_UND .set 0x1B* e" ? n) F" @
- MODE_SYS .set 0x1F9 A# \+ j! g- ^5 |1 f" |! `
% V/ F. m9 @2 [' Y- I_F_BIT .set 0xC0. Q/ F3 L8 p" c4 M6 c5 k
- 7 B4 _5 V; D' E5 W Y& k
- ;**************************** Code Seection ***********************************7 V+ m1 y6 q* Q/ F& }
- .text
- `$ V9 z( P- j+ V8 f# W9 L. S
4 I3 } \4 |: R4 K- ;
- l7 e4 t- h) n) ` - ; This code is assembled for ARM instructions U. U7 k, k# h P4 G
- ;
5 I, N4 N6 ?7 t1 g# y5 W; C - .state32
' G- c7 S7 }' O& r7 \& L2 @ {( x. Y# R
. m# j; M9 E* h$ Z- E- ;******************************************************************************6 J9 W* {8 ^/ G5 v' E6 k7 }
- ;! I h( Q1 Q0 f
- ;******************************************************************************+ a) h- i+ O6 ~
- ;4 I. c: Q- B* V7 W+ [
- ; The reset handler sets up the stack pointers for all the modes. The FIQ and) Q1 y& o9 j( M4 S
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the9 i" c; t- r: b
- ; main() function.
! R; w, N1 C( v/ n* j, b8 i8 q" j - ;. l9 ?2 E2 e7 _; L0 I2 y& ^
- Entry:% Q v$ O2 N2 U D9 _- `
- ;
. g1 w. K" b. s0 p - ; Set up the Stack for Undefined mode& r# W1 ]5 x: R1 z
- ;
: L" L1 v& z! ?! ~% Z6 I; t1 \5 u7 e7 ] - LDR r0, _stackptr ; Read and align the stack pointer" M. n5 s# p- o/ w7 M" C, m8 \+ I
- SUB r0, r0, #8
& `* @& K) @9 M' r% a& N, o - BIC r0, r0, #7
9 E r q" B u) X - MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode6 C/ T3 m. ^0 w$ l- `- _
- MOV sp,r0 ; write the stack pointer& v& a4 V6 F! ?3 ?$ O3 }
- SUB r0, r0, #UND_STACK_SIZE ; give stack space+ q$ I7 r5 Y" \& \2 G9 J q5 r: Q
- ;
" j/ _9 H( v! R" ?* ~, w5 ? - ; Set up the Stack for abort mode
9 T7 ?8 o4 M+ K7 T2 H" z - ;3 S8 v& @& H& J* X% x1 `5 J
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode5 A: w" s/ ^% t* f! Y( z
- MOV sp, r0 ; write the stack pointer
; A0 q. a8 ^; a2 W5 _3 B! i - SUB r0,r0, #ABT_STACK_SIZE ; give stack space
. {, _- i1 l. @ L% | - ;7 F7 ?* y; @# }4 R
- ; Set up the Stack for FIQ mode
/ C' @5 Y# P4 K% R. d2 K, i - ;
1 f, Q& }( O& O) G2 Z - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode0 _/ C ~ O8 [$ I0 b; N
- MOV sp,r0 ; write the stack pointer
% ^( o% ~# }8 _; E - SUB r0,r0, #FIQ_STACK_SIZE ; give stack space& o1 G, [2 `# s$ [- c
- ;5 R4 A' s. l0 F. y: u
- ; Set up the Stack for IRQ mode, l% u& Q( y4 O8 c
- ;2 u! ]* ]" w9 z
- MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
N, s4 A$ R8 r8 R4 o7 y( |: @ - MOV sp,r0 ; write the stack pointer' l1 u# p d( T; T% j
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
: P! F _% |) m9 y* B - ;0 X5 H: g. y2 Q! I# N
- ; Set up the Stack for SVC mode
- B' W* _, M6 o \2 n& }/ ? - ;
& C3 a8 c- d. ~- U! h1 X$ k( e - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode# a, J" v" r- ~0 ?
- MOV sp,r0 ; write the stack pointer
2 ?9 K; ~% d5 A6 ~3 Y' U1 ? - SUB r0,r0, #SVC_STACK_SIZE ; give stack space( [# e2 t3 ]5 w6 o' V \
- ;
2 Y+ S/ a* T- k) D( u h* A( I5 V; E - ; Set up the Stack for USer/System mode
, Q9 f# y! S: @+ l3 _) E - ;
2 F8 B" {9 M6 W4 W9 {% o9 r* n - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode* }: k( b5 U$ x* M
- MOV sp,r0 ; write the stack pointer
& n2 v5 M. h; ~2 X2 G
/ G! K0 U. N, e( }: ^, N! [4 a" l- ;
5 L# K# `6 c) x/ T. r9 r3 h- z1 W - ; Clear the BSS section here( Z4 T0 g* J& ~- Q! ^
- ;
+ A/ g& @4 e2 h. v( k - Clear_Bss_Section:: a. e% w: ?2 L
8 H4 ^; [/ M" Y5 D. Q- w( V4 l% s& X- LDR r0, _bss_start ; Start address of BSS9 J0 P7 `$ n1 Y- }7 y% B( }, w
- LDR r1, _bss_end ; End address of BSS
0 ]' S8 m% p5 l5 q( ~* t9 F - SUB r1,r1,#4( @" ]2 [' ^7 O5 y0 J' Q6 t; @/ X
- MOV r2, #0- d8 @# [/ _( w' b, Q- Z q8 i
- Loop:
5 F6 Y& V) i" O" J - STR r2, [r0], #4 ; Clear one word in BSS' S. }* G& B, o t% P1 F. _! f' `) g5 W
- CMP r0, r1
$ _) A% f) C6 @& E0 v' g7 z8 R - BLE Loop ; Clear till BSS end
% J: ?) M' F$ p8 X4 E5 [
3 ^: t1 F, v' F9 T- BL __TI_auto_init ; Call TI auto init
, R6 e0 Q6 p# K2 o6 C - $ M% P6 `8 { O2 R
- ;6 }! ]5 Z Q5 Q1 z% o
- ; Enter the start_boot function. The execution still happens in system mode5 t$ p: v9 C: [' Y( c+ L
- ;& b' _' p) r& m, n: x. f, O
- LDR r10, _start_boot ; Get the address of start_boot7 s. O: g4 a% u7 J' k
- MOV lr,pc ; Dummy return + v& n/ D' ~; j4 \0 w2 W2 H
- BX r10 ; Branch to start_boot
. B/ r( ~& W- `+ J, k - SUB pc, pc, #0x08 ; looping6 i* ?! g% |+ H) @, ~
- ) _% F p' ]# X8 d# ^
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode6 H$ v c' J; i
- ; BX lr
" e+ T5 H& F/ ^7 K; ]% o" @ - ;9 {# X* e. t6 b
- ; End of the file
* x% x( ~+ a% T( \/ e7 u. c0 K - ;
/ z: J7 X0 Z6 `* _& D - / l/ p! g4 u r
- _stackptr:' V. I) b% _- c) u2 B* s9 q3 q0 i5 U5 ?) y
- .word __STACK_END" D; I$ ?0 D- ?
- _bss_start:' J3 ^) \9 \4 @7 x) F% N
- .word bss_start# C6 M1 @; y4 e- n- j, j
- _bss_end:
9 E+ H$ b! W: \ - .word bss_end/ o$ d2 r% d z+ Q
- _start_boot:
% t0 X: J% S( \* k W! }" a - .word start_boot2 P. \1 ^ ?1 b' ^( L
- _data_auto_init:
7 I; i. s) O, ^ - .word __TI_auto_init
2 w8 l, t- t b1 _, K5 _- E - .end0 t7 P) x8 ]7 k- e# F. v
- . r$ D+ h2 ?7 j0 O& `
% `; w$ \. q7 ]5 a, J
" }1 K# [; k, U' A
复制代码
. J1 c. ^5 x" y3 k/ `9 }5 |, T( X. i; Q8 s
3 c. k& L5 ]- D
0 V& k# E# z, \3 r
7 d- s a r! q |
|