|
5 D; e& [8 t/ M F8 |( |在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
6 B, }7 Q. `7 g/* 重新配置程序入口点 */
1 i! ]+ g' `6 R% y6 @( ~9 t8 }-e Entry- /****************************************************************************/
* m" Q; \& G3 _1 x% J7 l- h2 u% J - /* */4 E0 `4 i4 S1 [
- /* OMAPL138 及 DSP C6748 内存空间分配定义 */
8 P. v6 d7 q$ E r* i - /* */
. S% g5 \- D# h4 v. | - /* 2015年04月20日 */6 W' `. s5 @; N* Q% i9 [: u3 b
- /* */
4 U3 S# _: d. C3 P" t - /****************************************************************************/8 y% [" ^* R" p/ C
- /* 堆栈 */
( o4 ~2 B! R9 k. Y# _ - -stack 0x80004 U7 `0 s6 k/ s& G" i% H$ i
- -heap 0x20009 x0 |& w4 E' ]
/ [: y7 j3 B8 B1 M. N: F0 B- /* 重新配置程序入口点 *// L( H" w* D5 f% f% w
- -e Entry7 k* Z+ ` \6 e$ E
- 8 ?# J: G I% P% m* p
- MEMORY
) \" z2 R; p9 R5 V - {
% a t' C4 f2 Q% V: V - #ifdef DSP_CORE
5 @+ J' W& y$ ?* J3 { X - /****************************************************************************/# v9 i! t5 T% n( @* e* _
- /* */
F% {1 b: _# }8 n: d - /* DSP 专有内存区域 */, o2 I3 C/ x( t' _5 o% |3 f7 Y5 w
- /* */' K( q( J, u" j8 D# }
- /****************************************************************************/
) Z. E2 ]; E# I4 a: w - DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */1 x, }/ s9 Z: H3 _! c, k. ?+ |$ |
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */( \& B. a4 I8 [6 H& n6 Q
- DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */2 d3 C. K! n' t7 `: a! {9 `
- DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */6 ` |, r1 p4 Q+ J; ~. R
- #endif
复制代码 这是一段汇编代码用于切换到特权模式
u& l' v" g' F/ y: v5 F4 m- H c4 v
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm
; c6 `, L& W4 b+ a g- ;******************************************************************************& `! \( w8 r6 s7 A8 d( T! y3 f
- ;
7 e( E4 _/ S) W; { - ; init.asm - Init code routines" U% o, p/ l$ a1 ]/ a
- ;
* ~, X1 U1 j: H - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ M5 I1 @' j' @: h
- ; All rights reserved.
3 ^! f' A! @! m6 x# }% k - ;" Q4 @& m+ O+ C' ]
- ;******************************************************************************
; F9 |, D( u4 Q; \+ t( \3 S, F - ;****************************** Global Symbols*******************************% S c% p$ R/ ?% N; F% W- K5 O9 }$ N
- .global Entry! z- t+ B) u: X
- .global start_boot8 N$ G0 H1 \6 i- `2 g
- .global __TI_auto_init( M2 z% \0 E" R% e: \, R
- ' R8 j+ m) a. t; K/ h. x
- .ref __stack4 M( V+ U r+ F
- .ref __STACK_END7 S6 H0 g* h) M% }( s
- .ref bss_start0 k5 j4 k( J& b# N5 Q1 y
- .ref bss_end
7 C8 O# j8 o, T) A3 _" H) O! u - .ref start_boot& A* j# W, }; _. ~5 T) ?
- # q3 q3 g' i* t: g! d2 X
- ;************************ Internal Definitions ******************************
4 Y( \3 X$ ]2 b4 l# K1 U+ v/ t% M - ;% x; n) v% |* y( x( D
- ; Define the stack sizes for different modes. The user/system mode will use5 Y' n+ y2 c# E1 g8 m' `
- ; the rest of the total stack size
9 I6 S6 q: z3 A5 s! G+ J - ;
9 V8 v" |$ k+ @5 h s - % T7 v3 b1 y m: k: h
- UND_STACK_SIZE .set 0x8# n3 A/ F; j3 L- q$ n) W
- ABT_STACK_SIZE .set 0x8 K: e. q* o3 `" ?
- FIQ_STACK_SIZE .set 0x8
1 I* i$ P5 S0 q - IRQ_STACK_SIZE .set 0x500
' T; S6 V o; x# r - SVC_STACK_SIZE .set 0x8& k$ v' c2 x* }6 u% S: b
- 1 h# Q% w$ n }0 a& ^, f, Q
- ;% ]- s/ d0 C. q) E
- ; to set the mode bits in CPSR for different modes+ W, Q% ` m+ r5 r7 y
- ;3 p7 m0 }1 n7 u G1 C$ A* a$ x
- $ u% }4 @, d: m# t! |" @3 d0 G0 K
- MODE_USR .set 0x10
/ S( } [/ z% s: d+ \$ t2 L/ A - MODE_FIQ .set 0x11
9 {7 g9 d; g/ Q: j* i - MODE_IRQ .set 0x12# z l1 E O$ g+ Y% p* l6 q
- MODE_SVC .set 0x132 }, D ]0 ~" N. J. ]# t
- MODE_ABT .set 0x175 `( e+ r' c: {' J2 v9 |0 v0 x, n
- MODE_UND .set 0x1B
, L* Q& P+ \ F - MODE_SYS .set 0x1F8 u9 h' V3 C. o
. l$ D. W; D- D4 \7 M7 ^+ j- I_F_BIT .set 0xC0$ ?" l- g! i' h7 I y1 E1 u( l7 y4 C
- 8 b. x6 r7 X6 ~; ]+ f/ J
- ;**************************** Code Seection ************************************ X7 }# x5 P1 a; n
- .text
6 B0 L2 f& ~' n! B6 K, z - % u* c; ~' Q5 j6 c+ W
- ;
/ C# {/ j/ F" N, ?1 r - ; This code is assembled for ARM instructions
1 Y% _$ m1 f- w6 G) C/ J1 F4 M - ;
& |- t1 u: {1 L' n5 I+ `9 ] - .state321 O, h4 B( u5 B# {7 V1 b
& E2 g4 ~: U+ C4 E1 n- ;******************************************************************************
# s8 p+ m2 ~2 P6 l/ \; r" c+ j! t - ;- r1 @& L8 u% S9 P3 m2 v/ ?& e
- ;******************************************************************************$ ?' q9 o/ b/ c
- ;# o0 a, _: E7 J4 N3 A1 R6 ^
- ; The reset handler sets up the stack pointers for all the modes. The FIQ and# S- l9 ^, W+ ]! n q4 _: K
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the& S2 Q" r$ [$ v2 h
- ; main() function.& f$ U3 o$ {0 W8 I% O% F1 r& {
- ;
6 a; f/ ^$ m% g - Entry:! f) v1 o0 D! O* ^
- ;
1 w7 C+ A7 k5 C6 _ - ; Set up the Stack for Undefined mode, Q6 T6 M3 W9 Z( w2 V/ J$ X
- ;
# N% v; y" z# C$ J$ J+ U - LDR r0, _stackptr ; Read and align the stack pointer
6 s9 G1 L1 E+ f; o. l5 l - SUB r0, r0, #89 T4 G& {3 k: n; P
- BIC r0, r0, #7/ N9 a. t' R$ ~: X* m' x- d
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode N) l0 G; u% m t( r
- MOV sp,r0 ; write the stack pointer
1 F0 |# k9 Y- W7 B5 A$ ^ - SUB r0, r0, #UND_STACK_SIZE ; give stack space$ T. l3 s; G; r! u" ^0 q
- ;9 \+ t7 n. X5 P+ h
- ; Set up the Stack for abort mode. o9 T5 T* g1 ]4 I
- ;0 H+ }8 q5 K7 |# {6 ] B9 H
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode3 ^6 x& R( l/ Y8 m8 Q( P; ?5 f
- MOV sp, r0 ; write the stack pointer( y$ a: e9 h2 ]: L* E& a
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space
) w7 }9 A; q5 |+ ?9 S- Z+ G - ;
) B6 ], d8 Z$ V0 Z% Q+ d) T: K - ; Set up the Stack for FIQ mode
) f8 J9 a( _7 h1 G3 _8 P - ;$ r% t4 t1 i/ D; Y4 M, k
- MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode
& I5 j5 ~& s. [- M - MOV sp,r0 ; write the stack pointer
# x: q: m8 N x$ M - SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
; Q B1 `& i- ]2 i9 B+ x - ;
) O5 l4 n+ v8 G3 r+ Y2 e. f - ; Set up the Stack for IRQ mode8 [ q4 H: J3 X
- ;
) M( Y" @6 ?1 k2 j - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
( q3 o! [# V. c& N: C - MOV sp,r0 ; write the stack pointer+ n, `7 \* v: s
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
$ o' h& v2 o* M* u - ;
$ S3 R& w0 m- _$ n% D' f - ; Set up the Stack for SVC mode
' C+ X4 u5 K) D% @. r! e - ;
9 v& X" e8 u# k% y% O - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
+ h) Y2 n1 E+ q7 j; f0 D - MOV sp,r0 ; write the stack pointer0 Q) g7 ~4 T# @! G Z7 B
- SUB r0,r0, #SVC_STACK_SIZE ; give stack space' ~7 @* c% ?% o" l- G8 S J
- ;" I5 P1 K0 a, p
- ; Set up the Stack for USer/System mode
( l! b: G9 C, S; a+ m# z; E - ;
7 ]5 r2 {' T4 P9 n7 q2 X - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode
& h0 H0 ?% p/ s3 l# H' J: q" T - MOV sp,r0 ; write the stack pointer
# \* E; |; |8 `* B - ; [: I: L& i* q I$ [- J: P
- ;
7 @- c- C' P& H B- s( j - ; Clear the BSS section here
) r/ k7 u: \9 J6 j - ;
$ C- ?7 `; F/ Z - Clear_Bss_Section:
. k' |% j' p1 `- \ - 8 P# l; b& G/ G7 Y B
- LDR r0, _bss_start ; Start address of BSS$ g7 q8 K- Q! G. B3 V) D
- LDR r1, _bss_end ; End address of BSS
- L7 a. t. U d0 \ x - SUB r1,r1,#4
5 u0 I# l0 t3 p( [ d% B2 f' e - MOV r2, #0
. m( ?. a8 [; M' c( o1 ] - Loop:( s+ J9 M6 i" s2 W ~% s( D* ]
- STR r2, [r0], #4 ; Clear one word in BSS
# m9 l: d/ A. B# C% p# y( R0 [8 B' o - CMP r0, r11 |9 ^2 y* |) e. |4 ]- l U
- BLE Loop ; Clear till BSS end) o' R0 N- Y1 W+ S4 k
- 5 p' n" } m5 T) D7 |, z3 t
- BL __TI_auto_init ; Call TI auto init+ d3 D8 `" Z5 z+ h4 [9 H
+ }5 a+ |" W4 U( J% i0 O2 ^- ;: C+ c9 V b* e
- ; Enter the start_boot function. The execution still happens in system mode
$ i) r8 C( c2 ?; x! P2 C+ p - ;
5 v5 u- Q6 h l - LDR r10, _start_boot ; Get the address of start_boot
' ?; _- V6 s# @ - MOV lr,pc ; Dummy return ) I: a& [$ M# V
- BX r10 ; Branch to start_boot
3 n: ?. z+ G) f8 S& k# v - SUB pc, pc, #0x08 ; looping
[5 \9 p6 {& O4 D - 2 {" U+ \# d0 y$ r: ^+ ~! u
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode8 C- ^0 |; Y/ }# V' }9 n* V: z
- ; BX lr
/ v9 b+ J3 }" C% I) H& h7 z - ;3 R% E+ E6 b8 r Z# ^9 O. \
- ; End of the file. r0 |# g! C {2 N1 |5 f+ L
- ;5 Q' @& x% q+ Z( v
V4 f# ?4 u' S- ~$ Q- _stackptr:3 _) |) }( A1 \) A6 Y/ ?6 J
- .word __STACK_END! w' G# D: ~$ k1 U3 ]5 F
- _bss_start:
# C1 @2 _6 ]7 p3 N0 u" u - .word bss_start d# a0 Z: r5 |( c/ n: j' j
- _bss_end:
" Z) T5 O9 v i( h - .word bss_end, o) T9 c( a9 ~7 @6 k; k
- _start_boot:
/ `) g5 O% O/ c9 n( i) s - .word start_boot
- C" b3 Z- T7 l7 X - _data_auto_init:
6 C# q* `$ v* d - .word __TI_auto_init8 ?2 u: ^* u; m9 ]& A9 R
- .end
" m3 b7 v0 ~7 `1 L% A% P8 q" B* _) j - ) s: K7 D5 A. x
/ h& j$ s6 T- O$ E( V$ C
( y: t/ m' L/ q. B0 Q" u6 d
复制代码 M* W+ @- _- f$ `( s) M
. A) l& N: T; y1 g. r
" R* j: n9 { U5 A3 z9 C8 Q/ y& m$ A- N. {$ j
/ ?4 i3 g$ r) v* O7 o, X$ ? |
|