|
' X ]: Y' N. b( w
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
7 O* l9 d' R) t z; J/* 重新配置程序入口点 */
7 Y9 ?8 b7 Q1 N) z3 b-e Entry- /****************************************************************************/+ i# d4 k! Z2 V& H2 x* U6 E1 I' r
- /* */
7 n6 R/ a0 Q. s6 S( X" C4 m - /* OMAPL138 及 DSP C6748 内存空间分配定义 */
0 v# x4 D6 d8 H$ b9 b- Y - /* */) c5 l* N9 l2 [1 J/ |
- /* 2015年04月20日 */
( ~' d" j) ?) p* n - /* */
W$ M. y/ \# L. ~ - /****************************************************************************/
( ]! D: f; B- } - /* 堆栈 */3 p$ w5 t3 L9 l7 C, N, S+ X X0 _, M
- -stack 0x80005 d Y$ c4 P7 V
- -heap 0x2000$ L5 Y; }( W" q
; J) c y7 P. ~ i, q- /* 重新配置程序入口点 */
* h" Q3 J8 n- D* i - -e Entry
~: R5 d$ d7 T7 S" |
5 Z% f$ d3 q2 V( n. G- MEMORY, V, w9 a# Q, e7 Q+ y D: g: r
- {3 _: H$ I6 x: m0 V! O/ K
- #ifdef DSP_CORE
7 Q* j z. l' H. T: q2 M; \ - /****************************************************************************/4 o% O- c, p: t
- /* */' f: V* Q# W3 A( [! a' P# \7 ^
- /* DSP 专有内存区域 */
2 w& U5 N' p, v6 e - /* */
) e2 a% M. w% ]4 J - /****************************************************************************/
0 {* x9 h5 D1 _9 M0 R8 g3 a' V - DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */) r$ r2 P( D1 _+ s6 D3 O' k
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */+ P8 d6 }, k1 y. p7 ^# e3 e/ z
- DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
8 M5 p: ~# q# Y! b6 p) @2 t - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
/ G7 }8 |; v X! o8 p* T - #endif
复制代码 这是一段汇编代码用于切换到特权模式
# y! p) A0 U. w3 P3 k: E& L* G
$ ^& f( E9 t' o3 ~) @$ [OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm% i! S9 r' b3 E
- ;******************************************************************************
' f' _+ k/ E, W! j7 S; P7 p% @ - ;
/ _4 E/ m0 B1 m - ; init.asm - Init code routines
. N8 I2 l: M3 B7 m" `( R9 A- y3 ~ - ;
6 i7 b8 y4 \: W) g5 B+ c - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
% Y D: k8 c- H( ~2 U1 W, p; F - ; All rights reserved.
, B. y' s7 s0 Z; v+ f( v& `# j - ;
6 B; r4 s! J$ E3 v: ~5 X - ;******************************************************************************
R3 {* @" L, z, m5 k - ;****************************** Global Symbols*******************************( }* o/ ?0 @, e9 m2 R" W0 |% \
- .global Entry) e1 G) I2 H* m1 d* p- f1 R
- .global start_boot
N0 K- |6 p! M; \7 B - .global __TI_auto_init W- e( _( U$ W5 r
- , g I# g7 L& U
- .ref __stack& a3 J8 {$ I7 W+ }
- .ref __STACK_END2 I: C W+ u8 q# X) W
- .ref bss_start8 V5 N& J) e- H# c" D
- .ref bss_end/ g N) i" K" ]+ V4 |) \3 ?
- .ref start_boot
; T$ ^* F4 z+ @% g& k* e- a6 l
! e, D `3 C4 i3 K4 G- ;************************ Internal Definitions ******************************
& Y& ?5 J$ Q' k1 t7 h R4 \ - ;' B* |1 M* V, Z: F7 n, f6 |: S
- ; Define the stack sizes for different modes. The user/system mode will use F, _7 h; t% }; y$ B
- ; the rest of the total stack size+ J8 {- X! S$ ?
- ;
0 m; x. P* h1 R/ {) u5 w& y$ ? - + ^) M# H0 @; C/ t
- UND_STACK_SIZE .set 0x8 Q% W# R% f) y- m- A$ h7 v# A
- ABT_STACK_SIZE .set 0x8" D2 y' H$ x7 @( z
- FIQ_STACK_SIZE .set 0x81 a4 Y; f/ E }+ v% G
- IRQ_STACK_SIZE .set 0x500
/ a/ d! O" d. F9 ]; | | - SVC_STACK_SIZE .set 0x85 F6 Q+ p8 u9 |. i+ t: r3 @
7 [7 Z+ u ?4 n' G0 \- ;
7 J. v+ ~9 W8 F7 x* x' e; o - ; to set the mode bits in CPSR for different modes
0 |. L$ P. ]# ]9 {* y6 k A1 a - ;
f3 G' P0 b# n# M: R- e1 v+ K - 8 S9 H7 N; X$ k0 |) L- B
- MODE_USR .set 0x10
4 B& y6 R) N: P+ j - MODE_FIQ .set 0x111 _$ v6 S8 u; L( g3 n. S
- MODE_IRQ .set 0x12! d, ~7 H# E$ G; F* p
- MODE_SVC .set 0x134 w5 {! E0 K6 Q u: N9 _, [! f3 R
- MODE_ABT .set 0x177 P' M, j0 X4 c# v+ b# E
- MODE_UND .set 0x1B
9 t) o+ A1 ^+ ?- @& A$ m - MODE_SYS .set 0x1F
4 F* t2 z* c) j - 3 o" r- ^- C0 I
- I_F_BIT .set 0xC00 z7 t2 ~# S2 d- g
- # {, v2 F& w3 c$ r j7 A
- ;**************************** Code Seection ***********************************" i) z% {/ \4 r7 M+ R. n: ]# s
- .text, j. H: g1 L4 |
- / c" G4 C' o c" z
- ;, ?( ^9 C$ i, N6 n8 x
- ; This code is assembled for ARM instructions# j; E- m( {. E; o5 j
- ;. f5 U$ V4 p4 P
- .state32
4 D; }* o2 G1 g' m& J
- A( k0 F' x& s+ B% ^4 {1 ?- ;******************************************************************************) u* ^4 V |: V# @% K3 Z9 i! }, k
- ;( \ [+ n6 L8 ?& z2 q' ~
- ;******************************************************************************
; Y2 G7 ]; K6 C4 B# a, T - ;
- r7 i$ N7 v1 R- u - ; The reset handler sets up the stack pointers for all the modes. The FIQ and" w J& _" S" ^* P
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the; o+ J; r C9 I4 y# Q a2 m
- ; main() function.; W- a; h, e' d& j* g" V! J* m" i' d
- ;5 s: }4 E8 R' h( o; @4 G: @& C# B
- Entry:
! O2 Y8 X c. K* q/ t - ;
- Z$ |/ `4 y' k3 P) O: ]: g# W4 c# }4 T - ; Set up the Stack for Undefined mode
* G' A' |, ~' ]) {- b% M - ;
$ t+ n6 ? S; o% ~8 b$ L6 m - LDR r0, _stackptr ; Read and align the stack pointer
. j4 c6 X1 G! e9 k2 S% t - SUB r0, r0, #8
( J, G2 x z) o+ `0 t6 M$ q G - BIC r0, r0, #7, F$ I( A) L( X8 z) }. L6 t7 v
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
7 \- D# J' c5 e0 t! {4 K* F - MOV sp,r0 ; write the stack pointer4 [& q+ o5 x( n3 ^2 |: ?. c, K- n" J
- SUB r0, r0, #UND_STACK_SIZE ; give stack space
7 ]7 A* C5 M5 o7 {! k0 r2 H - ;
" d4 ]& Z# e S7 _$ M - ; Set up the Stack for abort mode
) ]$ t+ v5 J! p' N - ;/ n; @$ {/ c$ d0 g9 ?
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode7 T6 Y! a9 h% F0 e6 a
- MOV sp, r0 ; write the stack pointer
2 N _* f* e+ Y8 [ - SUB r0,r0, #ABT_STACK_SIZE ; give stack space
" x. @1 `( D: M* i. h0 p, o4 w - ; Z8 m2 I* x. l
- ; Set up the Stack for FIQ mode! Z! q' \, ?9 U' H T! ?& K2 F" s
- ;
1 O O' T5 Z( e1 R" k. o" ? - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode
; B8 b- v" s9 [* y; x6 b" M - MOV sp,r0 ; write the stack pointer9 K7 h3 v4 B5 y7 t+ K0 [+ C9 ^
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
! F6 O4 u) d2 P4 h# e7 _ - ;( A# x) j' R" \# \. A
- ; Set up the Stack for IRQ mode7 N. T) a2 d- ?; |. w( O$ ?& [2 U: \
- ;
) d9 G3 e2 I$ j6 W9 k - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode* m$ @4 y) j4 p
- MOV sp,r0 ; write the stack pointer
% W3 W$ A1 a* X8 h - SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
8 n! ?+ c* w/ e - ;
1 H$ J/ p H/ S/ i) x - ; Set up the Stack for SVC mode
# ^3 u4 T1 E U - ;. W) ]4 w/ |0 s" P3 P
- MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
% Y3 Z2 o* E( C8 g - MOV sp,r0 ; write the stack pointer. P7 [8 h6 K( M% N! G
- SUB r0,r0, #SVC_STACK_SIZE ; give stack space
# y$ u, O$ i/ v8 s7 v - ;# E4 A2 V$ }& {
- ; Set up the Stack for USer/System mode! _* g) M4 y5 x8 \: z
- ;
" D$ B$ Q x+ X; V& M$ C( J& L - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode3 h/ E* m8 N( T" W( _# ^3 x2 c
- MOV sp,r0 ; write the stack pointer0 Y6 x1 e' H6 P& I" V3 U; ?
; G: W5 e8 L' c8 h& B/ `! D' I- ;" I" L( }5 P% g' D
- ; Clear the BSS section here4 V, P# z" O/ Z5 x" C
- ;
6 D! a9 E" G& h6 T7 e6 R: _ - Clear_Bss_Section:# `/ D4 O' e1 V4 s7 V9 {( G; Q
6 r9 a9 P8 T4 r. y6 ^- LDR r0, _bss_start ; Start address of BSS
! S- r. }1 H& L. u A - LDR r1, _bss_end ; End address of BSS _ B; t3 v8 O# s/ ~
- SUB r1,r1,#4
9 S4 `' Z3 d. R' ]# _ - MOV r2, #0
0 l n" j# R3 @$ Q6 i - Loop:$ }" h8 g$ |0 j8 {+ P
- STR r2, [r0], #4 ; Clear one word in BSS
6 E3 Z! y' R% o1 W& Z- k - CMP r0, r1
: S' o6 d. S5 j& _ - BLE Loop ; Clear till BSS end
# j% o, A% w; w. M
, a, M9 K( G: i9 x0 m. ]+ E- BL __TI_auto_init ; Call TI auto init4 y# n; C) N2 ^ ~7 P
- 6 U7 D* C) p) g7 d
- ;
8 j3 o% C S% F7 w9 e s - ; Enter the start_boot function. The execution still happens in system mode
4 v# J$ B0 Y6 }) p& z6 F - ;
% B/ q+ E% t8 L1 C" ~- b5 ?0 D' h" G4 b) k - LDR r10, _start_boot ; Get the address of start_boot
6 \- Z; O( R- [5 _* y$ v - MOV lr,pc ; Dummy return
3 Y$ _. k2 i1 r8 \$ o+ P - BX r10 ; Branch to start_boot# v5 M- T. j& ~1 m3 V. g; {+ W
- SUB pc, pc, #0x08 ; looping
. ]# Y4 d5 m* o+ L - 6 \ Y/ {# J, D9 a
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode7 \- d( E8 C% }
- ; BX lr
7 V5 q, L0 ? @/ Y) n5 N3 Z - ;
4 |4 ~$ F. U$ [# f! s* C - ; End of the file) {# s4 I- e; U; p5 x
- ;
\: k, _4 K7 w
( z; O& O' s$ y: Q- _stackptr:
/ \1 n0 f4 s- E9 S - .word __STACK_END! {7 }6 d8 _) x2 @
- _bss_start:
2 y/ u' D6 P- }/ t - .word bss_start
3 D* _3 N! @0 d5 M9 Z' |3 M$ p - _bss_end:! u) z) ?! d" c% [2 w, `! l' } W
- .word bss_end! p7 E: m5 b. z; E) `6 w
- _start_boot:
$ {6 w6 O% D1 m - .word start_boot( ~8 X3 l9 a' G. H5 j
- _data_auto_init:9 h) @4 z) X+ q- r# ?" G
- .word __TI_auto_init2 n( X3 M: P! [
- .end$ `# Y f& i0 G6 B9 g! i
- ' D% h, @% ~6 |9 _' w& S8 `
- 4 v0 {( {; d2 T- F
2 @2 D" }9 Z/ f7 l& b/ i5 K
复制代码 / O$ j7 T4 M+ ?4 ?
3 O+ c/ o9 L% z0 w9 A
9 Q8 l3 c* \8 t1 n u/ y# e% i! \3 K9 I5 w
' ~- |$ g7 I( B/ D% Y |
|