EDA365电子工程师网
标题:
【TI C2000的使用经验】CMD文件解读&从flash里搬运RAM函数
[打印本页]
作者:
Gegu
时间:
2016-6-28 15:07
标题:
【TI C2000的使用经验】CMD文件解读&从flash里搬运RAM函数
首先每个数据段的存放位置,以及运行位置都是在cmd文件里面存放控制的。例如下面一段:
& D( m3 F8 p3 Y" @4 {; P6 w
.cinit : LOAD = FLASHC, PAGE = 0 /* Load section to Flash */
' v# r* a4 g5 e; P, e
RUN = RAML6, PAGE = 1 /* Run section from RAM */
% O7 X* ?5 _5 v2 I* x
LOAD_START(_cinit_loadstart),
1 Q) A) C5 k0 L6 b3 n
RUN_START(_cinit_runstart),
$ n4 e1 q8 p6 ?/ u
SIZE(_cinit_size)
/ A/ h! }' k7 v& _6 o
复制代码
8 S4 x5 D8 Q0 w7 o% w: H, R
我们就可以看到.cinit这个段。存放在flashC段里。运行的会把函数拷贝到RAML6段里来运行。后面的三行表示存储的起始位置,运行的起始位置,以及该函数的长度。
5 L4 |) a6 t" i g8 L( o0 q% i
有了这些就够了。如果不能保证DSP在下载程序后不会掉电,那么程序就要烧写在flash里。运行的时候呢。要么就拷贝到RAM里,要么就直接在flash里面跑。拷贝到RAM里又要看你程序会不会比较大,可以只拷贝一部分还是全部都拷进去。
2 @8 b# n0 L; }& j! i
那么本文后半部分就讲全部拷贝的方法。
" u: o. j g5 N0 C0 d7 b
首先我们来看F2806x_CodeStartBranch.asm这个文件。
: u- w( F; j* _' n; P+ a
***********************************************************************
* q# T5 ]* W" @8 Q7 A( A
* Function: codestart section
: d+ _* d5 Z3 U9 i! X
*
0 B" Y6 ]) a$ T9 Z2 G
* Description: Branch to code starting point
( R, [; @& D% F9 h7 Y4 @
***********************************************************************
) A! M2 p7 F, T+ J
+ X2 J- D- \3 o) @: }
.sect "codestart"
/ f. z: a/ y8 m/ Z% O9 P# s% y
: {7 R r1 i- p1 P9 M! D( [* c
code_start:
2 l9 L; T5 A x' T/ K& [
.if WD_DISABLE == 1
' t) z3 G3 c- c8 M7 h) s+ D/ Z
LB wd_disable ;Branch to watchdog disable code
2 W, F- n; ?0 h' w
.else
% x2 a, q/ W( W
LB _c_int00 ;Branch to start of boot.asm in RTS library
" o. k( A! J, K* o# l- O
.endif
+ n# K. @3 m/ V: {: h
* y" v/ O+ c. N4 f% ~
;end codestart section
2 v9 {( x, L$ u1 B+ S
复制代码
/ ^! d" W" ~/ `, y
controlSUITE默认的文件呢是这个样子的。先关看门狗,然后在跳转到c_int00开始执行。当然这些都是在main执行之前做的事。
0 w$ k- Y) d1 _8 u% V3 ?2 @
" }3 u( T2 J. \9 E+ G8 ?7 Q! U# \ o
那么我们就把这句话改掉。让他跳转到另一个地方去。
- u+ S5 z) x) F/ r6 n% w5 [
.sect "codestart"
8 p% A! S; Q, W
1 Y; b+ g& @8 k: |4 b
code_start:
* \, p) x5 H3 L, N/ {& D2 o
.if WD_DISABLE == 1
' U" b( M( [4 g6 ~1 H2 ?
LB wd_disable ;Branch to watchdog disable code
0 V' T9 c+ e+ W
.else
( h$ O5 y: W+ v$ p; g+ E4 ~
LB copy_sections ;Branch to copy_sections
$ I! K) u1 {( n; S
.endif
4 z9 d2 m# X6 t) U% C
复制代码
% z* x% b+ m% h& H* Q* }- r/ t; `
跳转到哪里去呢?我们就需要另一个文件给我们指示F2806x_SectionCopy_nonBIOS.asm
6 @+ B3 O; k' ?8 [
;############################################################################
# y$ J+ P, r) l7 m c
;
# \8 N1 ~* X2 Q/ q0 g# O
; FILE: DSP28xxx_SectionCopy_nonBIOS.asm
2 W( U) S) D3 ~: F( O" O
;
" f r) j3 e! U
; DESCRIPTION: Provides functionality for copying intialized sections from
( e* c( Q+ h7 s; ~& b
; flash to ram at runtime before entering the _c_int00 startup
: E" G' H; x9 n
; routine
v0 E1 h. |$ H0 d
;############################################################################
3 G6 r" O/ Y6 X$ P
; Author: Tim Love
; C+ w" a( P( Q4 o! ?
; Release Date: March 2008
; n4 ?$ C$ H9 T2 F- R/ `- H
;############################################################################
9 x6 G# {$ T( i+ ~' m
1 K. t6 T2 P- z' l( B
' |$ a" Y `( ]- Z" w% _# x" d, _
.ref _c_int00
! y8 v, U2 S5 m" X
.global copy_sections
: ^5 f7 \5 v, |
.global _cinit_loadstart, _cinit_runstart, _cinit_size
8 S9 [1 Z9 b/ r* A" ?. ]1 h" r
.global _const_loadstart, _const_runstart, _const_size
; J* ^+ m5 C1 s! h! L# a
.global _econst_loadstart, _econst_runstart, _econst_size
# L# R0 L' t: T2 R) _
.global _pinit_loadstart, _pinit_runstart, _pinit_size
" A) }$ w4 I" j+ I9 B
.global _switch_loadstart, _switch_runstart, _switch_size
: e- z8 G3 w+ p5 h) B J- a* r3 {
.global _text_loadstart, _text_runstart, _text_size
$ S8 _" \: a7 B
.global _cla_loadstart, _cla_runstart, _cla_size
/ t# W: q9 J- m S% }5 `
% L$ ^( y0 t+ u A
***********************************************************************
0 n$ W1 C1 y/ S2 y
* Function: copy_sections
- P# v; @" ^. K7 f& o# V) l
*
; m0 \- ^: }9 m& w% i& X2 {8 R0 [% e
* Description: Copies initialized sections from flash to ram
: Z/ D1 n( M2 m" g1 H8 x5 H( }
***********************************************************************
! O( ^$ u6 d% ]( l0 {7 y1 J6 W$ T& ^& {
3 [ l& _; \& q5 F
.sect "copysections"
7 u- _9 z! n0 _) y
$ n( ?3 X* B4 p
copy_sections:
: f4 |) Q5 n$ I9 L3 w% m
T! d. T0 L4 M: R1 V* g+ |: I
MOVL XAR5,#_const_size ; Store Section Size in XAR5
4 p0 n7 s7 T, v1 E
MOVL ACC,@XAR5 ; Move Section Size to ACC
" _8 C: `* K% r* M- t
MOVL XAR6,#_const_loadstart ; Store Load Starting Address in XAR6
5 `( q1 h0 d2 A, o
MOVL XAR7,#_const_runstart ; Store Run Address in XAR7
! H* j2 M" x3 t
LCR copy ; Branch to Copy
0 s0 o. N3 i4 v) i2 S0 D) ^8 h
( P8 W9 e# s3 v* p( D1 J
MOVL XAR5,#_econst_size ; Store Section Size in XAR5
' r( b8 G# ]0 n# W
MOVL ACC,@XAR5 ; Move Section Size to ACC
$ T2 {* y% r+ J/ v; H
MOVL XAR6,#_econst_loadstart ; Store Load Starting Address in XAR6
0 \3 N; @3 u6 v: h% p" I8 T( v
MOVL XAR7,#_econst_runstart ; Store Run Address in XAR7
+ k4 \6 H5 k$ _5 F+ Z
LCR copy ; Branch to Copy
* Q3 u3 M" f0 ]2 J C. l2 H$ K/ ?
, A L; H; v: t, t/ t j
MOVL XAR5,#_pinit_size ; Store Section Size in XAR5
4 M- R( I# y: K7 ^8 F, C
MOVL ACC,@XAR5 ; Move Section Size to ACC
( E7 N- v9 q+ x* _- W
MOVL XAR6,#_pinit_loadstart ; Store Load Starting Address in XAR6
- h, M/ R5 Q4 i. {8 }& D6 P8 m7 h
MOVL XAR7,#_pinit_runstart ; Store Run Address in XAR7
% @: C: A! e) T0 o. A8 D1 b
LCR copy ; Branch to Copy
4 T$ T9 M' _# r4 ^
+ ~' \) M i, [+ D& P
MOVL XAR5,#_switch_size ; Store Section Size in XAR5
3 r% h7 a' Q/ l5 ~, f* }0 y0 e. r
MOVL ACC,@XAR5 ; Move Section Size to ACC
$ \& z) S* }( c4 } @: F: x
MOVL XAR6,#_switch_loadstart ; Store Load Starting Address in XAR6
! }4 g: \: h, e H9 A9 G2 }
MOVL XAR7,#_switch_runstart ; Store Run Address in XAR7
6 c$ ^% a: [0 q" h4 q- n; L
LCR copy ; Branch to Copy
, z/ D% g8 ?9 h: T3 u5 D
# ~+ V) a& r) i% q
MOVL XAR5,#_text_size ; Store Section Size in XAR5
" L$ n# ]& N* b u
MOVL ACC,@XAR5 ; Move Section Size to ACC
& @! \; ]: H$ M* m) b: U/ m
MOVL XAR6,#_text_loadstart ; Store Load Starting Address in XAR6
" g1 S# ?9 g8 f; P! ~6 i6 ~( e
MOVL XAR7,#_text_runstart ; Store Run Address in XAR7
# Z/ G- N7 A2 e9 X% ^1 v
LCR copy ; Branch to Copy
* W, ?4 {: l- o
5 G6 I [+ Z2 L8 }
MOVL XAR5,#_cinit_size ; Store Section Size in XAR5
2 e# K. ^6 a7 l9 q, |
MOVL ACC,@XAR5 ; Move Section Size to ACC
: M( O7 U- {2 d$ \8 o, S8 y/ @* |
MOVL XAR6,#_cinit_loadstart ; Store Load Starting Address in XAR6
( i0 k9 U. @! r6 Z/ F- w. A- B, k
MOVL XAR7,#_cinit_runstart ; Store Run Address in XAR7
5 U" y! H* H" W+ q1 f Q
LCR copy ; Branch to Copy
* u' R/ p% ^2 ]9 Y' X
5 e |" A0 H0 o9 x7 ]: D6 {
MOVL XAR5,#_cla_size ; Store Section Size in XAR5
& _$ H' u5 A$ ^" J. S: A( `$ r
MOVL ACC,@XAR5 ; Move Section Size to ACC
! y" J8 P3 `1 M7 n( K
MOVL XAR6,#_cla_loadstart ; Store Load Starting Address in XAR6
( {3 i7 q; B8 M
MOVL XAR7,#_cla_runstart ; Store Run Address in XAR7
; V1 P* p, N1 f6 ~2 Y! P
LCR copy ; Branch to Copy
" h# r% J# Y: @& Q J
8 _- W/ w4 ^, e% o& z; ]9 c; p! L
LB _c_int00 ; Branch to start of boot.asm in RTS library
, a& K& U0 I- m5 P! _
- m4 G8 M$ K& z1 `# k% y
copy:
2 ~! _* x9 V/ @% h& v
B return,EQ ; Return if ACC is Zero (No section to copy)
: V( k0 f& E: T0 |8 U
0 M( e$ M( G @
RPT AL ; Copy Section From Load Address to
. I! k; I2 D9 {
|| PWRITE *XAR7, *XAR6++ ; Run Address
# H, V# E7 d1 p4 g
* S8 \' u0 M. c, j8 G
return:
4 r3 W ?' t% J( D$ b& o# h3 f8 |
LRETR ; Return
3 A: w! n6 B" E1 f- @6 C0 t- _* |9 B
) v# h5 y1 l: R6 h! Z
.end
5 j9 m) F8 F& J& |% h
2 ]1 I2 ?8 A$ u
;//===========================================================================
. S9 E$ |1 o% F( G2 G) _
;// End of file.
9 Q4 F6 Y( T' S2 b
;//===========================================================================
9 |# f2 a$ x" T2 ]5 @' P% C. W- j6 b
复制代码
0 @( ~- k& P( Y! X! ]+ Z1 q
: v6 V% J3 o" V- G8 x
看到这个文件比较长,但其实是一直在重复。每段里是先把某一个程序段的长度给ACC,然后把存储起始地址,运行起始地址给XAR6,XAR7。然后就是拷贝。
2 N( A/ q) q( b% m
然后所有的数据段都拷贝完了,在跳转会c_int00继续执行。
* I/ Y3 |5 ]8 a7 }/ _* s
这样就完成啦。是不是很简单。
3 s$ Q F- N n3 w8 d( N, n
作者:
Gegu
时间:
2016-6-28 15:08
看贴学心得,回贴是美德
3 Y9 i3 Q, y+ ^3 h) A6 {8 D
作者:
xuzwg
时间:
2016-6-29 10:36
好人啊 感恩感恩
|. s0 M% \6 I( s/ a
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2