|
" h6 F W5 M6 x m4 E6 \: A在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
# ^! r. ~# N3 f1 m$ h( G! A; M/* 重新配置程序入口点 */
`- U3 }) m" w2 s; B T1 F0 E-e Entry- /****************************************************************************/
) }2 x8 |" L% W8 K; Y7 D" F - /* */
1 g. {) M5 R1 K d1 X - /* OMAPL138 及 DSP C6748 内存空间分配定义 */
% T1 `: i7 |, F' t, b( n - /* */& C& G/ `* j# Z& ~0 w
- /* 2015年04月20日 */7 X3 ?1 w, r: q
- /* */; q; x8 U0 I' f5 P# |! ~% T2 S
- /****************************************************************************/
6 o; P6 \: a; B I9 o( V - /* 堆栈 */) S: J: @$ h1 l) r0 }9 [
- -stack 0x80009 G6 W- Y6 \% s X$ R
- -heap 0x2000
" c5 m$ p4 S9 L- V
) g( m' c4 G4 P4 n8 C6 v- /* 重新配置程序入口点 */
& W* I1 e _7 A+ S( w1 [ - -e Entry
^( L4 i; W7 ?0 P% r - 6 t! Q( M7 C4 `" `* g
- MEMORY4 w# ^. }& I, R6 i& g
- {
3 l7 r; G1 S: u& | - #ifdef DSP_CORE
7 i Z3 Q( V) d5 U - /****************************************************************************/! ?+ v+ N6 s: q5 Q6 W- e4 d
- /* */! n! j) P2 T9 k9 w0 X! v
- /* DSP 专有内存区域 */! z( P6 Z/ @$ x1 K$ l& G
- /* */
% u: `; C, Y9 Y6 ~8 h7 n) w( o - /****************************************************************************/7 P' c' e6 f, N2 L
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */+ `- B( t* Y4 F* e2 b
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */4 n/ b6 `! W& O# q
- DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */8 g- S9 z) T5 f( N* q# ~
- DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM *// l$ I) U; S8 q9 x9 F
- #endif
复制代码 这是一段汇编代码用于切换到特权模式
0 q7 U/ R( N9 R2 a5 ~& U W+ A z3 x: D' d( x- P: S& ?) g% _1 |
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm
7 z8 G* m# f5 d: J8 e" E/ i5 e- ;******************************************************************************( j/ _9 `5 k ]. e: X+ B" g
- ;
& b1 [. K d; ~ - ; init.asm - Init code routines
! |9 p' x. Z4 w+ Y - ;
+ }& v q7 A0 O6 i6 H1 w - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
- G3 E- b" a% h0 j6 h& C5 m& k9 g7 { - ; All rights reserved.
8 H8 f$ j' N# ~8 c2 F - ;
0 o0 |8 a8 G6 z, }' P R - ;******************************************************************************8 U1 H4 Y: U9 J0 G$ U
- ;****************************** Global Symbols*******************************
3 H3 G. @ x6 X m- n% n - .global Entry; D/ Q' q' C0 B1 T+ @5 t+ l3 U+ ]
- .global start_boot" H" e+ k3 |0 y" [' q; ? z- x
- .global __TI_auto_init
0 x N) x8 Q% J4 s - ' j+ m5 |/ s" W' _1 t' N
- .ref __stack
" b+ Y" g- Q( c8 i) X* s - .ref __STACK_END
! h0 x2 V' ~ ~) [- B - .ref bss_start
, A6 z$ }3 e5 V7 v$ Z - .ref bss_end
& f- Q* D+ L. U$ J* W) g) T - .ref start_boot/ d' [' A, ?. T* b: u6 G, A
! i5 d7 b2 ?; y+ o7 t* |- ;************************ Internal Definitions ******************************9 F1 i7 Z. r! A/ O( [2 x
- ;
- F1 Z; b- |3 Y6 x" h - ; Define the stack sizes for different modes. The user/system mode will use
" ~7 S) B, `. @4 O# _0 ^ - ; the rest of the total stack size" p h n& l" K; [6 s7 w
- ;
C# p3 a0 {2 \+ K3 k9 O - * o$ a4 X4 Q. l& h* _
- UND_STACK_SIZE .set 0x8
- A5 x7 u7 d4 I) W - ABT_STACK_SIZE .set 0x8
6 [# S3 x r2 j x; l1 e - FIQ_STACK_SIZE .set 0x8
0 X7 L1 h P6 n0 O l* O - IRQ_STACK_SIZE .set 0x500" \$ I- l7 L+ O3 y
- SVC_STACK_SIZE .set 0x8
+ a# h2 a. R2 W - 6 l1 O! _: l+ R! `- Q' P
- ;/ W* k/ y) V. P
- ; to set the mode bits in CPSR for different modes
5 H$ m: O% ^) p- {3 a2 n - ;0 ~( s- k( l% A. r- k4 J/ E2 p) K
( o" t' n/ P, \' O' n% V( W! p- MODE_USR .set 0x10
4 ~+ C! @+ x$ W0 b& p - MODE_FIQ .set 0x11
4 y0 T+ a6 R3 ^5 x - MODE_IRQ .set 0x12$ D/ c7 m9 R9 r6 R
- MODE_SVC .set 0x13
/ k( w$ @1 p9 y - MODE_ABT .set 0x17
* u( A' Q4 ]9 m' m0 g5 o* E - MODE_UND .set 0x1B1 x s1 @* V( B7 p/ v
- MODE_SYS .set 0x1F
7 _9 I; K9 U2 U' L# G/ p% ]& L" J: ` - % b3 P+ v7 g9 J5 T
- I_F_BIT .set 0xC0
/ Q1 B/ z/ D0 z
- q% _$ T- I' V4 s# b2 b; }- ;**************************** Code Seection ************************************ p% v N* n* U% |2 z& f t
- .text
; c# G# w6 L. Z/ U' w4 H6 l
- X( ^/ p* \8 B9 z* j" n- ;5 D5 q" `9 A. P& k" X! o1 R
- ; This code is assembled for ARM instructions
' n5 Y8 ?' K# j/ T4 a& S - ;
& r( S! W* z2 p1 K- q' P$ k - .state32
S ^- k7 `; ^4 v4 k. S1 Q0 ]+ ?
, f; Z1 f; A+ w1 y+ ^- ;******************************************************************************
1 r: |" K" Z$ t5 U1 z6 b9 Q$ K0 ^/ x - ;
& x& z/ q9 i1 K. W9 T$ D7 T - ;******************************************************************************0 f8 A" ]: E/ g, D/ U: i& K5 a
- ;
% W- _$ }1 \7 E$ U7 @0 e* E+ B5 R; t - ; The reset handler sets up the stack pointers for all the modes. The FIQ and
9 q. }$ }0 |: R3 ]2 C/ J - ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
9 L3 e8 b) B S1 T - ; main() function.( O; Z: ^( x' w( n4 F- M: R* f, K+ o
- ;. `! y! o: A) H
- Entry:+ Q0 S/ D( s( _7 P4 x* h2 c
- ;
d9 P* E" w# z - ; Set up the Stack for Undefined mode
* V8 e" T6 x, _- g2 ~! _ - ;
6 K9 ]7 [/ [- W7 m - LDR r0, _stackptr ; Read and align the stack pointer" d! G; e: b$ [+ I y2 {5 d
- SUB r0, r0, #8# D+ I5 \4 w% |" ~
- BIC r0, r0, #72 J3 z0 B0 c% @2 ^1 _/ A- m
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode; ~- f9 O: T* K, }7 `; f1 K
- MOV sp,r0 ; write the stack pointer
4 d! d; s" o+ f7 o, e; H! S - SUB r0, r0, #UND_STACK_SIZE ; give stack space
" R) j {; z; q7 ]0 r* u - ;* j7 i9 z; C( O. Z5 d' i
- ; Set up the Stack for abort mode
( `6 p; Z' N, @5 f i( g: e, D* q$ f - ;
* L4 w f5 x" u0 k0 e8 E - MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode9 u' R! H, F5 E8 V" u6 k
- MOV sp, r0 ; write the stack pointer
% ?, B# E- o! d8 t/ s! M# y - SUB r0,r0, #ABT_STACK_SIZE ; give stack space& M% A% ?7 z: B) B
- ;' @* h1 |: H% n7 }' W2 b
- ; Set up the Stack for FIQ mode0 O6 o$ `+ h; _4 k
- ;
0 E5 }4 K8 z7 P' g - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode
7 k& |2 ^! j; | - MOV sp,r0 ; write the stack pointer. s3 w7 F& S/ e2 L- b6 Z
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space' q$ `/ j% [. r7 y4 |
- ;1 ?) r5 h2 O8 G) G
- ; Set up the Stack for IRQ mode; @% V$ n% \ z/ N
- ;
_5 I$ k. R3 S+ s! I/ c1 v - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
9 l0 D# [+ D0 ? - MOV sp,r0 ; write the stack pointer; {/ X# p$ X! V4 N, D- P7 {
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space, ]! ?! i' b# U1 |9 i I4 b9 n2 i+ {- o
- ;: O2 C5 q; Q4 D. \0 O
- ; Set up the Stack for SVC mode
9 e4 D2 p; Z5 [1 Y$ d. X0 O - ;4 P# u( |7 H1 ]. X; z
- MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode. B; X' ]6 D, o/ _1 E
- MOV sp,r0 ; write the stack pointer a0 z1 o+ f% X* T6 ~5 H
- SUB r0,r0, #SVC_STACK_SIZE ; give stack space3 D2 Z& c$ a+ y0 `# Y0 A, a
- ;
$ ~$ ]( A7 I1 ~ ?8 U: o - ; Set up the Stack for USer/System mode
# Q7 A$ [+ z7 m1 L - ;
0 _# \7 n" O) ?9 V( k/ H( V! D - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode
6 u; ^- Q y0 \& h. K - MOV sp,r0 ; write the stack pointer. w3 Q$ E* o: t1 _. w
i$ |$ ~" t- G1 S( r" d- ;
3 A, X0 s& y# A3 {& P - ; Clear the BSS section here
2 N9 Z& {$ ?0 [) m - ;2 _. o9 Q! @3 V9 q0 k" `! @
- Clear_Bss_Section:
# c* q: H& W% [2 {6 Y5 ` - D" o1 e8 ]3 u, m$ F: O* c
- LDR r0, _bss_start ; Start address of BSS
- {$ R- V, o9 {, B) C - LDR r1, _bss_end ; End address of BSS# B+ {+ ^+ Z: L- [$ ^
- SUB r1,r1,#40 B. B. Q& {' y7 y( Y
- MOV r2, #0
; r0 y; j) q/ _) W - Loop:
) h6 }2 G. {6 p4 N - STR r2, [r0], #4 ; Clear one word in BSS7 {( {& }: [9 r( A; Y+ L
- CMP r0, r1# Z4 n' D3 t. c7 [3 E
- BLE Loop ; Clear till BSS end
7 x0 i, l- p$ m) p4 Y' ?! t. V9 T" \ - 0 r- n7 C6 E3 `
- BL __TI_auto_init ; Call TI auto init2 N7 C0 y! b4 S# S! F3 W
- % v+ V3 @$ x, n, z( {+ M' k5 R. X
- ;/ ]+ ~8 `: t0 ?& N l
- ; Enter the start_boot function. The execution still happens in system mode$ Z" R' F) R% k9 ?/ O, F3 }
- ;; u7 D4 {7 R) A# R# s0 j
- LDR r10, _start_boot ; Get the address of start_boot) N. ?8 y& r( }) K) i
- MOV lr,pc ; Dummy return 7 W L1 c1 V" b7 K. N; |7 c
- BX r10 ; Branch to start_boot
6 M9 |' P9 J" L' M# I b7 `: p - SUB pc, pc, #0x08 ; looping
: M6 e$ P& {) Y& T- _9 O& ]* o
" Z. v9 I/ Y+ F t. m6 @- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode. z0 c; z& r/ Z4 s6 K( e5 i
- ; BX lr
1 @+ \. k$ `$ w/ j+ x9 d, A - ;% P; L, ]2 h4 m! g) o4 b' L
- ; End of the file+ E. `) S1 }5 O( i' N5 [* h" S* Q. s
- ;
1 g; t4 G! M. q, X9 J/ o& k. s - 6 W' B, n8 d5 I \# G
- _stackptr:
4 [' r2 j" u, s" t+ b' C- ]8 A; F - .word __STACK_END
( U; @6 p0 A4 I6 s - _bss_start:6 t9 c* t6 R Q$ U/ O) x: w, I. s
- .word bss_start
% V+ J5 P) p: V - _bss_end:. K; z3 [. C# H# F* z L3 y0 f
- .word bss_end
. A/ K) b3 H4 E+ n" J$ _. Y - _start_boot:
: A" R0 I# ~, K) k2 e2 | - .word start_boot& j% S: M! u5 G+ |
- _data_auto_init:
' X4 c/ n. p9 U" W% V - .word __TI_auto_init4 N6 `" _( W" B- x$ ^$ ?
- .end% d1 x( T! \ l, N- l
- 6 K, c# Z' X! F2 c6 q( S
- - |2 k1 g/ u+ _/ P
- ( m+ v- K" e, }+ M/ r
复制代码
& I" b% G# J% T# l) V! F% H+ W2 L) A
+ L" n2 ~/ G% m2 f
" Q# V* ?% W! p t# S# p! T3 Q0 Y! u* _6 |
|
|