|
$ H7 O/ _1 P7 z1 f# @$ Y* O! i5 `
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
/ q$ L2 B, V1 T" i* O! E- d+ G/* 重新配置程序入口点 */
5 V! U: h7 i+ H# W-e Entry- /****************************************************************************/) Z4 F( R7 x9 P
- /* */
" G9 @& X, E& f. n2 C* L - /* OMAPL138 及 DSP C6748 内存空间分配定义 */
$ H1 g4 h5 n/ r - /* */
. t2 U. |/ T" f! M/ J% Z8 S - /* 2015年04月20日 */, c( X% D* z9 y K
- /* */
( ^9 |# A- O" W1 Y- S4 J' s5 n - /****************************************************************************/
" Y, X: A4 I! C$ ] - /* 堆栈 */# z# l d7 q+ O i/ v# Z1 V
- -stack 0x8000
% F: G6 d+ P3 M0 v4 i - -heap 0x2000/ N- _8 |) W4 L1 }0 `- _
8 D8 _0 V- I+ i4 t* x- /* 重新配置程序入口点 */
% O+ ?5 V0 I! M; z& I; k7 ?. g - -e Entry0 n1 K0 z3 u2 `6 R- E8 ~
- - C3 Z' n9 ^9 W" m g
- MEMORY
/ f8 V8 W0 o* o1 n# x - {5 L x u& @+ s6 N
- #ifdef DSP_CORE7 ^7 y3 Q2 k5 o5 X
- /****************************************************************************/
6 t: n% }+ H8 y - /* */
) r- [1 |3 _+ m* \" L6 s2 K - /* DSP 专有内存区域 */
* X/ W+ Y$ F. |2 Z - /* */
$ {" m+ u8 x7 y | - /****************************************************************************/
# O, v7 \! Q u- J) r- p/ `1 E' d% R - DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */! y8 `- z4 w( L5 X$ `3 V# a; ]
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
6 @. ]1 _7 n) a7 U6 s9 } - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
7 c. a+ m2 G& I$ a - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
- z1 ~" c8 K3 Z6 z$ h& S$ k4 s - #endif
复制代码 这是一段汇编代码用于切换到特权模式
: r" R: ^" f' U( m3 x4 |, l, s2 r) n8 A9 F/ K) j' Q
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm) J8 |% o7 _" t5 Y6 @3 q
- ;******************************************************************************
$ Z4 ~" A/ O# d$ Z4 c - ;
, U7 i; ~5 K. v- \2 z8 S - ; init.asm - Init code routines
) i4 k( q9 L7 g* ~" A- N$ ` - ;9 u( V3 l( `9 T
- ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/. ? p( Q! q* f# x+ P
- ; All rights reserved.7 V6 s E: b" b* }7 v
- ;# K t/ a/ U0 i! |5 q9 [, j2 B$ ^2 A
- ;******************************************************************************
; g! _6 \4 g# o M& H0 R% u2 u - ;****************************** Global Symbols******************************** J8 p8 Y$ {" _% h) p) U; X
- .global Entry
, G( q# `* O4 |' v* V: q, S) L - .global start_boot
8 p/ r) e y5 W - .global __TI_auto_init
0 t# k4 H* j# g. q f# e
3 |* n3 C$ h; w- .ref __stack- W5 ]# c3 i; Y- @+ C
- .ref __STACK_END
0 }( { [( ]- m( c6 w, A! u# T/ G7 Y - .ref bss_start) ^$ T& ]& s4 Q5 s
- .ref bss_end2 `8 p1 W( p7 o7 Z. C0 |! M
- .ref start_boot
- |* g0 R( P- a1 N - 7 f! h, D0 B$ t
- ;************************ Internal Definitions ******************************
G# r+ j) @: }' t, e$ @ - ;# `5 \ J8 U6 A* B! `: k& E1 J
- ; Define the stack sizes for different modes. The user/system mode will use
) b0 u3 v5 G+ C! p - ; the rest of the total stack size' i7 g( Q6 w% B' L( \! N; }# |
- ;; x9 U$ j* ?. H! e* V% d1 z
2 F1 G9 ?1 i5 v3 H" J9 O/ K7 ` f- UND_STACK_SIZE .set 0x81 A& Q- A, s9 [: b, P" ?8 e1 l
- ABT_STACK_SIZE .set 0x80 w+ b4 s0 I4 V; R6 q% ^
- FIQ_STACK_SIZE .set 0x8' I6 f' K" c( x4 v1 z# y1 E
- IRQ_STACK_SIZE .set 0x5002 v5 Y" e4 f4 C% p
- SVC_STACK_SIZE .set 0x8, B, G( X5 B" r+ _8 R
9 W4 T+ W: Q8 [% p- ;# l( p* L& a) W7 ?, i* E
- ; to set the mode bits in CPSR for different modes
/ b- D( G3 v M C7 W4 Q - ;
6 O) V$ y: @! g6 K1 r - , q- t' V0 l0 x, _
- MODE_USR .set 0x10# `; a: Z8 m$ f8 {: b$ Z. V
- MODE_FIQ .set 0x11, _1 b' t( m& K5 c4 H1 A) r
- MODE_IRQ .set 0x126 T0 K% S6 b y9 V/ z
- MODE_SVC .set 0x13
e7 G+ ]2 J0 U, ] - MODE_ABT .set 0x17
7 q" ? T2 w, C) N, Z - MODE_UND .set 0x1B
* \! Z) u. I8 X7 t) ]( d9 h - MODE_SYS .set 0x1F6 f' J6 s- }8 x8 D8 h3 z3 |0 [6 Y
- 4 i6 F! G- z0 l% T& Q5 w
- I_F_BIT .set 0xC0" U! k8 j9 E2 ^( J3 _% _
- q( {6 D2 W$ ]( y. y( M& D
- ;**************************** Code Seection ***********************************
: k9 h# l e- y, D& l \7 Q$ F - .text+ O" A M/ i: \# ?+ |
- / p0 z4 r7 x- |" H) R3 p. Q
- ;
6 L }) V8 y$ ^; M- g9 u& }3 _ - ; This code is assembled for ARM instructions
# A/ \/ }4 n) Z- L d - ;
1 s9 X, k4 a- d - .state32
* W3 m0 I9 _. r% c# E7 Q* K4 b+ @ - 2 H: r0 a% d) _7 C, z- S
- ;******************************************************************************
8 Z J, ]9 p- l7 s, n" m) A - ;1 L/ y6 D M% c" y( P" r: S
- ;******************************************************************************
* c O* }3 q! J0 Y6 j) z3 R - ;
: J. A2 a2 }+ f2 `/ x6 J - ; The reset handler sets up the stack pointers for all the modes. The FIQ and
% e" |& l. x- X) { - ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
/ [* u1 f% M+ I( G5 i- I9 ] - ; main() function.4 r3 F* A8 r. A9 c
- ;
! K: @0 e: c, H) q7 s8 b9 v. @ - Entry:/ s) S, ?& S& e' t
- ;
# N8 V k. O$ `# c4 _# T+ R - ; Set up the Stack for Undefined mode+ C9 B* P; ~9 M
- ;3 }3 I2 G4 u8 z& B2 ^! V3 r
- LDR r0, _stackptr ; Read and align the stack pointer
7 [/ M( J: R* B1 Y. w4 r - SUB r0, r0, #8
" x# t- [8 j: `' D - BIC r0, r0, #7: G" a8 P3 c. |/ y+ h
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode' t+ H' E9 H: I4 z% O
- MOV sp,r0 ; write the stack pointer
" G' N! h' X- V) w9 S - SUB r0, r0, #UND_STACK_SIZE ; give stack space
* C* a* q2 K3 _' O1 G0 n* U3 e2 j3 Y - ;
7 A8 f% ~- P6 r* ?* E: D0 t. ~4 v - ; Set up the Stack for abort mode C* q9 r3 v' K$ k
- ;, A4 f$ ]5 t3 s8 h5 C5 f
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode5 ]5 R* q" g; t) a) t6 n# w
- MOV sp, r0 ; write the stack pointer6 }7 }9 y) ]4 B Y% F* I% y
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space, d. L/ { V) Z! U9 H0 C* d
- ;
6 m+ i/ w# G9 g7 w h - ; Set up the Stack for FIQ mode3 Q$ X* n0 F& _) I' ~8 r7 }
- ;
& q" p2 |: g. h - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode/ i5 z/ L& y1 t. j% w& \' `
- MOV sp,r0 ; write the stack pointer
2 G7 V8 k; E+ V+ N - SUB r0,r0, #FIQ_STACK_SIZE ; give stack space- W* t& w1 Y+ U& A- o+ }# V
- ;8 v! `2 A4 Z" T5 D; j
- ; Set up the Stack for IRQ mode
$ X8 d4 }+ ?. |3 j% \ - ;
# R, H3 D. X9 T+ |$ o0 `. B - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
3 N( U# s1 V% I" O2 o0 x- y - MOV sp,r0 ; write the stack pointer
' Y% ], u' S( k# u - SUB r0,r0, #IRQ_STACK_SIZE ; give stack space. ]% v# [8 @3 V" z- B& u) Y7 j+ B
- ;
( _: Z& B8 Z3 q; [! B - ; Set up the Stack for SVC mode
V; m3 e7 h$ ` - ;2 g1 A v& d% i3 {- ~
- MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode0 @, O( \& N3 M* @) `$ `- L
- MOV sp,r0 ; write the stack pointer
" l0 d0 Z( B8 r. v M - SUB r0,r0, #SVC_STACK_SIZE ; give stack space, O& I8 d9 V* V% f$ m& j
- ;0 B0 Q f# n. U* G$ O6 V
- ; Set up the Stack for USer/System mode
* ]8 y0 z4 N) T - ;0 M$ _5 m% g3 C7 a+ _6 ]
- MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode
/ ]4 S: C- ~1 `* o- B! D - MOV sp,r0 ; write the stack pointer' i- ^5 l% y, N1 T- A6 C8 u# A
- ! W. s, M- R4 _% n1 | A) e
- ;% e. ?5 G) p+ z
- ; Clear the BSS section here: w; m. K/ z @$ b, E
- ;
E# e) t3 A& o Y* k7 b7 }& H - Clear_Bss_Section:* z0 g2 Q3 u/ g, \& G
- . P, y2 b/ W% [2 h7 d
- LDR r0, _bss_start ; Start address of BSS( T4 k6 e& n* j: N
- LDR r1, _bss_end ; End address of BSS
; C. h: A. x5 ^ - SUB r1,r1,#4
7 O2 G( ~5 j6 }2 d# J/ L - MOV r2, #0+ {: K5 W4 ~& L6 y( b
- Loop:( D8 S7 @% a+ W G" H8 B
- STR r2, [r0], #4 ; Clear one word in BSS. Y) S2 a8 N% D$ @, ?5 h
- CMP r0, r1
4 @& |! k+ i6 k1 N4 B1 R$ C - BLE Loop ; Clear till BSS end. K0 a1 I1 \! i. d5 ~+ P
, B) \' J" R: e- ~- BL __TI_auto_init ; Call TI auto init
4 o0 q0 Y5 k$ E7 m9 R) i% ^ - 9 E4 V# } f2 H+ S0 M: }
- ;
; y' r& m+ R7 I1 r% O2 P8 T - ; Enter the start_boot function. The execution still happens in system mode
* }% P; l- Q1 ?7 E7 Z9 a0 o o - ;" M" p6 f. o. ^% p5 [; @8 F- d
- LDR r10, _start_boot ; Get the address of start_boot
/ y& l; w8 N9 b- Q( h - MOV lr,pc ; Dummy return " |& @7 i8 L; E) v+ P' v
- BX r10 ; Branch to start_boot4 H# L% c p% v% X4 G, S
- SUB pc, pc, #0x08 ; looping1 o. l* {# `3 J4 S9 g% z5 n( b
( Z6 T! ]! Y3 N* J( w7 R- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
" i5 w& Z% Q( {' t; j - ; BX lr% z1 f! s9 k6 J
- ;
! @8 ~* t F2 t+ y - ; End of the file% y2 v. k5 I3 @- |3 D3 r
- ;8 B Z# p# \3 S
- % t1 s1 L$ r* k; o
- _stackptr:8 |. s$ q- M5 I& P
- .word __STACK_END
4 w0 K; x$ D5 @" F. g4 q/ @ - _bss_start:
8 V, d3 G0 _7 o0 X" [, ]& ?& Q1 f - .word bss_start
9 t6 R0 ~1 b9 P8 N5 v* [$ s - _bss_end:/ N3 b/ s' C/ E& ~ [
- .word bss_end
! v% d8 h* o9 X - _start_boot:
. @- W9 m5 q7 y% ]4 ?$ Z) @, e - .word start_boot, {7 J, Q/ X8 t
- _data_auto_init:3 S# Z* N2 v" `$ e
- .word __TI_auto_init% O6 N g/ b5 [2 H
- .end
* h+ s; p6 _+ O -
6 g9 f" N* ?6 P
) D4 w" _! u- I0 {# k7 a- , g# _( D+ `1 B8 K: K8 `
复制代码 8 R7 t" f9 R. f1 |7 q
% G" u4 S5 Q; Z* K5 ~$ X) u9 c
4 u$ Q' U( F! q1 W7 O. w! \, a+ _" P( j8 R
! ]/ O( R: z, Y$ E9 q4 H M8 t
|
|