|
6 g2 a1 k6 P6 |/ h
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
! m+ ?+ x9 Y7 B$ O# k/* 重新配置程序入口点 */! p$ G( O0 i* _; [6 [
-e Entry- /****************************************************************************/
' y0 e. K: P. }* A8 U4 |: U - /* */ C9 ?3 G o2 }7 k W7 E4 c q( W& j
- /* OMAPL138 及 DSP C6748 内存空间分配定义 */
4 j R6 k& _ L# B$ ?# t# e - /* */1 K/ |1 G) s. F
- /* 2015年04月20日 */0 l6 _ R) N4 E$ h- G; _
- /* *// b! V! O0 X4 t' a
- /****************************************************************************/
; n$ ]$ R# D: U2 w- ]. r - /* 堆栈 */
8 H3 d% a" ]( U( _ - -stack 0x8000
# p1 L) X7 w2 d: }) J7 a+ H @' [ - -heap 0x2000
/ @9 P, R0 I/ P$ @9 d, K - ; P, J( n1 U) O; o
- /* 重新配置程序入口点 */* z$ M- m* z4 E; ]' h- j1 d$ x
- -e Entry
: \! S& f7 ^, h
9 O/ q {% q; u9 I- MEMORY
+ e8 S% s3 _% ]4 C/ u+ q - {; h! v/ w3 }5 m4 r7 N
- #ifdef DSP_CORE
3 u# n4 X T ]3 e/ p6 X { - /****************************************************************************/$ g% G* F5 _( r# E6 q' Z: ~
- /* */
! g4 k0 U9 R6 V& T - /* DSP 专有内存区域 */
/ ?. Z) v' J5 m i' c3 l) r - /* */' ?9 ] ~+ W" C
- /****************************************************************************/; Q- G! l$ v' ]0 z+ i' F" z6 p
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */# C% g7 m6 m0 L1 A5 s
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */) k4 L5 P8 D. M. S( O$ ~
- DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */6 o' {$ D5 V/ Z$ L
- DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
( h% M' t+ Q# ~' s - #endif
复制代码 这是一段汇编代码用于切换到特权模式6 P7 j" a0 ~0 H% n
! X z6 n- N( V1 }OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm( E- M" L s: r2 v. \9 H5 y
- ;******************************************************************************
" G9 h) r7 |! i, R - ;
! `- J" a$ ?( h# ]6 h - ; init.asm - Init code routines
: ^- G5 e/ Q, e" G( Q2 ` - ;$ ]: }2 r- P6 M0 K5 X
- ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/, P. d8 u+ o( }8 G/ @+ b( p
- ; All rights reserved./ ?; @( ]8 l: m' e
- ;0 |+ h I, ]- t# V
- ;******************************************************************************8 R4 m8 c8 U B ^! Q1 @! f/ }
- ;****************************** Global Symbols******************************* Z/ s4 P K# K5 u8 l* i8 X" Y( g! k/ k
- .global Entry* P. U0 ?+ n& R: W3 N6 R- |3 }
- .global start_boot
' C! r9 x3 R* Y9 | - .global __TI_auto_init
. g0 |3 y3 u5 z: m4 n! A" [& _
! n7 Q8 n2 E0 g, U7 t* z9 g- .ref __stack
3 }6 e2 a3 m( W |+ ` - .ref __STACK_END: N- J6 ~8 @1 F* X
- .ref bss_start
; @# x& m ^+ N* S& Q4 K K- v% y$ c+ X - .ref bss_end2 i* g$ |& f+ V6 @4 B
- .ref start_boot
- i% `# J4 I6 d1 _' q" F - # J& K0 B) K( f1 V# e. Y+ `/ |
- ;************************ Internal Definitions ******************************. n. d/ u9 W t. H/ o. n
- ;& z0 U8 N, o* e* x5 ?
- ; Define the stack sizes for different modes. The user/system mode will use
& r4 T8 d) X2 e X3 T' b) { - ; the rest of the total stack size7 H; J) k: p) m. z* y4 J* J! L; U
- ;
% r0 T2 O; X$ t7 [. Y9 ~3 o: x! v( H - $ p! V; x. O+ q7 X" p
- UND_STACK_SIZE .set 0x8, S- S! a. M6 O& q4 y
- ABT_STACK_SIZE .set 0x8
_3 f8 q" G) F$ ^0 m7 [ - FIQ_STACK_SIZE .set 0x8; r/ b, y& b1 V9 r" E: k
- IRQ_STACK_SIZE .set 0x500
+ M% X S+ L Q* S, @ - SVC_STACK_SIZE .set 0x8
0 {* N0 h* i- P8 Q" S1 `
9 H0 ^: F! S; B R6 W- ;
4 y+ U; [8 u- j: f2 C/ a - ; to set the mode bits in CPSR for different modes% { ~; X; v) P, B7 Z
- ;3 g' D- |& V; X6 S
2 G2 j! p) ~8 m9 c9 o* O- MODE_USR .set 0x103 l! Y+ X7 W4 ?1 \+ d: h
- MODE_FIQ .set 0x11( [& L5 L2 n2 [$ c" C7 s) Y
- MODE_IRQ .set 0x12
( s! B! I8 ^; c/ B5 ?, n - MODE_SVC .set 0x13
) o0 _% b. ?/ r X5 O0 v$ T - MODE_ABT .set 0x17 H- \: J9 M* P ^3 ^
- MODE_UND .set 0x1B% f6 j3 U+ b2 A( ~$ ^
- MODE_SYS .set 0x1F
' B+ V1 ]% r( K- x* z: M2 j# A - 8 y4 L) p, d2 R3 x8 @! b: V# m
- I_F_BIT .set 0xC0; M8 e6 v3 H7 _0 k% k. g1 q3 o
, T" r8 ?) ~8 R! p6 E1 K- ;**************************** Code Seection ***********************************
x% U e$ u3 n# B) |, S& `/ h - .text
8 D9 [( L+ T$ l$ ?* u, v( | - & n0 |2 d) @: g: \' I
- ;
) Q& o% m7 i, k3 B0 k - ; This code is assembled for ARM instructions
9 g2 F$ z, A. Y, C0 ^" z7 B( l- l) L - ;
$ S5 d) J! B) N4 T# H- E5 O - .state32
( Z5 J. W8 i) @1 @$ n% j3 ~, t. H - 0 f& a' S( g) c& f% H; x5 \8 t
- ;******************************************************************************
$ [' [. g6 ~: c9 \( p - ;
9 `' N, B) d7 w, f& o: \ - ;******************************************************************************. h o1 y- A, X& [$ w( [; H6 `' L
- ;
( f; O( a" I: c - ; The reset handler sets up the stack pointers for all the modes. The FIQ and
9 w# O+ C+ }* o Y - ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the1 _( m& _, J8 o' L e& b# e3 G
- ; main() function./ ^ x" q3 H0 J I) D/ l
- ;
* A7 Z- n! q: p, T" G - Entry:
6 s7 l% \9 v, V7 k - ;
4 u- j1 a2 J. `( s6 m - ; Set up the Stack for Undefined mode
4 k! R/ n( ~) k: s( w" | - ;! ^2 M l9 M+ e: \0 B" M
- LDR r0, _stackptr ; Read and align the stack pointer& r6 M0 k S( {9 @3 j. a, t
- SUB r0, r0, #89 S9 Y9 `0 F2 u N) t# V
- BIC r0, r0, #7% P5 U" F/ a9 P5 T9 \# P; X* E, C
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
3 G; j9 f0 Q5 ], U3 a4 g - MOV sp,r0 ; write the stack pointer( i0 n2 I& Q# }4 P& r# `
- SUB r0, r0, #UND_STACK_SIZE ; give stack space
: r2 S! \: z1 M7 D - ;$ P' h. I1 l X4 W7 |+ U
- ; Set up the Stack for abort mode$ p9 W: c7 U! B( h" q; w" H
- ;( |) C2 s0 w- v# c4 b/ u1 A
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode5 T& N8 M; v$ G; O! j3 Q
- MOV sp, r0 ; write the stack pointer: r5 E2 H' i! V' F4 w
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space
9 o- \$ [& a! O/ r, u - ;
% Z1 w+ K, N% Z& x - ; Set up the Stack for FIQ mode! r* f3 q9 U9 t3 _. W
- ;
7 W% c3 b9 x" Q# \; C - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode8 A3 y8 v1 q; x( N: d* E# b
- MOV sp,r0 ; write the stack pointer0 R' ?9 G8 y4 G Y1 d/ H
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
) C/ J0 f4 k6 V$ O& m% L - ;0 j+ [$ h: l; |" c3 M& G
- ; Set up the Stack for IRQ mode
# t: v9 T# e1 w v6 D - ;
: S, y4 J! {* c) H - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode' h; g! j; Y$ |4 h% Y
- MOV sp,r0 ; write the stack pointer$ e" s3 n! Q u+ [- U
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
7 Y. D9 D/ G' w" N# L) H6 n - ;
, [$ Q3 L" e F! m) R/ { - ; Set up the Stack for SVC mode3 s& u* A: v% Y, M* ]
- ;
$ @: Z# v( w# F4 K - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode' X% ?1 O* @4 d: ]6 Z5 X5 ]$ `
- MOV sp,r0 ; write the stack pointer
/ Y, C! a( X, Z4 ]7 J& M - SUB r0,r0, #SVC_STACK_SIZE ; give stack space; A/ `0 F: m, c0 O7 F/ K% K
- ;
9 g# o" [' n5 T* V6 Y1 T - ; Set up the Stack for USer/System mode
7 r$ T( B. I% u y q- R - ;
, D- ~' c. D3 L - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode
# m# C0 K3 N7 x5 G4 B8 @7 r" ` - MOV sp,r0 ; write the stack pointer
4 b0 s; h2 C' {6 Q, ~ - * S+ Y6 k; r) o: b
- ;
- I; ~4 {6 h, O1 M2 _. q - ; Clear the BSS section here
' G( l, B5 {: ]" K2 o - ;
+ P$ n/ X: u5 L5 c - Clear_Bss_Section:
5 w7 `8 z- f I( G; ~7 S - 4 Y8 ^& I- y4 v
- LDR r0, _bss_start ; Start address of BSS
4 i0 Z q* A3 u- U7 ?# F - LDR r1, _bss_end ; End address of BSS
/ D( W+ j; Q& Q, \! x6 U - SUB r1,r1,#4
) L1 E6 Z# `- m( a& B1 L - MOV r2, #0
$ H! t9 M+ r C7 z- J1 ?# `2 o - Loop: d. K, o6 K" Y9 o+ [
- STR r2, [r0], #4 ; Clear one word in BSS
! c Z" ^* U" n |. s# d - CMP r0, r1' r2 \! {8 r E( |! a
- BLE Loop ; Clear till BSS end+ ^4 \# S8 W% @7 b, w/ Y+ _
- " Q1 X0 A6 k: H1 M
- BL __TI_auto_init ; Call TI auto init
& T" G7 ~7 O# D4 A; o8 E1 G - ( h! H4 o1 F% k) h9 K+ Q5 h0 A
- ;
# y8 c# q) u; c8 E3 a& g2 e: T/ C - ; Enter the start_boot function. The execution still happens in system mode2 [- O( r9 U- s" Z- S4 ?2 x# r( [
- ;
, X7 h+ m c+ E1 N+ Q - LDR r10, _start_boot ; Get the address of start_boot
/ U- b& r, G: d, q3 s1 g - MOV lr,pc ; Dummy return
2 F2 ?! f. a6 V! d) P6 u$ m - BX r10 ; Branch to start_boot0 f0 p) \( i% i, A- h c
- SUB pc, pc, #0x08 ; looping S/ x% K3 m3 E
1 ` I0 } \; y1 `# Y- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
3 O1 Y1 ~8 Z# ^5 O6 c2 M - ; BX lr
$ z) ~6 x! f( R6 L% T - ;
7 [5 R. ]! i" l% V7 G- |4 u. s - ; End of the file7 v+ \" Z. D- P- m; H- `# J
- ;
. T$ d0 x* o+ J& T" j' Z7 Y) Q
+ ~) c: G& \# Z2 P- o& q- _stackptr:
; h' w q+ I6 ?' w5 Z* S - .word __STACK_END1 \* |8 t6 O& u/ a( Q! q2 n$ B% _2 b
- _bss_start:8 u" [9 C& W, o8 L2 @! |
- .word bss_start
8 n# V. x, @1 ` - _bss_end:
/ A x$ w4 y! W* N3 E; V/ l& E+ y - .word bss_end
$ q& W+ K4 `9 U% _5 g - _start_boot:
6 Y4 d* |9 r: z - .word start_boot/ m# z% i* E9 i+ H, Y0 I" Y2 }, l
- _data_auto_init:0 Z6 U) L" }) _0 ?, Q; L7 {2 g7 P! y
- .word __TI_auto_init
( N o. L2 h0 g7 @4 w, ~1 r9 G - .end2 q- z4 I/ U8 |* H
-
" f: G7 w: q# @* u- v
( [. q0 d( h7 x: ]- 5 @6 F: L' F, W+ R
复制代码 0 W' q. }6 ^1 O% F4 ` x) f+ b
* C0 H( U7 p5 \( [( `
3 T: V( I' W0 W/ F. B2 Q2 }9 z; q1 R
& V9 I8 k W$ z6 ~, V |
|