找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 119|回复: 2
打印 上一主题 下一主题

【TI C2000的使用经验】CMD文件解读&从flash里搬运RAM函数

[复制链接]

211

主题

652

帖子

1507

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1507
跳转到指定楼层
1#
发表于 2016-6-28 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
首先每个数据段的存放位置,以及运行位置都是在cmd文件里面存放控制的。例如下面一段:
" k7 t: {3 l) l9 ^   .cinit                        :        LOAD = FLASHC,        PAGE = 0        /* Load section to Flash */
) B0 l+ `8 J( ~% F             RUN = RAML6,             PAGE = 1    /* Run section from RAM */9 @1 R' S) G% t/ O; A
             LOAD_START(_cinit_loadstart),
. l. x! h) C& g2 d1 q$ J; g+ U3 J             RUN_START(_cinit_runstart),/ U' X7 w! R( R) f+ Y7 i2 o
             SIZE(_cinit_size)9 O$ i+ B9 {' B/ m" G
复制代码
5 y. [( f( F  k/ s8 }- ?$ K, L3 N: o我们就可以看到.cinit这个段。存放在flashC段里。运行的会把函数拷贝到RAML6段里来运行。后面的三行表示存储的起始位置,运行的起始位置,以及该函数的长度。
0 w% l. E# [3 c有了这些就够了。如果不能保证DSP在下载程序后不会掉电,那么程序就要烧写在flash里。运行的时候呢。要么就拷贝到RAM里,要么就直接在flash里面跑。拷贝到RAM里又要看你程序会不会比较大,可以只拷贝一部分还是全部都拷进去。
3 T0 Q( j3 A- u( F那么本文后半部分就讲全部拷贝的方法。6 X# x- ]/ S' M5 \( x& x
首先我们来看F2806x_CodeStartBranch.asm这个文件。
( T6 O2 H4 d8 ~" \' f/ ^6 @  H9 q***********************************************************************
, @! ~3 c& R3 x5 w$ g$ K) O* Function: codestart section
' }1 l, d& m6 K* J( |! h- z*
$ I3 y+ I0 H' h# K1 M* Description: Branch to code starting point
& @1 W; q/ M1 K. Z" k" y***********************************************************************
! x) Z6 |& }, Q5 I7 j# A/ }+ P7 w2 q( C/ E7 N
    .sect "codestart"
; `: ~0 G% _. S( E6 ]$ X" @& g& h4 o- e9 q. s% x/ H
code_start:
2 D! e+ l. s4 k    .if WD_DISABLE == 1' j' z  Z6 Z6 E9 r' s) U
        LB wd_disable       ;Branch to watchdog disable code5 T1 c# M& g# M; X; r# a, l
    .else% e% [* Q  A- A8 T' v
        LB _c_int00         ;Branch to start of boot.asm in RTS library, x, W( y* O$ e8 p: g8 i
    .endif
4 J" P4 h3 W1 I7 u4 _0 N0 u+ @* ~' H  Q0 f
;end codestart section" s2 B6 r9 V0 U1 n8 L# P
复制代码: s' [, R/ n, C# A6 F) f
controlSUITE默认的文件呢是这个样子的。先关看门狗,然后在跳转到c_int00开始执行。当然这些都是在main执行之前做的事。
8 b3 B4 a- n, t; j1 U& i" ]
& P- G) W! q. n4 e- r8 i( g那么我们就把这句话改掉。让他跳转到另一个地方去。% o  ^+ k6 G4 g
    .sect "codestart"  T5 p2 V) j4 b2 V  |$ ^( f8 v, t

+ ]% B) h# G& X, l0 Xcode_start:3 c9 P+ D0 w$ p, g( f( S$ {
    .if WD_DISABLE == 1) X5 M. ?5 _3 d. O! T
        LB wd_disable       ;Branch to watchdog disable code( f: ?( a* h: k; [) F* {
    .else$ Y7 D, o9 a7 s9 j) f* E8 o
        LB copy_sections    ;Branch to copy_sections+ V4 t2 m8 `) ?* ]% q' f3 I
    .endif
  N+ u& j' {* k. a; S3 r复制代码, b$ P  {) }; @4 A5 S4 J
跳转到哪里去呢?我们就需要另一个文件给我们指示F2806x_SectionCopy_nonBIOS.asm$ S( i9 f" y; h! `# j: ~* ^% T# n8 R
;############################################################################- o* H$ Q* G* k& y$ T" n& R6 q
;
0 l+ f' G: S7 F( p' l0 ?" O; FILE:   DSP28xxx_SectionCopy_nonBIOS.asm
" E0 [7 v5 z- c5 x/ K' e2 F;
3 m: U3 _+ k! ?1 W/ `; DESCRIPTION:  Provides functionality for copying intialized sections from
. Z, @2 R; V$ p) B5 a7 R& t;                                flash to ram at runtime before entering the _c_int00 startup& m/ Y+ @/ ~4 f0 H$ _
;                                routine
8 N) |8 t0 l1 P# ?# K  g7 H;############################################################################
; |7 G3 K9 o* {2 S; j& W5 n9 h; Author: Tim Love
: }' {' T2 M1 @5 H; Release Date: March 2008        
/ {8 u: ^0 d3 P4 f;############################################################################
. K* A# l6 l0 \' [/ v
5 v3 V, |# Z/ B. z( N
# z) \2 r- [8 l' e        .ref _c_int00+ E6 B; Q# }' L
        .global copy_sections
0 x1 b$ A9 b) N& r        .global _cinit_loadstart, _cinit_runstart, _cinit_size
" o" e' w& O& y. R        .global _const_loadstart, _const_runstart, _const_size0 E& J% ^$ n. T9 k
        .global _econst_loadstart, _econst_runstart, _econst_size
* b& o6 |' M' F3 e1 k/ o7 f8 Z        .global _pinit_loadstart, _pinit_runstart, _pinit_size
1 @8 h9 \& F* @4 k, K1 b# I7 m8 z# o- K  |        .global _switch_loadstart, _switch_runstart, _switch_size
5 ~! W; ~/ f. j        .global _text_loadstart, _text_runstart, _text_size5 Z1 c* U. Y7 q$ X+ r% B* A( C& h$ A
        .global _cla_loadstart, _cla_runstart, _cla_size5 G% P4 G( U) z6 D7 b& P0 f: U
        # z, w. K1 J% i' d- [
***********************************************************************
% }* {) b# ]3 [0 m, y* Function: copy_sections
4 R& E. y7 _: m, ]6 _2 g9 u& G** |; G# P$ u  n: C4 l2 u: ^
* Description: Copies initialized sections from flash to ram: G- {4 p6 _+ O+ n; f6 @
***********************************************************************5 Y# y' J' b9 M# R' ^
5 k5 C! t5 @% Y% U' L$ p
        .sect "copysections"8 T: g% i* P; h1 z' E
5 c4 |2 S$ N1 [2 J2 @
copy_sections:, X+ u/ ~3 ?/ d4 q% o9 F, o( @1 D+ r

( N5 X9 Y) K, d' I' p& L        MOVL XAR5,#_const_size                                ; Store Section Size in XAR5
1 v9 c+ |9 T! g1 e0 o8 c0 ~( Z        MOVL ACC,@XAR5                                                ; Move Section Size to ACC
# W2 s" E% J. T: m; U7 y' L        MOVL XAR6,#_const_loadstart                        ; Store Load Starting Address in XAR61 F- F; K; O  k  }3 ^
    MOVL XAR7,#_const_runstart                        ; Store Run Address in XAR7! R, [( F# A% @
    LCR  copy                                                        ; Branch to Copy
2 V8 m: C: F/ s* B    ! k! i5 z' q/ h9 t  t7 }
        MOVL XAR5,#_econst_size                                ; Store Section Size in XAR58 _+ F8 m0 K$ I( `
        MOVL ACC,@XAR5                                                ; Move Section Size to ACC: g+ U. f4 Y2 V/ Y8 \4 b
        MOVL XAR6,#_econst_loadstart                ; Store Load Starting Address in XAR62 [  q1 a9 y" W1 R8 T
    MOVL XAR7,#_econst_runstart                        ; Store Run Address in XAR7
0 V9 `: D, @) ~% s. P" Z/ h) c    LCR  copy                                                        ; Branch to Copy) ]; I$ r, @( e3 Q7 Z1 T4 B# o

4 u- d1 P3 R, z. J6 m) ?+ o3 \# I        MOVL XAR5,#_pinit_size                                ; Store Section Size in XAR5( u0 j" H8 R4 c- ~7 F3 \
        MOVL ACC,@XAR5                                                ; Move Section Size to ACC. j. {6 D0 H/ r0 k5 U: G' z' E3 w
        MOVL XAR6,#_pinit_loadstart                        ; Store Load Starting Address in XAR67 J) o* ?! \# U, @# u
    MOVL XAR7,#_pinit_runstart                        ; Store Run Address in XAR7
# C& P0 B% Q2 j: M5 ]7 C    LCR  copy                                                        ; Branch to Copy
# j) V1 u  U0 a- V. c* B2 U
* ?3 s9 W4 N+ A        MOVL XAR5,#_switch_size                                ; Store Section Size in XAR5, I) T! D. Y" y: ?
        MOVL ACC,@XAR5                                                ; Move Section Size to ACC
- r0 z1 i- c* k/ \; G6 L  |" z        MOVL XAR6,#_switch_loadstart                ; Store Load Starting Address in XAR6) C' L% j  @" _  }# T* l" k
    MOVL XAR7,#_switch_runstart                        ; Store Run Address in XAR7
, H5 @# J/ `6 x    LCR  copy                                                        ; Branch to Copy
) ^8 u# D7 P7 j* ]0 ]" M$ v4 Z: L  y
; P, |  {( s" E+ x& W" ~% s        MOVL XAR5,#_text_size                                ; Store Section Size in XAR5) t. M- @8 O; o5 f2 b& K3 _: ^, @
        MOVL ACC,@XAR5                                                ; Move Section Size to ACC
/ p$ y1 ~, m0 R9 p# P% {2 u8 A* @$ P        MOVL XAR6,#_text_loadstart                        ; Store Load Starting Address in XAR6. ]6 e6 ~5 q2 t, D$ ^; x6 a7 X" X
    MOVL XAR7,#_text_runstart                        ; Store Run Address in XAR7
; k3 Z% M6 E6 _: z# d) Z. o7 D1 V    LCR  copy                                                        ; Branch to Copy
" I# |. r0 ^, @6 }' Z, P   
9 I) u& O8 J4 K( `1 O( ^: y           MOVL XAR5,#_cinit_size                                ; Store Section Size in XAR5
: O$ E# d0 L7 ?0 A) n. P6 u/ F        MOVL ACC,@XAR5                                                ; Move Section Size to ACC
' p4 b4 N) A( b1 ~1 l* T2 ?        MOVL XAR6,#_cinit_loadstart                        ; Store Load Starting Address in XAR6
. ^* V- P& L5 B5 M9 I4 a+ N: M" |    MOVL XAR7,#_cinit_runstart                        ; Store Run Address in XAR7
( _7 u2 t6 |7 Y3 Q( T3 U% j    LCR  copy                                                        ; Branch to Copy
+ E) f3 H. g' z0 l; g1 E. m; C& U5 A  v) J/ X
    MOVL XAR5,#_cla_size                                ; Store Section Size in XAR5/ I3 `# S/ w0 O7 m5 H; z1 h
        MOVL ACC,@XAR5                                                ; Move Section Size to ACC
3 E. u2 E( f6 L6 H7 b        MOVL XAR6,#_cla_loadstart                ; Store Load Starting Address in XAR6& [+ N2 r3 z$ u% L% C! l. b# t
    MOVL XAR7,#_cla_runstart                        ; Store Run Address in XAR7
+ i' ~) r/ f, s5 @5 r8 t6 R' L, D    LCR  copy                                                        ; Branch to Copy
3 e* _% _0 l  ?: C% f9 s: C* t# \7 `1 y' ~# m, x
    LB _c_int00                                                         ; Branch to start of boot.asm in RTS library$ |" R- b8 c/ }, R: Q

- B% `, n" U- t8 s8 m1 u8 G& Ncopy:        ; n7 s& @6 }5 x8 U7 N" n' J' V
        B return,EQ                                                        ; Return if ACC is Zero (No section to copy)6 Y4 {/ r, \2 X; f0 a
9 i: T, t4 E6 h9 {
    RPT AL                                                                ; Copy Section From Load Address to( b6 J  v1 o/ c! j
    || PWRITE  *XAR7, *XAR6++                        ; Run Address
+ v/ m# J3 ]: I3 X! M" L2 J3 E/ q: v$ R( l; F9 N  [
return:
' J% y/ x. R2 V. o7 `( |        LRETR                                                                ; Return
/ Q, W, g  A5 w. L0 v6 ~9 ?' o0 @; M- A+ b
        .end
" G/ P2 v2 `  a# D1 Z5 W        
) B9 Y0 Q- }4 c8 r6 {9 t* L;//===========================================================================1 |8 c. T* }/ d. u  e+ t
;// End of file.! t2 b/ [( F% n  N* v
;//===========================================================================" K# g% L: a1 W
复制代码
7 v5 C, ~# b$ _
& U  f8 N5 u. q0 [/ J看到这个文件比较长,但其实是一直在重复。每段里是先把某一个程序段的长度给ACC,然后把存储起始地址,运行起始地址给XAR6,XAR7。然后就是拷贝。
( S4 b2 P" `- C3 f' x( R然后所有的数据段都拷贝完了,在跳转会c_int00继续执行。3 U2 p7 D* b; G3 k
这样就完成啦。是不是很简单。. _( s0 V+ W8 V5 I2 r" Z& t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

211

主题

652

帖子

1507

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1507
2#
 楼主| 发表于 2016-6-28 15:08 | 只看该作者
看贴学心得,回贴是美德0 W% W1 I  f. S6 i1 H: G

157

主题

597

帖子

1239

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1239
3#
发表于 2016-6-29 10:36 | 只看该作者
好人啊 感恩感恩! ~( {6 _5 [$ x( U
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-30 23:37 , Processed in 0.058261 second(s), 32 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表