|
' U6 {: H: C" [, b' h
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句. h% E, J5 o0 K8 `6 v
/* 重新配置程序入口点 */
# f1 }7 T! k Z, m1 J-e Entry- /****************************************************************************/
# O: U$ S+ i; D4 a/ H, [8 n - /* */
* }5 q: Z1 a/ _. b - /* OMAPL138 及 DSP C6748 内存空间分配定义 */) `7 H. ~; b1 D, n
- /* */
+ p" W' Z1 c# z( X - /* 2015年04月20日 */
7 ^7 z$ G2 j# n1 F( f3 U2 | - /* */ e: t, N9 n( C) q3 G, m! a8 {
- /****************************************************************************/6 b* o- V; a+ U% F
- /* 堆栈 */1 @7 ~* z4 [' \) R
- -stack 0x8000
8 ]7 U& \6 ^/ S- @! j9 Z0 o - -heap 0x2000
) k" K" f( X% s, a% M
* G* y( {# I" H K: w. Y# z- /* 重新配置程序入口点 */5 P' ]- F4 `3 ^6 a8 f
- -e Entry c( U% x" y- X5 S- n: I. F
- 1 L! ~/ N/ y- Q' X5 j6 y$ Y
- MEMORY
& F. o1 H# T# T& {" b* s8 R - {
# q! B6 r# i/ d$ B) L' R3 G% e - #ifdef DSP_CORE
8 Y$ T5 n0 u( i7 {9 ?+ n! V3 E - /****************************************************************************/
# G$ Y8 d( f0 K. h - /* */
+ m" e4 ? d" ~ - /* DSP 专有内存区域 */
5 t" f- [9 R: i+ |7 X+ m( x2 ? - /* */
6 N( w6 a6 {- u, F+ f4 e) Q - /****************************************************************************/1 S$ B3 a7 q1 |' J; Y( }( M' ?$ K
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */* E) N Y1 G! g# N' ]
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */- k* }* f3 L+ R2 B( `: q4 a
- DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
/ S$ G# ]! Z9 ]8 U4 c0 O - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
- [2 `# H1 A. ~- d - #endif
复制代码 这是一段汇编代码用于切换到特权模式
( b1 e6 O2 m) m* ?3 \
1 r8 v5 o& b& aOMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm
' a$ B) m7 A: q T- ;******************************************************************************' [) r+ Q8 z- Y" v) D
- ;
7 h7 O" J, q$ \3 `8 N - ; init.asm - Init code routines, N4 D! m& m% h, {6 M! Z
- ;+ N1 F, p6 v, t
- ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
4 e7 @$ E, Y- v; S( i - ; All rights reserved.4 g5 Q7 E/ E% W% m
- ; X1 l( m! Z, H
- ;******************************************************************************8 n; V/ ^- |: k& l- x+ K2 D& y
- ;****************************** Global Symbols*******************************: t: d2 n. J/ O* b7 s" L! I/ V
- .global Entry; T% A" m' G) `! }2 ?6 h
- .global start_boot$ L. p' e# f9 g" S1 M9 ^; n
- .global __TI_auto_init! I0 `" m2 w- F% h l5 ]. l
- ' A8 z2 z! G6 |' W& s: l
- .ref __stack4 [: }* u8 x, X5 D3 } _
- .ref __STACK_END6 G# F3 {2 z" ]# ?$ l$ F5 h
- .ref bss_start* A) _3 h/ v9 ]" B! _6 m0 l1 ~
- .ref bss_end/ D+ E2 Y! ?. H) D% h
- .ref start_boot( R& Z+ D1 H0 M$ X( F, V3 o
! ~; j4 T) h0 u8 D V4 D5 N$ K H0 ?- ;************************ Internal Definitions ******************************
. v, u/ F" V& D: a$ E. q4 \ - ;
$ E. @+ Z, U$ G - ; Define the stack sizes for different modes. The user/system mode will use$ u; f; Y, y, l: S
- ; the rest of the total stack size
- t; g- ?% b0 l* S/ R4 @7 @1 H: L3 z - ;
/ T. T% [6 k( u' i' s+ s8 P - , c. H/ K7 W) R, ^
- UND_STACK_SIZE .set 0x8
8 e8 @3 h! h6 r- V0 `) g5 s - ABT_STACK_SIZE .set 0x8
( ^) A h4 V1 i - FIQ_STACK_SIZE .set 0x8# `3 a% u2 b8 y0 z* T5 L- j
- IRQ_STACK_SIZE .set 0x5008 ^2 E% C! u; f3 i6 l
- SVC_STACK_SIZE .set 0x8
, [3 Q5 a1 }9 @$ Z! a# y% H" B. V- x5 F - 2 J8 Q& \4 o$ E! Z& v
- ;
5 A+ @) j6 z& z& c# d+ s - ; to set the mode bits in CPSR for different modes; D9 {, p/ {' m# t- ?$ i+ A/ e
- ;# V7 _. n3 S) N( W
- % g" U$ r7 t' {8 u4 l
- MODE_USR .set 0x10
! q6 C3 b2 l6 s! Q& v- J( e- B - MODE_FIQ .set 0x11
2 G/ ] R9 ?$ c - MODE_IRQ .set 0x128 R! o- U0 F. _8 W1 g7 a# L1 S
- MODE_SVC .set 0x13
4 s a |! f, B! Q8 p; _# P+ i - MODE_ABT .set 0x17
|9 n7 B6 O7 L1 @& p4 |3 @# _ - MODE_UND .set 0x1B6 I* J0 e3 }1 b
- MODE_SYS .set 0x1F% x% _2 ~1 M) v+ u0 p: }8 g
6 F6 w$ Q1 R/ k9 G- I_F_BIT .set 0xC05 N9 Z; c4 m0 g" m* g* Y: t0 W, X
- - U5 r5 z5 y- o7 n$ `6 b$ U; p
- ;**************************** Code Seection ***********************************4 V. \ J$ V8 Z
- .text
+ T( F: j6 F* L9 O5 t5 n
: E3 ], l+ N5 o+ H0 R- ;# H; Z- `+ P& }% J$ k& u' Q
- ; This code is assembled for ARM instructions4 N) ?3 w2 h: a/ {8 p
- ;& u. V* @1 h! I `' f8 w0 [% `1 H
- .state32+ G2 R1 A) Z6 t1 c7 Q/ L* E E
6 B3 g7 v1 e( G j$ Z; u- ;******************************************************************************
: X0 L7 N9 b5 @ - ;! b: P+ W& _2 `, {& |( R
- ;******************************************************************************
7 S* Z: R1 r% p. \ - ;
- l* V8 q( k9 \. `. \ - ; The reset handler sets up the stack pointers for all the modes. The FIQ and3 N4 N7 L3 I" G
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the
) _* n! q( x3 k9 E - ; main() function.: Q3 k. R/ l1 \) |$ k# ]4 ^
- ;
% v, U# u0 h/ X1 n - Entry:$ z4 t k) R+ [* }
- ;
; n9 m3 b/ o2 q) U+ ?) V4 D - ; Set up the Stack for Undefined mode% m* ?5 U& V* }8 b
- ;
+ F( v; j& \& {% O - LDR r0, _stackptr ; Read and align the stack pointer& f% R P& m+ X: `- o+ W& ~; J
- SUB r0, r0, #8
2 [. s$ G7 z: O3 c - BIC r0, r0, #7
* P% v" D& g k - MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
% T- W$ } ^9 k+ t$ D* q% E' \ - MOV sp,r0 ; write the stack pointer
6 v& ^- F, ^+ H9 @5 e3 H - SUB r0, r0, #UND_STACK_SIZE ; give stack space. F. G! U4 F6 ?- O/ c; @6 w
- ;, F3 R& b; {' e0 S+ a& O
- ; Set up the Stack for abort mode
/ c& r% n) g+ N& i6 E& C! A - ;& }/ B6 I+ ^# C
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode9 h3 ?% _, D5 S
- MOV sp, r0 ; write the stack pointer
/ T9 r N Z; e; C, p d# } - SUB r0,r0, #ABT_STACK_SIZE ; give stack space
2 b, ^! ]1 e. R! V, ?2 N - ;
+ l/ F' h, X& ~: K$ a - ; Set up the Stack for FIQ mode
4 p: a9 S; b8 } - ;' `8 J* k* a s4 I! \
- MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode! m' N5 \ T3 b0 \! q B
- MOV sp,r0 ; write the stack pointer, m) q# g* y) M. w( r) _1 P
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
3 B1 W( t: W# ^% X - ;$ n: ~7 v- h, X' r- O" p" j* O. |
- ; Set up the Stack for IRQ mode
7 M- i2 P; j/ W5 @% N f - ;
C5 n# T8 t8 B+ ~# C - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode* e# r- R$ U: r4 I+ Z8 t4 @
- MOV sp,r0 ; write the stack pointer
1 k2 R* ?3 x# ]/ u$ x$ D - SUB r0,r0, #IRQ_STACK_SIZE ; give stack space9 \: ^3 F4 k: C3 a1 K9 i( v8 l
- ;( v' x. x8 _6 @ [
- ; Set up the Stack for SVC mode
8 u0 U$ {; H: w' Z- l - ;* Y; h" \ i) E+ V Q( a7 @1 X) h& N* o9 {
- MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
0 c% l- K5 }4 g! h% M/ T5 i - MOV sp,r0 ; write the stack pointer3 u+ u+ R" ^+ \
- SUB r0,r0, #SVC_STACK_SIZE ; give stack space9 V# b3 g {6 B, S) Q
- ;
; E2 E! o2 g. |$ j" c7 ~3 o - ; Set up the Stack for USer/System mode2 E: w# a& d4 Y9 b, {& Y
- ;! f' u( o4 v# g1 }+ [: T' Z
- MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode4 o F% \4 j9 j8 Q6 L/ p
- MOV sp,r0 ; write the stack pointer
4 S E* `# ]% w" ?0 \& A - 3 b/ y0 J0 R( N4 L1 y' M# N* l
- ;
4 C: K, T) O: e7 x. j. l - ; Clear the BSS section here
- S1 Q/ g/ X$ ^9 g0 |, } - ;
6 H7 Z. M2 O+ N+ P, ? - Clear_Bss_Section: b" g0 n9 W% t* `3 H l; r1 ?
- + n* ^* I1 Q9 s2 [5 C; N) g
- LDR r0, _bss_start ; Start address of BSS% _! K9 N+ N _( n$ H
- LDR r1, _bss_end ; End address of BSS
- j/ s% y% Y! ? o2 z$ A) } - SUB r1,r1,#4
1 P5 {4 I u& l: U: _8 X' N - MOV r2, #0
9 E/ A3 y) P# _% s; H+ ?0 F) v - Loop:
2 s) x2 f7 u5 b6 n& t6 ? - STR r2, [r0], #4 ; Clear one word in BSS0 W7 _# }- M* } X- g
- CMP r0, r15 D* K. p+ o3 M6 O6 R) m2 q) Z3 W+ P
- BLE Loop ; Clear till BSS end
7 `$ y- ?8 f* G. j - ' L' S* v9 v+ O- T1 o
- BL __TI_auto_init ; Call TI auto init
# ^, }6 z5 X! `7 B; E* N. ]. W
- _" c% N9 d, B) t8 p; x0 Q/ {- ;( t& R( S8 h/ G0 g
- ; Enter the start_boot function. The execution still happens in system mode( E8 |- N6 u) o6 t" q
- ;5 l7 a h9 N3 C* S: `# L
- LDR r10, _start_boot ; Get the address of start_boot- s! y) h9 w' X' D& s* J
- MOV lr,pc ; Dummy return ; I& d) F, W, r3 e& K5 d
- BX r10 ; Branch to start_boot% p/ @# l& n" \& }( `- f
- SUB pc, pc, #0x08 ; looping* J/ D0 O: J- N- j
7 w- H5 u! g" R! m' e- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode$ T# h( [- N1 G' ]6 Z8 B
- ; BX lr
2 v. v+ p6 e7 B9 r, B - ;
$ [% H x; \3 l: k - ; End of the file
$ m4 C( C8 W, H; o9 a" j; ~ - ;. T4 N w8 m7 h5 x
- / g' c+ ?1 S/ S% \! Q$ @# r
- _stackptr:, [! l6 C% m; u. i
- .word __STACK_END+ F1 j2 g' k3 e( Y
- _bss_start:
+ B6 t; D5 M k- _; r* \ - .word bss_start
) [1 _* T. V: _2 e6 D+ o. T - _bss_end:( [: H) B3 r# b! x# g" E
- .word bss_end
4 P/ W! Q# ?6 \- G: E! J - _start_boot:
, z& G0 D9 i% p2 k - .word start_boot: J# r' J p- {3 [4 g+ a# P
- _data_auto_init:
& F: r# N8 `9 H/ } - .word __TI_auto_init4 F, c3 K1 a0 L) k. J' Z+ R
- .end9 g" v) k, w8 B1 }
- " R+ F; g+ z3 i% V& L8 y
5 c/ z( f* Z9 |9 D7 M! l4 F
* l. N& ^& s7 m. x& a2 b2 |
复制代码
/ J; ]8 g+ e/ o+ i# j* \5 j* C, h9 f4 m0 M9 [
( e5 [2 e% L! c
5 Z/ I1 v; t% R6 t' F* Y1 H6 S
' O# V) C4 u# H+ X |
|