|
+ U- l1 V- |" W" y" D
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
# r. ?4 {; t! q- \5 u" t/ y/* 重新配置程序入口点 */- Z1 }/ |9 N$ Z
-e Entry- /****************************************************************************/
1 f* s% l3 ^5 b6 _! M6 V% S - /* */' Y; U1 A1 G' P3 u9 i2 |& a( O
- /* OMAPL138 及 DSP C6748 内存空间分配定义 */
1 F6 ^$ i" K& _0 A7 r6 v' P - /* */
+ B# z3 s g) w6 a1 m( |- m, W - /* 2015年04月20日 */2 n' i/ p5 z( i
- /* */5 H, M: g( z9 ?6 r+ T
- /****************************************************************************/
' U% J4 K9 x: F1 b, [ - /* 堆栈 */) m, r' M' i0 a$ j8 l- z
- -stack 0x8000" ?. \5 i/ {4 @
- -heap 0x2000! l" {6 Y& c4 i0 G* Y0 h+ w
- + w% w) j4 C5 c* i/ B
- /* 重新配置程序入口点 */. z9 O1 ~" X' }7 i& C
- -e Entry8 Z7 j4 r$ \$ w9 {& n" @& |
$ O, x* \1 ]( j- MEMORY, ~+ S. ^( i0 C0 ]
- {; `" @) v1 U+ R6 N( a( M: F1 o
- #ifdef DSP_CORE
/ y4 R* G5 {, C+ t& O9 K - /****************************************************************************/
" I. v' E2 q: S( d) f( O - /* */
5 J- x/ q0 v, E8 V: u4 m - /* DSP 专有内存区域 */
/ ]: A7 z+ g9 ` - /* */
1 @5 X1 S8 Y4 ?) X- H - /****************************************************************************/
6 @% n1 W3 T; l: O: h6 Q - DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */
9 f% r5 }5 \/ v1 k) F1 d - DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
' M; J3 d* i/ z( s* t, j9 x - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
- A) k1 ?5 Y& ~ - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
' b1 l8 U5 Y; L$ e, Y* U/ L - #endif
复制代码 这是一段汇编代码用于切换到特权模式
1 b& }! B$ @+ |9 f6 }6 P! b. b, u7 E/ Z! f0 v
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm9 A! p7 M) v% y3 z! ~
- ;******************************************************************************
& r3 h/ E7 T1 O r - ;
( `# J3 n$ ?8 K0 P - ; init.asm - Init code routines
9 n, F! F, n: `( @8 L - ;
8 _0 M* u2 ?4 ]0 h3 I/ N- x - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/, J/ D. a# x# W" K, }6 H
- ; All rights reserved.
7 k3 n9 N& e; j- e+ K& y1 U - ;; n6 g3 [ c! `
- ;******************************************************************************/ j9 ?. B. R# P% V7 d) j, d, ~
- ;****************************** Global Symbols******************************** k$ G, m1 N) j/ v# D; I; E8 l* B
- .global Entry
% ~! `" `8 S$ R6 C- M4 j, z( @: G* V - .global start_boot& b. ?9 ^0 N/ g4 C; V* S! M: Q
- .global __TI_auto_init
" o8 v# w/ t# g- A
i7 g5 ] O9 R% D" z: R' t" \- .ref __stack
3 q2 k! g* w( ]' ] - .ref __STACK_END1 z0 a3 \0 V& {
- .ref bss_start
' N2 r2 J2 g# M+ U: k, B: Z! n - .ref bss_end; A! v; @3 T- P
- .ref start_boot
; |1 i+ A7 F, v - 7 w3 R( l% S% I ~4 |" o. k1 h
- ;************************ Internal Definitions ******************************
2 @; }- ? E2 w2 T - ;
8 |0 ^5 f$ A% I u7 b - ; Define the stack sizes for different modes. The user/system mode will use# t: k6 {- R9 Y, G
- ; the rest of the total stack size- l0 [: B6 Y7 z6 ]* E7 p3 B7 W2 J
- ;
. k4 {. P2 w7 |- V - + o6 N0 _) u( v0 G) _: H( Y
- UND_STACK_SIZE .set 0x8
6 T4 E; }; @. ? - ABT_STACK_SIZE .set 0x8
4 V- y- ~! d+ u, C0 j - FIQ_STACK_SIZE .set 0x8
5 y: L& _9 Q" C: S- s - IRQ_STACK_SIZE .set 0x5008 g* u' X9 p/ N" r; I+ S# P
- SVC_STACK_SIZE .set 0x8- V4 u. \- q; i' T% `. ]7 v
- * F3 ]4 R+ ?! z' @7 ~% H
- ;
% H7 |9 A' f# o3 Q - ; to set the mode bits in CPSR for different modes
# W" u) e9 A+ F8 P' v" B; V - ;9 V8 ?& c$ _4 Y- m5 H- b
1 L$ |$ ?( e2 w* D W# T* i- MODE_USR .set 0x10
, J. v; }4 ?- C# f7 t# U$ a o - MODE_FIQ .set 0x110 X3 d5 D5 K! S- N; |8 D1 l8 q
- MODE_IRQ .set 0x121 H8 B) T9 N' ^/ ~. B0 C
- MODE_SVC .set 0x13( A1 {5 Q. F# v3 i/ ], J" }
- MODE_ABT .set 0x170 e& T2 x& m* Q- K/ P3 e. \
- MODE_UND .set 0x1B, Y" [: A- E5 R/ H7 f0 d$ v* I2 z
- MODE_SYS .set 0x1F+ {$ s' W* S3 w! v
- * w k) f" d9 G/ ^+ c
- I_F_BIT .set 0xC0$ I: |( W8 E- A- S/ w
/ d$ [, q8 Z" b0 c# n4 z- ;**************************** Code Seection ***********************************+ x$ o+ d; ^% i2 L; `, Z* g
- .text
+ `0 x3 ~+ f3 g, p3 }" j) ]: Y - 8 K- G8 i6 `* {9 _4 q( }
- ;- g5 A0 k; A9 I
- ; This code is assembled for ARM instructions# A" W+ x U- \, {+ P7 F+ ^
- ;
" l4 y( p+ A- a, Z - .state322 l( g& |' x3 R/ y
- 3 j. y o3 M4 w& t: C* n! z
- ;******************************************************************************
0 O3 g/ K- Y+ T) P - ;% a) C# I; V8 ^* L+ y8 l' l
- ;******************************************************************************
, G$ b/ W- o( ~' { - ;
4 ]" @0 G1 Q' R - ; The reset handler sets up the stack pointers for all the modes. The FIQ and. d: I4 q6 g+ o9 Y; F
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
?% s/ P. y3 C/ ?4 E0 Q( m - ; main() function.
. u, B2 |0 u, W3 B; c7 p5 W' J - ;9 ^+ S* G8 W& Q( M; W
- Entry: T8 y! C. P9 g v
- ;9 A' a; p4 \+ F ~9 u
- ; Set up the Stack for Undefined mode) V1 x# u; \! ?% h9 p
- ;) t2 f) g6 d7 ?; f
- LDR r0, _stackptr ; Read and align the stack pointer+ `9 }+ M$ D q/ I/ ]
- SUB r0, r0, #8
5 Z; ^; C. W: n0 n: x+ z3 M - BIC r0, r0, #7" b2 R1 r# E$ o9 D
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
2 y C4 ~) b+ P& E) L/ n+ _0 E - MOV sp,r0 ; write the stack pointer7 ^2 L# l. e) ~' G8 S
- SUB r0, r0, #UND_STACK_SIZE ; give stack space) w }/ X1 v: n6 B0 I: R" H4 O+ D
- ;
+ Q9 V1 e0 |7 M - ; Set up the Stack for abort mode
, |4 e9 R" h% V' h - ;1 T( u+ A& F: O" j. L
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode
2 i* M+ M. F! r0 ?1 c0 T) R - MOV sp, r0 ; write the stack pointer
0 H* H2 U" H8 P7 p - SUB r0,r0, #ABT_STACK_SIZE ; give stack space& f# f+ p% w# [4 b4 {
- ;
) \6 r1 s7 K* e+ r8 w$ F - ; Set up the Stack for FIQ mode( K8 b- E3 W/ z- M9 t
- ;+ a. d& D* W3 B0 Q7 M; x* x9 b' }: I
- MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode4 r. W1 I7 M& h: w* h: g
- MOV sp,r0 ; write the stack pointer# x5 z$ ~. A/ N, R, ?
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space/ h+ l# ^: X: v$ t# I: Y
- ;
- L& N' c1 ~% c) |1 ]0 d9 [ - ; Set up the Stack for IRQ mode ~, _ y/ g1 ^1 [
- ;; ]- b9 N# Q; Q; Q# p" _9 w9 \
- MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode) f$ y4 ?/ X$ k! K4 G- A' W& G
- MOV sp,r0 ; write the stack pointer
" X9 ^) D: Y/ ^( y1 Q" ?: _ - SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
' V" z' S: D6 b% g1 V2 V - ;# j) H: ], h; K, l3 c) N; P
- ; Set up the Stack for SVC mode
; p0 G3 e- d* @! m: m - ;
( ^2 X/ g$ t$ [% o) ^1 Y3 s - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
: z5 D* p/ c4 B0 y# ~ - MOV sp,r0 ; write the stack pointer
2 x& [# I1 n+ t- l% Y+ L" V. V - SUB r0,r0, #SVC_STACK_SIZE ; give stack space; Y t) a' Z% {% C# ?& Z8 D' V
- ;2 V, R) L% J. K9 V: f
- ; Set up the Stack for USer/System mode
j' L8 W9 C; ]: \7 B: \9 z - ;
7 _7 f5 T3 \# j+ k, W - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode
4 x: D7 X1 N5 H( Z - MOV sp,r0 ; write the stack pointer
& r9 p8 K1 ~' k - 9 z; ]/ L6 `: o* ^, H
- ;
8 v5 v7 Q% L- `$ R4 S - ; Clear the BSS section here
! z5 Z$ }1 n T4 e2 p - ;
* n6 R8 d) @" C+ e' g& X - Clear_Bss_Section:" x* C8 z2 r- J
8 i9 u# k$ O, R+ Y5 ~$ E- LDR r0, _bss_start ; Start address of BSS
! [5 ?/ H. G3 O' C6 q8 H5 | - LDR r1, _bss_end ; End address of BSS
+ a d# I& v$ u; f! Z; H - SUB r1,r1,#4
: N$ w3 u" [1 C: t! K8 ^& N - MOV r2, #0
! e0 D5 H( _$ X. R! v% A! K5 Q - Loop:# {* F6 r0 i% `
- STR r2, [r0], #4 ; Clear one word in BSS
) ~# n. L: ?: c# M- n! \1 K - CMP r0, r1
) a K6 n1 I$ C! G4 W% k1 h - BLE Loop ; Clear till BSS end4 j- i( _1 y( m
- / s7 X' j8 L1 R5 O6 _
- BL __TI_auto_init ; Call TI auto init
8 o6 F ~* G+ K$ i" m- X. l - # ^0 n# Q* R2 |" B; ^& A$ z
- ;. r6 i- v# ?' S2 K8 Y
- ; Enter the start_boot function. The execution still happens in system mode
$ t) A3 Y' P) R& z4 b - ;
* p* a& l1 E& Q6 m5 w( m2 f - LDR r10, _start_boot ; Get the address of start_boot# T; c4 `* U; @& B. D
- MOV lr,pc ; Dummy return
G" U1 _+ J& ^) p( @, r - BX r10 ; Branch to start_boot
7 E/ q! X2 g; p$ k* p5 O! U - SUB pc, pc, #0x08 ; looping$ F6 V9 [ t1 t& r
5 n% X. v+ I2 O* }" u6 W- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode- f3 Z6 Q5 [* K# b& X) E
- ; BX lr
3 `5 L, A' ~6 @1 o- ]+ n - ;. n5 y6 \0 c' [4 {* d9 Q, e9 w
- ; End of the file9 v" b* g9 C# s
- ;
* F% G$ j) {1 O6 ] s1 S Z, U
$ T( i7 x) w, [ z g* M2 D- _stackptr: {/ [1 Q" G5 H' Y
- .word __STACK_END
v, ?' W) s) E2 F. @ - _bss_start:7 U; Z- Z2 `, S: w! S' m3 A
- .word bss_start2 C3 a! `9 P$ z5 E
- _bss_end:6 u$ B# L4 t* X- P( g; I
- .word bss_end
. C" y# a1 \* M# S9 c Y' e" e- C - _start_boot:
8 L9 c0 i! Y2 f$ @ - .word start_boot3 J9 \ n9 l: c
- _data_auto_init:
Z. k& V9 }7 I ?. U" G - .word __TI_auto_init* M8 I6 I" _8 g- D
- .end
- q; t0 R1 `. {* o$ }1 F2 L - , g) _2 J# x( H7 X
0 K0 N6 i; X7 }- 5 [- t: i# M ]' H
复制代码 ( i5 i0 `- Z7 E1 G3 {! ]$ f
! ] E1 q5 f4 p6 K, G8 R3 W* z
: z' u, I& D! e% |, a$ W/ i5 s) \( x6 q
6 H5 h& u( \& O: M
|
|