|
: u- R0 o* e' _ K在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句3 R6 K6 x" M' y. e9 a" j. S7 E
/* 重新配置程序入口点 */( V5 P2 ~# m8 t4 Y' r s* o/ w: P
-e Entry- /****************************************************************************/: x; r* @4 [" t% G; P ]
- /* */! X2 Q* E$ k' N5 {2 k7 C: A3 b) w- d
- /* OMAPL138 及 DSP C6748 内存空间分配定义 */
5 O \: x8 L" P+ r# f - /* */
$ b! h5 x$ n/ w o% T ? - /* 2015年04月20日 */- s3 o% Y2 o, ?: \: h
- /* */
. ~, H' C* X, `/ ~5 H. h - /****************************************************************************/
% }. V* t3 G; J* ]- d. q+ ~" W - /* 堆栈 */
' G8 N4 b2 M( j# F7 [- L" A - -stack 0x8000# ^5 |( [& v( G% [5 |3 X- s( w
- -heap 0x2000' ]( l: v, z- B: r7 j
8 U- Y4 T, J$ w6 V- /* 重新配置程序入口点 */
; e+ S W v: v! l! u* K; U6 f: \ - -e Entry
) f: N1 V+ \# W; K
( v- K1 z7 Y' _- MEMORY
0 ]; j% @. r- y* }! c7 y - {* P& ~6 {, [1 n! t [' c
- #ifdef DSP_CORE
$ p3 M- b1 C- K: k( x& H - /****************************************************************************/
. r+ e: P4 f6 X5 ~, P) n - /* */" t% K- {4 `% R8 K o" G* W _3 P
- /* DSP 专有内存区域 */+ F y* v) ?7 U9 r( l
- /* */+ o: p7 \4 Q) b3 F \
- /****************************************************************************/
/ V! B) q4 S) u6 v7 {" p) L - DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */ @, a- Y. X6 e+ b+ [
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
: [7 l" }1 p Q - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
% C; l5 I8 U4 n3 I# J - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
1 K4 Q( a0 B; m* C; k6 {7 X - #endif
复制代码 这是一段汇编代码用于切换到特权模式
* b% ~6 I# G3 Y/ v/ T
1 y. P" p P* l! p4 |OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm
8 e5 [5 ~) Z+ z- ;******************************************************************************# h1 f6 g0 ~. ?. A6 _ A! g
- ;
$ S& G/ h! b! C3 U - ; init.asm - Init code routines2 f/ b" _( }- t6 T1 F e8 H! P4 h3 }
- ;, Q( H' N( I: f/ k5 a
- ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
# D6 `4 u$ z: k' \ - ; All rights reserved.& |9 G1 i+ [6 h$ v5 H5 V8 A2 q
- ;
$ _( _! E6 ]3 w0 F - ;******************************************************************************
* X. {9 T1 e% c# ~/ I - ;****************************** Global Symbols*******************************
2 M9 h) R1 p' Q) y" P - .global Entry
0 ]% _5 D$ w9 C - .global start_boot. W- c8 X5 Z" b( O1 Y/ y. k/ e
- .global __TI_auto_init. j% I$ k2 Q! n5 |7 i( o
- ! P( K/ J# L6 A
- .ref __stack
# w: P9 `. l9 t - .ref __STACK_END
$ }8 f' T2 _7 O - .ref bss_start, J9 I% H( S0 k
- .ref bss_end
! ]) m( F' ?, l1 J8 X+ D) U - .ref start_boot
1 l+ ]8 L' i' Q9 |8 V4 N - - o; F8 h8 d/ b0 n, j1 I% {
- ;************************ Internal Definitions ******************************
+ H3 s7 G, z1 N - ;
+ O2 S' {) ~0 s$ l! [. H - ; Define the stack sizes for different modes. The user/system mode will use
" G6 E4 O5 R! a+ \ - ; the rest of the total stack size
6 S6 j8 N- e: w) c9 } - ;' d( }6 _3 y+ w8 z! ?0 s9 f8 n
- 3 T1 R: F. y" @4 r5 D! F* r
- UND_STACK_SIZE .set 0x8% S7 C$ g4 ^0 Y2 W
- ABT_STACK_SIZE .set 0x84 }6 Y$ c1 k- U5 k. C; Q
- FIQ_STACK_SIZE .set 0x8
; w6 O) c9 o$ ?/ O* V* P, ^ - IRQ_STACK_SIZE .set 0x500
8 e4 q6 _8 q2 K - SVC_STACK_SIZE .set 0x8
; {4 c& i+ ~% L: g; y$ o2 u9 s1 {
- j9 v$ b: d4 _2 R& a* _3 N) A$ m- ;
8 h& G6 A( q, P# @/ L# W& H - ; to set the mode bits in CPSR for different modes- V& h, @' y2 X4 N2 Y- V4 T
- ;
! M% r z& \1 R" ]# F0 ` - ' S7 H8 w: x, \ ?/ q6 f5 _9 E
- MODE_USR .set 0x10
: y4 q* ?( }8 l3 D+ k3 c" s - MODE_FIQ .set 0x11
; u; Y2 h' J- T7 x - MODE_IRQ .set 0x128 k! W1 L; H3 Y4 V( n* f% i8 R* u5 b- ^
- MODE_SVC .set 0x13
[! e- E9 k; V# | - MODE_ABT .set 0x17
% [3 q3 @8 R6 ~% Q& |- ` - MODE_UND .set 0x1B
, U# s, ] F* @ - MODE_SYS .set 0x1F* c- D" o; E% t; M, Y
9 |1 J" m) G( I5 k$ ]& S! m3 [$ U- I_F_BIT .set 0xC06 v/ K; ^! O' z8 B3 N" ?0 g- J5 K
) H1 l% ~5 u) l& z+ `- ;**************************** Code Seection ***********************************
" p8 C* r4 |5 T+ @1 f, K0 K - .text) h J. u8 a4 N4 b. T: u
/ k1 I5 u% c+ Y- ;
. O9 b* Q. H' U; a1 ~ - ; This code is assembled for ARM instructions
' c2 k- C2 q- a8 l) l2 b/ x5 d$ F - ;# @, V. ^0 K! N F; u, @$ G
- .state32+ D' Q. n% Q6 ~: v0 a
- , _/ X4 n4 e4 u
- ;******************************************************************************& A3 F# O0 ?: p3 r0 n
- ;
( t7 k# ~3 w. i# u1 F/ U - ;******************************************************************************3 T% N- R1 l& m3 N4 w
- ;
' j2 @" R) S4 g - ; The reset handler sets up the stack pointers for all the modes. The FIQ and( i g7 E9 o+ |5 U1 v _* ]
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
3 G2 g2 E2 P7 Z7 I' Q6 U5 }" F - ; main() function.
) e; }& A- I6 y' ? - ;
6 h6 b8 E! m$ _- R - Entry:4 K% U9 L G" H6 i
- ;
2 `: `6 e9 c7 K+ [/ \- [ - ; Set up the Stack for Undefined mode
% k% h5 U) I1 B( U, ^8 u - ;
1 L9 ^. E( @+ R3 I8 I4 G' H& j* O, I - LDR r0, _stackptr ; Read and align the stack pointer6 U8 L* w. ?. l
- SUB r0, r0, #86 F. I' x1 S. D9 ?
- BIC r0, r0, #7
; x6 |, v$ v" F( w - MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode5 L4 y5 Y; g3 G/ Z% u% ~* R
- MOV sp,r0 ; write the stack pointer
* r6 _: M" H) S0 i# C" f' [ - SUB r0, r0, #UND_STACK_SIZE ; give stack space
/ u; }! ?; J& c0 u$ G+ l3 \ - ;
) g" _7 T* i4 W1 N0 p. N4 ?* O - ; Set up the Stack for abort mode
+ T* w5 W) N6 z$ U" d - ;
& h8 _; P) X7 a" w: M" u - MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode
( i0 p* r0 t* g5 W - MOV sp, r0 ; write the stack pointer& p. W2 ]% W4 [# c5 @
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space+ k3 F# y3 E- j8 R- a; `2 u$ B
- ;
) L, W Q6 E t$ |6 D - ; Set up the Stack for FIQ mode! c' J F- q3 x: |3 z. [( Y
- ;
z D2 C. U, x; M - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode# w8 _8 ]2 |1 H, [
- MOV sp,r0 ; write the stack pointer+ _! Z1 g! F. K+ d8 V. @
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
2 S: W# q+ o' ]4 A) u1 \2 a' Y - ;
0 {# a8 s# E+ B - ; Set up the Stack for IRQ mode
; R* ]( i! k# U8 @, l0 O" Q - ;8 P2 P6 [5 _4 o1 o' o7 [
- MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode6 y( S# J% Y3 {, v/ }, X
- MOV sp,r0 ; write the stack pointer# ^: e3 ^0 {- Q" [) x& K' E* v
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
1 @& _9 {: R& d4 |$ x' q4 P - ;
+ i$ L/ I0 I9 p - ; Set up the Stack for SVC mode
0 j4 X; K0 V; w - ;
; }8 w! @/ U+ h - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
* m" s0 ?* X/ _) n; t# w - MOV sp,r0 ; write the stack pointer2 k- ^5 z4 o5 I0 t% ^& w2 r
- SUB r0,r0, #SVC_STACK_SIZE ; give stack space
J$ m+ `# E4 B- t! ]9 C - ;
* h5 B* Z- }) V+ x - ; Set up the Stack for USer/System mode
5 N8 m# g+ ^) o! |3 N2 J% a4 O - ;1 o' i& q4 v2 X: i
- MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode; @/ I& F2 X( K! L+ `; J
- MOV sp,r0 ; write the stack pointer7 c. J$ g) Y5 z: d. B
2 C1 Y' }: s4 S5 V9 o% F- ;7 G) g' k. q# x' R6 V; _8 |) M
- ; Clear the BSS section here
1 ?) r3 c) T' ~" x% L& M - ;0 S9 |) \ ?0 f. Q ^2 }
- Clear_Bss_Section:
$ N- ?9 H% D9 o2 Q - 9 Y+ `9 {( H5 D0 u7 ?* j4 Y6 j
- LDR r0, _bss_start ; Start address of BSS7 r" b1 ~' g+ L3 U4 \
- LDR r1, _bss_end ; End address of BSS1 R: [6 r. `9 A4 A
- SUB r1,r1,#4
+ z. F' i/ D1 I, v* m - MOV r2, #0
9 w. `- f" I" [# i# Y - Loop:
1 o& _. j! H+ _2 p2 y5 j - STR r2, [r0], #4 ; Clear one word in BSS
# c+ @3 L2 k a1 e$ j! P - CMP r0, r1& t' S! ^, o' W7 M3 k4 U$ k9 ]
- BLE Loop ; Clear till BSS end
# L; w0 F5 ~3 B6 t% R ^, `
8 Z3 f. S' o2 I `0 V6 \6 H' C% b4 {- BL __TI_auto_init ; Call TI auto init
* \" p9 _/ e) d [4 W( t - 4 V7 A& D4 j% X2 Y
- ;
" i2 y4 ^& T/ L) ^: v - ; Enter the start_boot function. The execution still happens in system mode
# ^: S A, K; E+ f$ x - ;
2 w9 l4 u7 L; H n5 L t - LDR r10, _start_boot ; Get the address of start_boot
- h) j/ C H7 l w1 c' i - MOV lr,pc ; Dummy return # o6 D" M) E0 e0 u' S
- BX r10 ; Branch to start_boot9 t, M; K4 g! T/ R, M6 K, D% T7 n
- SUB pc, pc, #0x08 ; looping
. J& \; N* z3 S! A4 x - & O' K! s, A; s. |0 q2 {
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
. x+ i& y6 L% c: \ - ; BX lr
- g6 L3 Y2 K7 I+ Y6 w - ;7 L# Q3 x2 _7 M, p
- ; End of the file0 U9 v8 ~8 B: k5 Q1 R0 J
- ; ~& _4 H( C3 W) J% E* s$ g
( q* m; |* H+ a# N8 ^, \9 L: c* Y- _stackptr:- s. N' Z9 E9 f U, z* ^
- .word __STACK_END
4 U* z3 \% T0 _' C8 O - _bss_start:& t$ A9 _0 L8 N/ B& a9 a
- .word bss_start
! J; E5 k0 Y3 |6 H8 a; a2 | - _bss_end:' G9 l1 l Z i% |5 ]- J+ p* J
- .word bss_end" N6 [* s9 D5 I* U0 [( K D
- _start_boot:
% s7 m1 H3 a& D - .word start_boot; M ]2 `( _) B+ t( O! @, }
- _data_auto_init:* `0 W; S' z! v+ M u
- .word __TI_auto_init- r4 x# [; Y8 E
- .end5 b% n" c1 [) g5 ?; q% Z
- # B! L ?+ e; `9 t v
) C0 Z H% U/ S+ z1 I- % p3 `! b5 z0 l7 |' a
复制代码 3 a) i) {0 Q, r+ x2 S' l7 G
3 U0 E3 m5 o* a: t3 G2 t0 C2 Q0 L }4 `8 L
7 U& V# s1 K- w0 E" z+ S0 W
) a, p7 M! V/ a/ F5 w9 \0 W! O( r5 e$ d |
|