|
3 {* g; t9 @8 l6 Y7 t
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
/ Z: h) ^3 B m/ S. ~" p/* 重新配置程序入口点 */6 T! q, f9 ?1 I* T
-e Entry- /****************************************************************************/2 I2 t' a2 l5 C
- /* */+ A+ f* j. E" W f& B, k. t
- /* OMAPL138 及 DSP C6748 内存空间分配定义 */- x/ o( X8 |! c! V$ N! a
- /* */" [) n8 y$ T8 i0 K! `, ~
- /* 2015年04月20日 */4 D! `$ @: j0 N
- /* */9 Z6 i9 D! \7 r" c8 y2 K2 n
- /****************************************************************************/
9 a% ]$ |# s+ K( G# D+ `% l) N - /* 堆栈 */
) H1 |' ^+ d1 Z- ?7 H, e2 E* ~ - -stack 0x8000% |* O' g1 M, Y: A. ~
- -heap 0x2000
2 Z/ K ~/ P8 y4 G& e) q - 6 I, Q( a+ I' J' S( k
- /* 重新配置程序入口点 */0 Y6 m# _1 x$ l7 r+ a% S A2 P' ~
- -e Entry! p% V3 o, K2 a# ^. e2 y
7 U- B+ M1 M2 j2 D- MEMORY
% y0 ?. w9 \6 M: @9 ? - {
+ Q5 `# c/ L/ {/ d- B - #ifdef DSP_CORE9 K9 o- \7 D, e7 O ~- r6 ]
- /****************************************************************************/! V1 Y/ m) `( @; h- _" S3 m
- /* */+ D# j- N7 u4 @. T) i
- /* DSP 专有内存区域 */
3 }8 T4 S! {3 t6 i* y3 i; i+ A - /* */7 e% o: E) j) [
- /****************************************************************************/: n5 t0 M' b8 Z4 u8 ^/ i& C
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */
, ?1 B5 a6 E6 X7 C6 \ - DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */' y: P2 D! o3 P
- DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
- T/ c x. e) c - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */% I0 m p9 A$ V2 B4 C
- #endif
复制代码 这是一段汇编代码用于切换到特权模式! y2 |8 R; k8 U! t
# q* T9 R0 @* u1 E* w' o# L2 [# ~
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm3 M5 E+ ~/ u$ V( v/ f [
- ;******************************************************************************
" r' l. q, S, p |. A; L - ;
4 _* L* m: x+ m- |: O3 j$ t$ w - ; init.asm - Init code routines
+ w0 P8 p- a; O( |3 v" R) O) O - ;
' H" t$ k$ G- O: J/ b" L7 q - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
9 f% S! G" h. h - ; All rights reserved.2 ]' v, r9 a0 ~8 L1 c6 r
- ;
; x' @& K S& j A2 P - ;******************************************************************************2 U0 z# `' V: `7 w- U! n
- ;****************************** Global Symbols*******************************9 |# @9 z- i) W/ g4 r9 Q
- .global Entry9 P& L( S. v$ U7 a; u) t
- .global start_boot
( i. J" Z8 D+ t4 {2 P: I - .global __TI_auto_init) R3 R; A/ n M6 |' `
1 ?" V5 S- d% T; l3 m, z5 f$ w# d' M: q- .ref __stack
" E6 S5 [! d4 h2 [; I$ r" K - .ref __STACK_END
5 v& @) l( l5 f `$ h - .ref bss_start
; q# O3 N( b$ E - .ref bss_end6 T R, \0 d& q0 R# x9 [/ J/ C) F
- .ref start_boot
# v% s5 ]8 R# u1 L: b) |; ]
6 L7 B$ j v4 v! m- ;************************ Internal Definitions ******************************0 v# u+ b% T9 y* |
- ;
6 s/ R3 d4 a) o/ J. h - ; Define the stack sizes for different modes. The user/system mode will use
! E# A1 j$ y& j) v5 ] - ; the rest of the total stack size! A8 I6 q2 a2 I9 _3 [' Y- J; j
- ;& H* O W9 Q4 m6 g/ x
- 4 k- c/ _. @1 n' B' V) }- u% V
- UND_STACK_SIZE .set 0x8: H% D& H1 h1 d7 p4 J
- ABT_STACK_SIZE .set 0x8# X/ W, P, S& Q$ d1 y. n# X" X
- FIQ_STACK_SIZE .set 0x8
) Y8 d8 e% T4 q; s2 p# Z& A3 v - IRQ_STACK_SIZE .set 0x500% Y( S) x6 S- r8 K2 v! @
- SVC_STACK_SIZE .set 0x8
- O, b. w0 \% z* Q: `7 `
, x( [9 Q7 [7 J Y! D' ]& I- ;; A0 {7 u0 N! l; p( h
- ; to set the mode bits in CPSR for different modes
# `4 C' z* `7 k, l - ;
) t! N- Y: T' H* Y- L$ v& I+ R& U9 V, G
$ r; F% D8 G z, z- B1 V9 t: \' J- MODE_USR .set 0x10
2 J, I3 \1 m4 O) @ - MODE_FIQ .set 0x110 d* u! d/ V( a! g
- MODE_IRQ .set 0x12
1 L5 y9 A; g# b - MODE_SVC .set 0x138 ]$ S. W$ P% L9 H1 ^4 d2 x
- MODE_ABT .set 0x17
( B1 S* ~0 A! a+ l( T F - MODE_UND .set 0x1B$ A) ^) |: [3 X! ]' P% h$ j$ `
- MODE_SYS .set 0x1F
$ W5 X9 B6 n. Z0 z - 8 Y I0 x1 _& l& N# X
- I_F_BIT .set 0xC01 \3 q2 C, R( C/ C8 L
- 0 ^$ [' ?- W; u/ d9 \+ {* P2 q
- ;**************************** Code Seection ***********************************! c8 t2 u$ {! v2 ?; }& X+ m
- .text
# w% ^9 a! w' ]) P; q2 @1 c! v- q
7 m; ]& S# f/ n+ ^- ? y; U' E4 P- ;1 W7 E! b4 M% B9 w: W
- ; This code is assembled for ARM instructions
4 `; v# `4 [8 f5 z& _8 z5 y1 z - ;
( W: f9 j, p* H - .state32! ~" g0 B1 |* Q
' X3 f% ~8 c' {/ l' L- ;******************************************************************************# ]+ f/ ^3 |' D1 ^' R
- ;
# k9 X5 H8 R; r' a - ;******************************************************************************% F0 L N$ P5 F0 z! }
- ;: g# t( m" p1 A; V6 R8 q0 z0 l3 X
- ; The reset handler sets up the stack pointers for all the modes. The FIQ and+ b* Z! ?- P4 j6 i4 }$ _
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
* q) f8 f) y3 ~) X% L - ; main() function.
/ K+ e( D5 s+ ~% P" @8 L# { - ;# g+ h$ a9 x1 X" a; F/ U
- Entry:0 o* U, ? K' z0 e# @8 m
- ;
: [) `/ |6 Y% F' S/ ?. L- B1 ` - ; Set up the Stack for Undefined mode
1 p/ q, G* L) M2 x y" R" H9 _ - ;: E% k1 Z/ W) F2 O
- LDR r0, _stackptr ; Read and align the stack pointer
6 Z' {2 c' H% P3 Q7 a: C - SUB r0, r0, #8
7 N+ V* Y+ c: P2 }# U - BIC r0, r0, #7" C% j! O6 R# D( P+ e
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode: l; V7 l) |1 l4 I! |
- MOV sp,r0 ; write the stack pointer
+ n2 i) p$ u: O. V: P2 z/ s - SUB r0, r0, #UND_STACK_SIZE ; give stack space& u% G/ j( g5 H6 i' Y5 j
- ;+ Y6 C& F: Q% C# W1 n7 O5 z/ G4 t" }5 c
- ; Set up the Stack for abort mode3 u- _9 O) J4 D4 ^
- ;
9 f2 [+ V* ^. C - MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode
6 b$ }$ u2 Z0 p0 \$ Q - MOV sp, r0 ; write the stack pointer0 y3 o) W, |+ L$ r
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space g4 @' E6 A. h; a% P {
- ;
7 T4 @7 q8 a7 y6 I+ M1 t - ; Set up the Stack for FIQ mode' F8 ]+ ^5 L; Q `- o( N- i6 [
- ;
5 z4 W3 q y" T: f - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode
, ^- f0 y4 e8 a - MOV sp,r0 ; write the stack pointer
+ r& I2 H5 _$ Q" q - SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
- p% P1 A1 h6 @: Q8 L2 |9 B( [# f - ;3 s1 M6 Y7 y3 c% J- ?; \
- ; Set up the Stack for IRQ mode
# s5 g3 d2 G- O6 Y - ;: s0 ?, G+ K" T1 p, i9 R: ^
- MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
3 P* e# j! ?4 n" |3 [! u" S - MOV sp,r0 ; write the stack pointer6 {# O: N S1 X3 k% ?
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
( D( y, f- `& R6 {/ Z* ~2 k - ;
# `5 M4 o+ U6 ~) E3 @ - ; Set up the Stack for SVC mode
1 A6 |# Q b1 m, P* F. M5 V - ;
5 v( c7 c, p4 n$ y' K7 ~4 U - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
0 B- B( n0 e% @5 w8 u& ~/ [% ^4 P - MOV sp,r0 ; write the stack pointer
2 ]2 e |4 y' a- |1 F2 X: M, {8 ^" Q - SUB r0,r0, #SVC_STACK_SIZE ; give stack space B3 W( V; F$ x
- ;) n; |" d9 b" [2 [% O" p
- ; Set up the Stack for USer/System mode0 D8 B+ O& _9 N- \. R+ U
- ;
4 }; Y7 ~" S: s4 u - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode
+ e1 O& p+ \5 U; M! K - MOV sp,r0 ; write the stack pointer7 @8 Q F$ e) x" D% s- V
4 d( t, D8 d6 u- ;
1 A" s4 X! V! y - ; Clear the BSS section here: U+ s; v2 s8 s& |9 [- u
- ;
1 X1 h5 w8 E% G+ E - Clear_Bss_Section:
/ c; y5 e: S, J, T - 5 n! O Q) R! E2 O0 K0 W
- LDR r0, _bss_start ; Start address of BSS) Z2 W" H/ w* i6 m1 \9 \- v, j: }) K0 { G
- LDR r1, _bss_end ; End address of BSS6 m/ D0 p4 m7 \+ r0 y4 h
- SUB r1,r1,#4
. X; j. y& h: J+ \% V/ t - MOV r2, #01 o: q7 K; x/ c j, v: d- ? I) r* @
- Loop:
/ |( I5 p3 ~# c |0 c/ d! q2 ~ - STR r2, [r0], #4 ; Clear one word in BSS
* n) R1 v" T8 T9 T( B - CMP r0, r1- v3 |! v5 R( @6 R/ S( T5 D
- BLE Loop ; Clear till BSS end0 v* ~5 y: K- N
. Z! L3 @+ H1 _( m- BL __TI_auto_init ; Call TI auto init
# I5 g8 M$ c2 V% \2 a6 r# y5 t( o - l& y& A3 a: L2 C
- ;
6 K& A& k0 [3 E3 Y) q; u8 E( z1 X - ; Enter the start_boot function. The execution still happens in system mode- R$ l. V, T4 C* P1 i
- ;
. J! X; ~& Z \- h6 v! g- z - LDR r10, _start_boot ; Get the address of start_boot. U/ F! h- T: v1 r( w
- MOV lr,pc ; Dummy return ( p! I6 i* F, E6 {% S
- BX r10 ; Branch to start_boot
+ }) \0 l( j' w5 n" d$ S - SUB pc, pc, #0x08 ; looping
% {' o ]7 j9 }( A: u7 n - ' R" R4 H1 i9 [6 {: S+ F
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
: }: ]$ @ [5 }* ~# A - ; BX lr1 \9 b3 w8 k1 O6 h
- ;0 d+ u; ]; X& \
- ; End of the file) U& t! k7 l+ z% d2 M( S" R
- ;
5 T. @1 B) m' |/ z2 x7 l: M - & L1 ?% V# h& @: B3 X2 ~) n
- _stackptr:
' p8 j, W6 Q& l. v+ U - .word __STACK_END
# i0 ~; h8 {9 r" ^" k7 ? - _bss_start:
3 K5 ], g% `# M - .word bss_start$ G, D* t8 o# V; q' ]
- _bss_end:
' c/ V. l2 w) V; B7 c/ ?6 j4 @ - .word bss_end9 h& F/ e3 I" c; ]4 Q' [
- _start_boot:
( n1 ]- n' u& T" U1 Z - .word start_boot
; X& t3 Q! y& |/ G$ y+ M - _data_auto_init:
& Z% n' c# u" @, u/ }" U# D - .word __TI_auto_init# M' u D% m$ @& n/ K9 A
- .end
' \, Y8 w0 y* b, S: W T6 ~ -
3 N! a9 y$ [4 h6 ~0 X% N
" e: K" ~8 _+ w3 P( k7 j" d. j3 g- ; N3 L/ [: J* Q- I6 P" @* j+ l
复制代码 5 q! f( ?9 f. ?. H! `0 Q C0 I9 U
- z, Y F( g( u) X7 i" P, C6 D( a- o: ~' H
1 K7 s6 O2 n9 `0 e2 C9 g s Q2 }& j2 |; K; E! R& c
|
|