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 code2 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, W1 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 code0 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    .endif4 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_size8 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 XAR54 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 XAR53 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 XAR76 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 Greturn:4 r3 W  ?' t% J( D$ b& o# h3 f8 |
        LRETR                                                                ; Return3 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