|
* i% E* I' E8 d6 v! x8 t
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
0 q6 j, x. n* r( o4 G2 V) x/* 重新配置程序入口点 *// {* C' k3 x: I1 p9 K7 n3 L; g
-e Entry- /****************************************************************************// D' O- |: X; U! A5 `
- /* */: C, a" t: z% l1 n
- /* OMAPL138 及 DSP C6748 内存空间分配定义 */
0 ~9 c" ?, d" ~ - /* */8 x& g8 k# G3 h6 d0 F/ }- O
- /* 2015年04月20日 */
, @9 \5 Y' \- q0 h - /* */8 P. r. q7 x$ b; q9 n7 ]
- /****************************************************************************/5 {7 P4 q+ r6 u
- /* 堆栈 */3 \% E. ]6 A" @* m3 P% H7 Z0 K! c
- -stack 0x8000
' J! \, u% L @1 x - -heap 0x2000: b" v a% \' E- K f4 M
- - w4 L) M! E' Q" X3 w9 g5 ^4 {/ L7 K
- /* 重新配置程序入口点 */
`9 P) u& v, N$ b* P) k - -e Entry' {5 s ~9 l: Y* o+ u
- / m- I- B: m; z0 b+ V
- MEMORY
e% s& |7 e1 K" R1 y - {' W! P$ E: Q5 C( G. \7 |
- #ifdef DSP_CORE
# l" g/ C r2 c z! F- _* E# C - /****************************************************************************/* [6 J7 E2 R: W3 u
- /* */
8 n5 Z0 `0 Z! r - /* DSP 专有内存区域 */% @7 J; v5 e' d& {4 M9 _
- /* */. s) ~* P- m$ H6 _5 i
- /****************************************************************************/$ ]' C5 t- e( j( B' t
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */5 I: t. A" x& l8 h# w
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */% E8 t3 H+ k V! A
- DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
- f# a$ r/ r) S; M* u - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */7 r7 o2 v: [5 K" Z6 n/ R0 y
- #endif
复制代码 这是一段汇编代码用于切换到特权模式
, X6 Y$ f1 v: l# ~0 F. A. ^2 `9 K) F e* k7 J. U2 q9 X: A0 x2 b
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm
, I7 x: V/ x, P [, N6 z- ;******************************************************************************" d( I- X6 ] \7 O
- ;2 w2 V( e8 ?6 ^* F3 c8 d
- ; init.asm - Init code routines
- N# @& n( \) E- Y6 b: h% u8 t - ;
% b$ j. Z( T" ?9 ` - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/3 b9 h" w& N3 N& R
- ; All rights reserved.2 O* U' J+ t/ G/ s3 k
- ;
2 r4 W1 Z- x" o. _& j- {) K8 x - ;******************************************************************************
! m& u6 k* ]7 j, C- ?9 L) [ q - ;****************************** Global Symbols*******************************( c7 Z* g. l$ I) L8 p) E, X8 d9 `
- .global Entry+ z) L( B7 V0 \' p# ?; A* U
- .global start_boot
8 ?7 Q& a7 D0 `1 w - .global __TI_auto_init4 {* z4 V. R% L' x" f; [. j
- " l3 p1 B/ @+ {/ ^% x" B
- .ref __stack9 f% K1 H+ ?. N) q
- .ref __STACK_END
{# \# X5 u8 s: N+ u+ E' Z0 S - .ref bss_start
$ @0 L5 \! l1 _ - .ref bss_end
7 n1 n/ _- \5 o5 f# c - .ref start_boot
: K# A& F' k" }. e+ m* f
) S4 b/ y. z$ j: p ^- ;************************ Internal Definitions ******************************- _; P/ J9 L( D# |
- ;5 e" j- e; x- W) ~
- ; Define the stack sizes for different modes. The user/system mode will use
9 x/ V; E% P2 i. ], @5 p- | - ; the rest of the total stack size
8 m2 [7 K" H* l* N, Y) n7 s# [ - ;
! m$ ?, ]$ h5 ^' R% H+ ?8 G - 5 ] t' k& P# L- y
- UND_STACK_SIZE .set 0x8
$ D- X' \( k9 _7 ^9 D8 R - ABT_STACK_SIZE .set 0x89 P3 H5 X+ t# X' D
- FIQ_STACK_SIZE .set 0x8
2 r5 k1 N0 t$ T5 H, K - IRQ_STACK_SIZE .set 0x500
7 U5 X9 x( E4 c, e% T2 h - SVC_STACK_SIZE .set 0x8
3 h" X9 b5 z5 x6 B; ]6 r; X( u$ V
+ b0 C7 v' F: b( C$ o1 }/ i- ;
6 J7 W0 |9 M% @8 W4 n - ; to set the mode bits in CPSR for different modes; K2 J9 x3 I7 ]/ E# m0 X0 b
- ;
0 n9 h. @) |2 V8 c4 P4 u, d- t2 A
$ A" f q( b" C; y- MODE_USR .set 0x10
U# D* s# I3 X( r$ b' a; j - MODE_FIQ .set 0x11
4 w# | X# H) w; S! P+ I - MODE_IRQ .set 0x121 ?2 @3 h' a( I
- MODE_SVC .set 0x13
Z' p2 u6 ~2 S. D% _ - MODE_ABT .set 0x17
4 Y: G) _, V0 o: [9 g - MODE_UND .set 0x1B
4 U( b% E) a+ p! [ - MODE_SYS .set 0x1F# a) w1 k8 s' a/ L6 s
; H4 P- z: u) l- I_F_BIT .set 0xC0
) x9 W" w2 m! y, z( D' ?/ E; z* x - ( x. q4 r$ G* O2 H# M3 @# k
- ;**************************** Code Seection ***********************************
1 Y3 n7 P d9 {3 w - .text I4 _6 g$ e4 n' h
5 Y9 a, K6 }# {# r! `+ d8 V' b- ;8 j' s7 w* A* v4 p+ V5 L/ S
- ; This code is assembled for ARM instructions$ d' s+ C) u: S
- ;' Y& i; H1 n' F( ?& ~7 I( O
- .state32
( l" ^+ }- W% `4 v Q
8 p. r/ Z' T/ F1 y# f- ;******************************************************************************
8 F2 O5 @* ?) u3 O" j - ;6 O6 m3 c* g7 D& b
- ;******************************************************************************
! e) @6 G/ H% t6 m - ;
' C+ h0 m0 |* m2 d0 m# ] - ; The reset handler sets up the stack pointers for all the modes. The FIQ and5 i3 \4 Q# p7 ]8 d- J( V
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
9 H" r$ H; S% @% }* s - ; main() function.
# M8 q/ j3 n$ C+ X+ n2 P: E - ;
/ I/ R& [5 c' k8 { - Entry:
J( {; Z) ?: H9 E5 K - ;( z3 [7 {) G& ~ w
- ; Set up the Stack for Undefined mode& c& N( F+ e$ \+ d$ \& q& y
- ;
$ S6 |5 A- A' g- u5 y# ^ - LDR r0, _stackptr ; Read and align the stack pointer+ G5 M4 f( X6 |1 Z. \. l* i
- SUB r0, r0, #8
: w( e) f8 f4 e! b- K0 q* ]0 _ - BIC r0, r0, #7
2 j9 ?7 I5 l! l# o. H1 z - MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
3 J$ U* M' E% d' S& S! l - MOV sp,r0 ; write the stack pointer
6 E) R) Y6 n T - SUB r0, r0, #UND_STACK_SIZE ; give stack space) f8 \ H1 e2 Z" p
- ;
' Q: U& I4 [8 f7 {/ Q) [0 ^ T4 G& Q9 Z - ; Set up the Stack for abort mode
4 D: z+ p' r% x9 G, P - ;- R1 Z3 Q$ q+ L- o+ c- ^3 r
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode
! [4 S; e2 M; p* w' O6 i5 s6 s2 I - MOV sp, r0 ; write the stack pointer3 T( I. G. G; x, i* p9 W
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space& R# `% U, S3 ^/ h
- ;
9 q* C( w$ A: t" @: h, O. O - ; Set up the Stack for FIQ mode# h9 b* V: c5 L1 d
- ;( T7 m* @* E% Y: t! |, B) X F0 u( `
- MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode
; H% E0 S! P/ [: P; |# A - MOV sp,r0 ; write the stack pointer
! \% o' ?* o( q - SUB r0,r0, #FIQ_STACK_SIZE ; give stack space Y: H1 s/ T8 I" f
- ;( ~; a; \9 d5 m
- ; Set up the Stack for IRQ mode
4 W9 L: y) E3 }/ U - ; e5 ?% t# B4 D. s: g# s a5 n7 |
- MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
& [+ B( O% ?! M$ t0 u- Q& l - MOV sp,r0 ; write the stack pointer* t3 f- b' Z" F' D( W9 G) }
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space7 I% G6 p, a0 \3 Y0 L9 S1 ^1 {
- ;
4 f: u$ t. H: \9 l( h& F - ; Set up the Stack for SVC mode
" }0 x/ [4 a4 s8 {$ G* Q, w7 C+ H - ;* N6 k* R, ]4 l
- MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
! f# M/ S; S$ l8 r1 B- s Q2 b - MOV sp,r0 ; write the stack pointer
+ j$ r) F1 r( |" b5 e( q% A4 N$ i% E - SUB r0,r0, #SVC_STACK_SIZE ; give stack space
7 ~0 i4 d) f5 F% [ - ; v" A% ?' j2 Z' `
- ; Set up the Stack for USer/System mode
3 d1 w) @ d& d2 \) d - ;
$ d2 M0 X% _5 l) R" } - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode
4 d5 H. _+ P3 ]9 S9 J - MOV sp,r0 ; write the stack pointer
' n4 I: A7 h4 {# a1 {& ] - 7 L) z! J+ B7 y) D1 n
- ;. Y/ j4 A+ {6 g. P3 k9 F) c" Y) h
- ; Clear the BSS section here6 |! G. @5 O& A4 F u: f
- ;
- \: I6 I. |. F% h8 K* \' r; O$ [9 H. v - Clear_Bss_Section:. \, ~- d$ w# K& Y) o' M2 Z
- 3 E8 d0 ]* u" y& _. K/ P
- LDR r0, _bss_start ; Start address of BSS
) D% r8 d0 ?, `) c. ] - LDR r1, _bss_end ; End address of BSS. h$ n, W: L1 ]/ {3 W) B' u2 a# L
- SUB r1,r1,#4 X: a" K! B/ m
- MOV r2, #0: C7 n5 `0 A+ E4 ^1 E
- Loop:
1 Y, B+ z" E* J& g - STR r2, [r0], #4 ; Clear one word in BSS
( R! m* m% [& ? Y7 Q- Z/ ^ - CMP r0, r1
/ [' U* w0 |6 F$ }) M - BLE Loop ; Clear till BSS end2 T: b0 r9 `4 F* b) D( ]5 E
- " F' c- ?3 G( S8 S* `: }3 I; g
- BL __TI_auto_init ; Call TI auto init, Q3 p4 R% q* d0 G
- 1 x+ I) z/ r" R6 C6 _/ T
- ;7 J' l+ K" m) Q2 Q: X. ?9 Y( c
- ; Enter the start_boot function. The execution still happens in system mode
$ I4 u6 o$ S7 i! K1 q+ R6 b - ;
$ i1 x( \9 v& o - LDR r10, _start_boot ; Get the address of start_boot8 u9 C! y! H! b, ~/ y2 r3 `. V
- MOV lr,pc ; Dummy return
, M1 }- x6 t. ~, j8 d, h. | - BX r10 ; Branch to start_boot
- h0 d }. W0 H. L - SUB pc, pc, #0x08 ; looping1 ~, G* \; Z1 Q
- 1 L$ v' q. R3 x
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode* j9 H8 Q/ @4 B8 [# {
- ; BX lr
$ S7 @4 p/ |3 t2 W$ c- H k - ;: A0 f( {) \% p& }% G3 T
- ; End of the file2 `& c7 ^0 Y7 i2 ?0 H
- ;
& {1 y$ J: U8 Y; i - ! [+ E5 \5 ]+ L% I
- _stackptr:6 `# @- E, k% C" B9 ?9 T" q
- .word __STACK_END# H) f" ?! b: ]! T; B
- _bss_start:- ]$ v) d0 l1 J" _, t; z6 _
- .word bss_start
4 [- V9 A2 g3 m, @4 e6 f - _bss_end:6 A. N" z3 a' g8 i
- .word bss_end
2 ~( k: h( V9 {# Z3 S - _start_boot:
2 D. n2 t/ E; D9 { - .word start_boot; o2 h% i; n. ^
- _data_auto_init: Z9 N4 l5 X% |4 M( ~+ n& B
- .word __TI_auto_init
% G8 ~" q- x E3 R0 Z - .end
7 k4 C9 S4 e2 z, r$ l -
. u+ O, ~% y% S) H: F8 g) ?1 S - 3 W2 s2 `8 n. u
2 q9 d1 d# T) |* ^' o; \) {
复制代码 7 i6 S8 N3 f( R& E$ ]9 W' o
5 [, T0 V' g x; Q! r
/ |9 r& Q% h* O. I, P" I* d
: ]- _' C3 j: T3 Y4 J+ x
/ c; ]' L/ M/ E |
|