|
2 |8 g+ I* Q. B, y8 a7 [( ~
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
* f1 C! N9 }, E/* 重新配置程序入口点 */% H$ M, B; S; [* ` V0 D6 I
-e Entry- /****************************************************************************/
- \- M& h: z+ B5 J8 C3 x - /* */
" E1 Z9 i% _) i" G8 k6 @5 S - /* OMAPL138 及 DSP C6748 内存空间分配定义 */
2 I& G1 @ |- j - /* */
~- j* q# S4 X - /* 2015年04月20日 */
/ [! m. m2 T6 f) F - /* */
( _% x- V9 N; |9 a2 a8 S; K5 @ - /****************************************************************************/2 \9 S% Y4 `( R4 j8 S' c' [' u8 p+ K( c
- /* 堆栈 */
9 e8 j+ i7 A! q# Q% ^0 H3 j l - -stack 0x8000& K9 x7 g; B$ |0 Z, o
- -heap 0x2000! f3 f* n0 e s
* s( D0 {+ D# |6 W5 \1 N. ]- /* 重新配置程序入口点 */
' b5 G e% c7 M m7 R3 L+ x- {) k/ Z - -e Entry$ a* O$ |, |, I, c/ ~
- ; d* S) R e6 i; U6 k# `& q7 d
- MEMORY
( q/ k7 D4 ]1 X; ]1 O - {" P& G8 G. f& a
- #ifdef DSP_CORE
% t5 g- }; X! u1 D, ~ - /****************************************************************************/6 O5 S# J5 _5 k$ T; q
- /* */) s4 `. l7 ^2 q c+ q- p8 v
- /* DSP 专有内存区域 */
: j3 A0 _* P: ?- |9 w - /* */# e! |0 T+ }$ W1 C6 C e& I9 K: s8 w
- /****************************************************************************/6 V- }& e# z3 J9 k
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */3 H. `% z; W, U2 C8 E5 ]+ A
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
# {) r1 ]0 p6 [; q! l8 b* b - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM *// r. W* m. |8 A) O1 V4 i
- DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */1 H p- d4 V+ d- s
- #endif
复制代码 这是一段汇编代码用于切换到特权模式
1 F& o6 U! [+ f) K% T1 O2 a- Q0 a5 v# S" }8 }# z8 K
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm: Z6 x. s( A! G/ A7 i: V
- ;******************************************************************************
0 G+ L& m1 y6 @ - ;) c4 }: ~' w# v$ X( s; Q! h0 A
- ; init.asm - Init code routines
2 e2 t3 v) `& M5 S& }. x - ;1 Z5 I" e- c/ Q7 E9 q
- ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
$ W6 T2 r( P& h* E' A0 M0 F - ; All rights reserved.* T& m# C: g" h6 ~" e2 c
- ;
* x5 V, u# w( a6 K - ;******************************************************************************
* `( I1 L9 m) [ - ;****************************** Global Symbols*******************************
4 `) O6 M% Q8 N1 Y: M - .global Entry' R5 n% i9 k6 g, X% [6 {0 R
- .global start_boot
/ `3 j2 C' J1 h& Q - .global __TI_auto_init
, A- D! w& t! Y, [- j- J/ R - ) ^2 I8 @! g4 b2 }
- .ref __stack1 |/ m3 _4 S7 K4 C& X
- .ref __STACK_END
- N! `4 z* N# z: }( u+ l/ e - .ref bss_start
- b6 ~, ?0 R( q. k, d& { - .ref bss_end
. Z& _, l' I( m5 m9 {! O" O - .ref start_boot
! ` S2 f2 y. {. y9 p! D P - 9 p' G$ h7 j5 o$ p! I4 M% d
- ;************************ Internal Definitions ******************************
! E4 `# {6 ]3 V* f2 |4 m - ;
, {4 u% g4 E# S/ Q; c" v& J E4 \' X1 V - ; Define the stack sizes for different modes. The user/system mode will use
/ Y6 O1 c0 u3 y4 |% _/ w - ; the rest of the total stack size, K. n; ? K, I( \, J5 P1 P
- ;
1 L C9 D9 o7 u2 i1 P% j
- q2 x- R1 ~/ `- UND_STACK_SIZE .set 0x8
7 n/ \4 x) L2 O0 h$ q1 a - ABT_STACK_SIZE .set 0x8
+ g0 c- s& o3 e% K2 D - FIQ_STACK_SIZE .set 0x8/ W7 I" H3 e# I
- IRQ_STACK_SIZE .set 0x500
8 R+ @/ `& s( l" o8 r% z: t7 ~ - SVC_STACK_SIZE .set 0x86 ~# ]/ r! A3 E2 s# Q
o( Z& |1 _ R7 W# Q) k2 |- ;' @$ ?5 ?( n( P0 P3 a. c
- ; to set the mode bits in CPSR for different modes! b$ r6 J4 E G, R! w& u5 H
- ;
0 e! n/ ]+ t, f8 n E8 S
, ^9 r+ C" L1 t! k- MODE_USR .set 0x10' `, x$ E( I& \ S2 G! i
- MODE_FIQ .set 0x110 Q: x+ {3 |' C+ z8 m
- MODE_IRQ .set 0x12* \$ d$ M" x0 N8 x( z$ W2 Q
- MODE_SVC .set 0x13
: r+ P( e8 O* M: J* R, q - MODE_ABT .set 0x17, c+ Y/ [4 G! G, N
- MODE_UND .set 0x1B' c# _0 f6 u) }8 m
- MODE_SYS .set 0x1F
! i, R0 y: Z1 h0 O& I, A
% U! M. q; \, S1 |9 Q, D: M8 ]- I_F_BIT .set 0xC0
7 d P u& ?! a! @3 M - 8 @6 X0 e) O+ Q/ q1 D( \+ i" _
- ;**************************** Code Seection ***********************************2 U9 u# l- o' s$ W% _4 `) |
- .text/ f3 N; Q. T$ i# m2 f
3 ^2 V" c3 K6 E& S' C; q' f- ;, ^/ \! X' N& s# O, o
- ; This code is assembled for ARM instructions% Q6 \/ ~1 B; r, [5 ^6 V1 z5 y0 K: g
- ;
, a5 U, Q4 d+ k- }6 H) X. g. n - .state32+ P. p I, |% {4 b7 c
) |1 e; I4 T0 {% O- ;******************************************************************************; g3 b& n% I& j. v8 G
- ;
7 ]0 U( h; X9 a8 g - ;******************************************************************************2 V$ z9 E" a# s8 h( A+ u6 V1 ~
- ;
8 m8 H8 S( T6 z# n+ o/ b' ^+ R) m+ ] - ; The reset handler sets up the stack pointers for all the modes. The FIQ and
1 F5 k2 w" l7 K7 Q+ | - ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the! A N: w- p, C# ~7 c* d6 V# D: d) o
- ; main() function.- u, I+ P( a6 G' m- s( |9 N
- ;
; N% X, d4 F x; e - Entry:
" d) I- ]3 ^$ k( N - ;
1 R* f3 L! V5 G) r - ; Set up the Stack for Undefined mode# }: D# B# f, c$ \; \* ~+ y- M
- ;7 y3 X: J! _* n8 n8 L
- LDR r0, _stackptr ; Read and align the stack pointer1 r8 x- t$ l2 B) x M" _4 C& l% O
- SUB r0, r0, #8
6 c2 X# N# _$ r: u* K* d - BIC r0, r0, #7% B0 b# M" l) z+ E2 k
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode( \$ B5 r1 f4 N9 U
- MOV sp,r0 ; write the stack pointer
6 t2 ?' S* O' T9 P! m' ^ - SUB r0, r0, #UND_STACK_SIZE ; give stack space" T- E6 t& A( G2 X0 k8 q, {
- ;
* D, j/ L! a; N% T - ; Set up the Stack for abort mode
% [1 B1 b4 R" ~3 Q( t& T) i9 M - ;
+ G. T1 F$ I6 J: o( T& C - MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode3 O$ q9 H" `* o' d1 a2 }
- MOV sp, r0 ; write the stack pointer o0 Q# k( }. F( v
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space
# i. X' p5 m! v8 A - ;- X2 }( J6 d! U5 L- o1 E
- ; Set up the Stack for FIQ mode6 v+ P( j( ~! C# h7 [
- ;4 a6 B5 j# J& l+ z1 B
- MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode9 }% P/ R4 g m8 k: H) _
- MOV sp,r0 ; write the stack pointer5 Z8 s8 R4 Y0 _1 i
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
5 t+ n5 d" H( e$ {; ?( Q5 e - ;
+ Z: a: r+ u) [* ~ - ; Set up the Stack for IRQ mode/ g% B6 {1 E& T, e) S
- ;
$ y9 m+ B5 A# s- P0 h - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode) D/ z9 Q- r% y: F
- MOV sp,r0 ; write the stack pointer
$ H: n) D- ?) | - SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
* \# C8 u" y$ S+ K7 S0 r8 l% E, e2 q' e - ;& t# J2 Q; {, c- [ c' O1 a
- ; Set up the Stack for SVC mode
( x+ g' o6 a% R" d- Q O; o - ;% \- W5 U1 v& Y: Z
- MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
; ~( p+ _( X' M4 a8 w - MOV sp,r0 ; write the stack pointer
6 R+ {- [ @6 W4 Z9 E - SUB r0,r0, #SVC_STACK_SIZE ; give stack space+ W; Z% g# U0 ~& P( K* A
- ;
6 {: o* S' u) q- q4 H* T# b8 ~ - ; Set up the Stack for USer/System mode/ M+ Z/ e0 U$ z# j' z
- ;/ w6 m/ a" ~9 I- K
- MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode( \2 k! ~. K1 h4 |$ V& i s# k
- MOV sp,r0 ; write the stack pointer
$ B+ c& h& O6 e9 M - , G; [/ a0 i( V: P4 @9 I
- ;
! a* o7 G& P* e) d! i - ; Clear the BSS section here2 H* E o3 D, J+ D C4 _& V% }
- ;/ \: O6 {- Z3 f i6 J
- Clear_Bss_Section:+ n5 ]% ?- [, G2 v3 {- |, j
6 U, E, ?2 {* {* |& e- LDR r0, _bss_start ; Start address of BSS
0 V' w8 F) z) [ Z. O& H - LDR r1, _bss_end ; End address of BSS
* ?, L) M! ?3 k: A8 @" d4 L6 h6 R+ k - SUB r1,r1,#41 Q( {1 j/ f0 l* ~4 F6 L
- MOV r2, #0
5 B2 o1 L3 v- X R - Loop:
& H. K' w4 E6 v$ v. V - STR r2, [r0], #4 ; Clear one word in BSS
, \2 Z8 e+ U. [' o$ @0 f - CMP r0, r1
: Q5 b# R5 c5 L0 p1 K+ X( e. _ - BLE Loop ; Clear till BSS end
7 C1 S$ h- R8 i O
4 B; w! Z2 v3 y) W1 x9 r. s- BL __TI_auto_init ; Call TI auto init
: l' g- y8 W, e7 R1 \+ D8 ? - 3 S1 m- ~: O3 F$ I( t5 k/ j
- ;$ u5 K9 C0 q( ~9 E# h$ w
- ; Enter the start_boot function. The execution still happens in system mode1 r. s" N3 ]$ f
- ;
% A: U) k- D2 G - LDR r10, _start_boot ; Get the address of start_boot
6 i% O, j O8 n. T/ d - MOV lr,pc ; Dummy return
. U1 ~! v6 [9 W - BX r10 ; Branch to start_boot
1 O3 N" }- |$ ~ R5 Q6 f' d- [ - SUB pc, pc, #0x08 ; looping3 d0 l' o. {" J
$ p# j" {( o% }) I) o- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode" O7 }, R: I0 S; C9 L0 i
- ; BX lr
5 o- g; D: m" t% G. Y+ t& X* l2 E - ;
9 M" F5 F7 u. t- q' U v" N* c - ; End of the file
4 ?1 Q" `" p7 C/ T) [- k - ;- [$ u& c9 `& K- F% R7 @3 y: J
5 O# j \+ n+ L3 ?0 L- _stackptr:
8 s L( U F5 b7 ^8 n - .word __STACK_END
! q8 h) l8 i! u - _bss_start:8 w8 o9 ?1 k) \" P/ [% L! B: i; O
- .word bss_start
/ E% L; i2 |7 R2 O - _bss_end:& t) p% S( M5 B- |5 @
- .word bss_end5 j! J* z! w2 h- d8 Q
- _start_boot:2 v/ }0 y4 f* a, ~9 e1 D
- .word start_boot' }+ I4 ~1 C" v* l
- _data_auto_init:6 X9 s3 M7 N! A( k* F7 v! s
- .word __TI_auto_init' P. J7 z% N0 P# H# \
- .end9 i1 E. Z3 U# ?: r% g2 P' v( u
- 7 }- J6 ]4 u2 O) v# _2 O! V2 @- w: F
- 5 ]! m: A X7 M" O
/ P, p9 A" {4 s% y- v o
复制代码
3 r& |% T7 V% m( u
: E5 f. W# \/ }$ L1 l* v* F* A7 {$ a! L# {9 w: _
% W% C4 r0 R" ?* I7 N& g3 `- }% x
) w6 v2 X9 `3 }7 r/ _4 `% W S R |
|