|
4 s; X7 E2 w! F9 |4 w- b在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
' Q; t3 I3 F0 v0 ~ K; q$ O/* 重新配置程序入口点 */
3 E& X% P* } ?! S7 i-e Entry- /****************************************************************************/2 I* Q" A, @3 \: j
- /* */
, R+ `, @. y9 y - /* OMAPL138 及 DSP C6748 内存空间分配定义 */0 G0 `$ h- u/ O& h
- /* */* e( ?, d3 X' g( U5 e$ U! j
- /* 2015年04月20日 */
3 O4 ~0 E9 }3 L1 L% j - /* *// n% W+ L5 ]0 D( K2 a, h
- /****************************************************************************/0 O4 l {5 r! S$ _3 W
- /* 堆栈 */
* P/ v) r2 c# E: R8 ]9 C! H - -stack 0x8000( j) Y; H) m" ?8 q. t
- -heap 0x20003 g% d. J; n y, r- a" S( ^
& ^% A9 j) u' P, F9 P- /* 重新配置程序入口点 */) ~6 n; k0 x! x: H* F
- -e Entry
3 Y5 f, [" ]; G* J- V9 O7 F - 7 J6 Q) a) f* S# Q" u. z
- MEMORY
' g: v& k6 }- c( D - {
% X8 q. w9 A y% O$ P$ r - #ifdef DSP_CORE* k3 i: |2 x& E
- /****************************************************************************/# ]" S0 h+ H, W/ t' k
- /* */
- Z. S8 A7 o R - /* DSP 专有内存区域 */
: s7 C0 r0 F) F7 s6 Q6 m - /* */
& ?; r% u0 D# S1 { - /****************************************************************************/& X1 b- f# Z/ u, V' l, F
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */! B1 u% q: b% x% S" g2 L
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
. K+ ^/ d0 B" p7 O& X6 Z - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM *// g2 N+ P; i* @5 J; s7 Z* G
- DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
9 {9 F/ S" g' b& J9 x5 H - #endif
复制代码 这是一段汇编代码用于切换到特权模式! q* f) m$ [0 h. N8 W. W. Z! Q
0 g, i+ J5 |- n5 j; a' P% s/ R* T
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm
' c9 e- M! l8 b1 }- y. }! R- ;******************************************************************************) g5 x, B6 f, F+ z: r7 k
- ;3 [% O, h$ z( S4 c
- ; init.asm - Init code routines' ?4 ?( [- e" v
- ;8 N! L6 L0 ?- w0 U6 S) N6 R9 q
- ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
: _# b ?8 J& E# Q1 c - ; All rights reserved.
7 ?. N7 M9 ?* s - ;
* L. K- O" p& w* Z# z( n E - ;******************************************************************************
) d) r9 x: h9 K7 Z6 `; { - ;****************************** Global Symbols*******************************
: g. C, ]2 t6 s3 q' f6 _5 ?! @ - .global Entry
8 W7 O/ i9 ?# w Y: L - .global start_boot5 J# `+ d6 n' z, }
- .global __TI_auto_init3 U4 }7 r6 g2 P, _9 F
- 1 y' q7 s4 d- }! |. M; P6 u+ v
- .ref __stack
: H3 M% G9 U& F9 a. N - .ref __STACK_END/ i5 F& d4 j; V4 W
- .ref bss_start2 y" Q+ O, ^; x5 y
- .ref bss_end
: t) }3 Z' B8 G$ O3 Y% u5 f - .ref start_boot. X3 ^ w6 ]2 z X9 b
" }+ t: a6 k+ p) s3 Z- ;************************ Internal Definitions ******************************: l3 C. U3 s- r9 G
- ;. ?2 }9 z" G8 k* r8 b( r7 r
- ; Define the stack sizes for different modes. The user/system mode will use' P" \5 B; m2 H. q" [
- ; the rest of the total stack size; }9 ^, ^5 E: D' T, Y* ^
- ;# o; C7 `# u) V2 y V3 o$ j. h
5 v5 G3 e6 Z5 ], T" R- UND_STACK_SIZE .set 0x88 W) q; j2 ?7 \$ d) c a
- ABT_STACK_SIZE .set 0x8# g+ c- B! m( I) K5 d% H
- FIQ_STACK_SIZE .set 0x8# ^% l2 X: o" @
- IRQ_STACK_SIZE .set 0x500# [9 w3 U4 ^* ^. G$ t# F: }
- SVC_STACK_SIZE .set 0x8& h& z2 q7 P3 W" d7 ~6 z* N
- + p5 c# X7 ^: h
- ;: b, f/ n6 I. f
- ; to set the mode bits in CPSR for different modes+ c0 L4 l# @; @
- ;$ p* S; _1 T; k7 N! N* T
- % g# X2 B( b' ^" r7 v1 ]
- MODE_USR .set 0x104 k3 s3 _, B p! [
- MODE_FIQ .set 0x11
. L l/ C' Z$ {4 [ Z6 U& U - MODE_IRQ .set 0x12
5 k+ @# c5 P0 q% g4 \& m V - MODE_SVC .set 0x13
' x1 H3 d* X8 K* a- j0 o' P - MODE_ABT .set 0x17
; q1 Y4 ~! `# V: S) |8 l - MODE_UND .set 0x1B
% n! U) p! b2 f) V' O) S - MODE_SYS .set 0x1F
2 F* w3 n/ q4 ~ i - 9 m( h: n; B9 q6 a; ?
- I_F_BIT .set 0xC0% w1 h0 u& s( r5 H2 Q3 Z( ~
- ) I7 E8 M, ]/ U! V; R
- ;**************************** Code Seection ***********************************; G. v5 o l8 Q( ^9 s5 ~
- .text* D. z: x4 h+ }1 C
- 8 b8 j$ m$ K& H' v5 f1 E& g( \
- ;
1 ^0 @% F$ b3 C/ L- i - ; This code is assembled for ARM instructions
) ~9 y: T f3 o* y - ;2 Y `2 ]$ w" t6 _# y/ `
- .state32' {4 [) L7 g- b2 }" E
7 J. y2 _. ]& A" g- ;******************************************************************************
- `% g7 R( N0 r- x% ?1 S- E - ;5 z1 X5 Q' G' T6 v. j! X/ v
- ;******************************************************************************
4 v8 T! V' [5 {6 O - ;
+ V/ K# @9 T; `& \' { - ; The reset handler sets up the stack pointers for all the modes. The FIQ and
6 m2 e" K8 G- k& _7 P - ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
; c! c( p) ^/ Y2 t. h2 z0 b - ; main() function.
1 u$ i& Q$ b5 t9 m! Z - ;
P' z K& I9 K9 C - Entry:
, d0 r, b+ w ^, ~7 E+ V - ;
5 @! ^' _+ e$ F( z2 |" Q0 Q" r - ; Set up the Stack for Undefined mode
$ b/ V, ?! `, Y" V - ;2 s! X" p I3 |' y" Z
- LDR r0, _stackptr ; Read and align the stack pointer
0 B! [/ v2 i% D) F) N, [ - SUB r0, r0, #8
8 q' Y( W+ L4 K7 j( Y: O - BIC r0, r0, #7
$ R0 d2 w3 W3 X' H: F5 ? - MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode8 T& @. T- z& ?9 Z- F" b0 q
- MOV sp,r0 ; write the stack pointer4 |; Q: s6 r# V+ K. _* `8 `
- SUB r0, r0, #UND_STACK_SIZE ; give stack space6 _" K$ P' ?$ n2 O1 v
- ;. J. }! A, o! c. Z
- ; Set up the Stack for abort mode
" ]6 s! n# |$ G6 c% V3 N8 T$ E! L - ;
) n! N. [( P* n9 ~! a1 g% J - MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode5 f; r7 ~7 |6 _4 I, @
- MOV sp, r0 ; write the stack pointer/ B" `: r, H0 |) ?+ K: ~* Y6 [5 r
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space
% l& p# ]' X' G; e - ;
6 U% u7 T; n/ j7 ` - ; Set up the Stack for FIQ mode( o1 A' a) D# _7 ~: n" l. R# Y$ T
- ;
- j1 O1 ]8 t: U( e* ~) d5 U - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode& u7 e% f& {3 ^1 E0 d; @$ O8 `$ f
- MOV sp,r0 ; write the stack pointer9 ^, w3 U) t/ [0 n6 w
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space. z) n' g1 _ e# G$ L4 b$ C4 O
- ;( I# o9 O* g' L) v* W% y
- ; Set up the Stack for IRQ mode
( F2 R2 k* Y; J7 o - ;3 K8 b3 a; s9 ]
- MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
. W7 H) e8 I" ?5 t" n - MOV sp,r0 ; write the stack pointer" H% i( [/ V2 x; @: g: }- i
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
; ~; E' ~6 L0 }! Z3 V - ;: o0 L, j) ]% v: m+ D8 X# Q c0 \
- ; Set up the Stack for SVC mode( K! H0 {9 m# ?+ R
- ;
, u6 p) y5 s& B+ d3 U, T s/ M) q& x0 [ - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode# M, T: Z, l* u, ~5 o/ j5 H ~# {
- MOV sp,r0 ; write the stack pointer
) e% g/ ?3 |' h, A2 R3 Q. W$ w - SUB r0,r0, #SVC_STACK_SIZE ; give stack space
/ w$ P8 x: g' d2 X8 A7 t% h+ A. h - ;! |- ?8 s' ~4 Y+ D; I4 C) u0 g
- ; Set up the Stack for USer/System mode
+ A# e' ?) q& Q. c- \+ p - ;
* |3 N+ W4 [, y, K - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode; `% ?$ u! `( i* e
- MOV sp,r0 ; write the stack pointer( G" Q7 ~( c* u
- 1 S6 v7 P1 k a; \( N- H
- ;
+ w- S' r2 B& q$ B% a - ; Clear the BSS section here
: S% L# Q) K" A$ Y5 C - ;& J% x8 o$ E2 C
- Clear_Bss_Section: {8 \+ s. f: X5 r
- 9 e9 H- A" c/ N: S' e) E, P
- LDR r0, _bss_start ; Start address of BSS
3 _: O- q) ]9 c0 E' b; ? - LDR r1, _bss_end ; End address of BSS
; G4 a5 j0 `( O( R5 p2 b7 G8 t - SUB r1,r1,#4
& r+ m, u$ G6 |, K2 C - MOV r2, #0) \ n0 u8 ~8 [0 d& _; U0 ^) x7 B
- Loop:
( q4 { J, w2 l3 p& y9 ~, ` - STR r2, [r0], #4 ; Clear one word in BSS
% X# I. p1 X- |$ E9 w3 q - CMP r0, r1' Y3 o! X' @' [
- BLE Loop ; Clear till BSS end: E6 Q6 u& R/ U' [
- . S3 w* I9 z6 S6 K0 l
- BL __TI_auto_init ; Call TI auto init3 Y9 e. ^ I7 Q, A6 ^! E) v2 y7 T
3 S5 S( |( a: z2 S- ;
) y0 ^ d$ F7 D - ; Enter the start_boot function. The execution still happens in system mode
& P# T) `6 i+ A3 Z - ;$ y9 }2 X& D- U4 Y$ D0 B
- LDR r10, _start_boot ; Get the address of start_boot
" l* s% f7 O, K: g: f4 G/ Q) @, J1 } - MOV lr,pc ; Dummy return * g! A8 O1 [+ v6 F& ?
- BX r10 ; Branch to start_boot
6 w! w+ E4 f. _! P - SUB pc, pc, #0x08 ; looping
1 K, f5 i, x$ l3 Q w4 X2 |( y - * l7 ~$ a& {+ s) w+ B) [) ^
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode& g0 ]: e4 `7 F/ }' S+ y# H
- ; BX lr% w/ g2 N# _) c1 u" U+ A8 }' }
- ;7 f$ h" |! b) o6 n
- ; End of the file
, Z8 ^1 d; |; `) Q5 A) d$ ?2 r - ;
" m- P8 W$ \1 ?" H, E) o5 l3 ^
& p* D$ _1 z( N- _stackptr:. T; ^3 ~8 }( K
- .word __STACK_END J; E% K+ G( Q
- _bss_start:
% b6 P" \0 b3 c3 b' o - .word bss_start
8 U7 \ _3 a. ~$ k- v& w - _bss_end:; n4 C5 M4 T3 S6 r7 s% N
- .word bss_end
4 y$ s6 H K; S - _start_boot: A. w( J' Z( f0 T& p# |
- .word start_boot5 F, D5 I+ l$ G' H; `8 S) ]
- _data_auto_init:
# `1 K+ P0 ^ { S, L) Q1 M5 {% Z - .word __TI_auto_init
9 l9 a$ w; {$ g) q - .end3 j2 o! p4 L$ C8 o5 v2 {
-
0 o: X1 b2 y* b" W0 S - " w3 E* z7 G3 k m
$ B/ Z9 E! N0 _/ B
复制代码
+ O" ~2 m0 v& g' V, g/ ^9 {3 N* X" j5 V3 h! S+ e2 I5 q5 {
% ?! R: D5 w% p) g$ P$ F! h& ~9 b/ l- k1 z
2 o) g/ s# O* q# n3 ~/ q |
|