找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 121|回复: 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文件里面存放控制的。例如下面一段:
, D! y# m. x6 [# E) K   .cinit                        :        LOAD = FLASHC,        PAGE = 0        /* Load section to Flash */
0 p' c" t2 m8 P9 A+ X  e2 X; v             RUN = RAML6,             PAGE = 1    /* Run section from RAM */
4 R4 S( b* Y9 F             LOAD_START(_cinit_loadstart),6 C, d: W) @' c& D
             RUN_START(_cinit_runstart),! {6 a5 p+ n# j0 d9 \
             SIZE(_cinit_size)+ I& I& F% b! e" m
复制代码
4 z' C/ H, P# C7 M# ]/ V. D( N我们就可以看到.cinit这个段。存放在flashC段里。运行的会把函数拷贝到RAML6段里来运行。后面的三行表示存储的起始位置,运行的起始位置,以及该函数的长度。7 C$ f1 J2 l- p6 L* D
有了这些就够了。如果不能保证DSP在下载程序后不会掉电,那么程序就要烧写在flash里。运行的时候呢。要么就拷贝到RAM里,要么就直接在flash里面跑。拷贝到RAM里又要看你程序会不会比较大,可以只拷贝一部分还是全部都拷进去。. N# b0 V: r1 \: p) c) Z( d
那么本文后半部分就讲全部拷贝的方法。7 i4 E  E- f& z. V) m& @
首先我们来看F2806x_CodeStartBranch.asm这个文件。
  H2 Z9 w. ?, F4 M; E4 [# a***********************************************************************
1 k# N7 a! N/ a. O* Function: codestart section
4 l2 o. A4 D4 g8 g% X*
2 W3 `. r2 l$ G1 U5 [* Description: Branch to code starting point
8 ~* `$ v4 |) v5 P- J: _***********************************************************************
) U' y& ^1 o* E- y+ b, z: ?( E
* e2 |7 h% l/ f, R2 |) c    .sect "codestart"
- W: j% u! O) [. W& W" U- J: l0 Q6 P3 x  E* g
code_start:
5 u$ d% c- Z1 q! U3 K3 c  q    .if WD_DISABLE == 1- y" z/ l2 J/ `: A: N
        LB wd_disable       ;Branch to watchdog disable code
, n" c# \- o0 r2 l. o    .else
1 G! A, T1 G! p; A: [# n! K        LB _c_int00         ;Branch to start of boot.asm in RTS library  ^; r9 i8 z- @7 y& w7 `( f% S
    .endif: ?" P1 Z! C3 S. f
8 f' P) `, e, x4 c6 @& S. Y
;end codestart section
0 K+ q( [( U. m& h复制代码
1 I8 u3 I$ c4 L- N! F( c! p, L8 {controlSUITE默认的文件呢是这个样子的。先关看门狗,然后在跳转到c_int00开始执行。当然这些都是在main执行之前做的事。
+ i* u5 q" K& j5 f5 Y. T3 y# Y/ R$ P
那么我们就把这句话改掉。让他跳转到另一个地方去。- M* R; l6 T4 s8 k: S
    .sect "codestart"
5 U0 O5 _% f. R5 ^* A% I7 F7 R/ `1 I: W0 u! b9 ^& B% B
code_start:6 k! f( P. y2 O
    .if WD_DISABLE == 1
  W2 o1 K! [$ F1 v3 g9 V        LB wd_disable       ;Branch to watchdog disable code
! ?, p) L) b- k' a  ~5 u, y. L9 p    .else
/ S) x; D! ~: t' Q0 j8 T& b1 L        LB copy_sections    ;Branch to copy_sections* I! p) N& ?3 X
    .endif& ?0 \4 Z6 t6 Q: q/ o% E5 C
复制代码1 g! V, |" U# N: r
跳转到哪里去呢?我们就需要另一个文件给我们指示F2806x_SectionCopy_nonBIOS.asm
3 X0 @4 f; [5 j4 N8 h;############################################################################  V$ i' U8 P1 U! j8 T1 q
;! J! k+ P  b7 m7 a8 Y4 ~# c$ g
; FILE:   DSP28xxx_SectionCopy_nonBIOS.asm; W, v' L/ \! ^0 C6 M' n
;
5 k; b( W. M" k; DESCRIPTION:  Provides functionality for copying intialized sections from & E. r; X6 V; h  p
;                                flash to ram at runtime before entering the _c_int00 startup
; |1 y. e+ N* G1 D- d;                                routine
6 c  t; _0 q* ~6 \;############################################################################
0 x. P5 h8 v4 n( \7 {7 B; Author: Tim Love7 a& `$ }+ X$ F4 j' v% f5 H7 X
; Release Date: March 2008        6 c1 \) j- e& V  }. n) g! ^' G1 {: P
;############################################################################
+ z+ G* T3 q0 c* J* G' a& p6 I1 R1 [4 B! F% Z) s8 Y! S* ?

- T  X' |# O4 O! B9 k; n" ^$ P        .ref _c_int00
# L# l- v/ c$ d' ?  \% T        .global copy_sections
" ~$ y# V: }! k: [        .global _cinit_loadstart, _cinit_runstart, _cinit_size  C% {# y$ w/ Y; S
        .global _const_loadstart, _const_runstart, _const_size
7 Y( m/ g. n; p$ e& O7 `1 {        .global _econst_loadstart, _econst_runstart, _econst_size- @' K; T) n- G* p: r+ f9 r" [
        .global _pinit_loadstart, _pinit_runstart, _pinit_size$ t7 x1 T7 S3 g6 d
        .global _switch_loadstart, _switch_runstart, _switch_size! I# w, M) X1 X& T( c. L
        .global _text_loadstart, _text_runstart, _text_size" U0 v3 Y6 R6 O; _& i
        .global _cla_loadstart, _cla_runstart, _cla_size9 `: L  \- y' H0 J! Z1 k/ e  P/ N3 O
        - Q2 t' x( E  e$ |3 c: A: l6 O
***********************************************************************" d" D1 ]2 h: c4 U+ [
* Function: copy_sections
% o# \& K/ s6 L2 J$ {1 q*
) S$ p1 M6 w3 R  S: x2 v* Description: Copies initialized sections from flash to ram4 K$ e- Q6 h; O* U8 t
***********************************************************************
# m( A! d( w" Y, R/ p" `: X8 K" m; z2 z/ P4 l
        .sect "copysections"
4 N8 k  m1 j5 q; ~6 G
6 V9 J$ C' j+ F! l* F  f+ ?+ tcopy_sections:0 E' N, f2 R# G

* X) U6 [3 |; }( \# q        MOVL XAR5,#_const_size                                ; Store Section Size in XAR5. o- g" h; m. R0 f3 _  G1 l0 u
        MOVL ACC,@XAR5                                                ; Move Section Size to ACC
! z9 Q; f6 y) b2 X2 G$ h; U( d        MOVL XAR6,#_const_loadstart                        ; Store Load Starting Address in XAR6" c) T/ @9 v" d% m0 j( n
    MOVL XAR7,#_const_runstart                        ; Store Run Address in XAR7
+ s+ d  z8 c0 v    LCR  copy                                                        ; Branch to Copy
5 @; J' D+ w; i' m/ h% }3 r   
) ]/ X0 B- g& ?4 I5 E; F        MOVL XAR5,#_econst_size                                ; Store Section Size in XAR5
' g! n4 Q* n/ G  D        MOVL ACC,@XAR5                                                ; Move Section Size to ACC
3 T  e: ], C7 t        MOVL XAR6,#_econst_loadstart                ; Store Load Starting Address in XAR66 N$ D( Q8 n( G2 u3 k4 P
    MOVL XAR7,#_econst_runstart                        ; Store Run Address in XAR75 d6 k+ P, r7 W3 j6 f8 E# D
    LCR  copy                                                        ; Branch to Copy
: }& E- _0 H8 \6 q
# }4 w/ b/ u! f( N        MOVL XAR5,#_pinit_size                                ; Store Section Size in XAR56 U& j2 t: D4 x7 j; G* _
        MOVL ACC,@XAR5                                                ; Move Section Size to ACC$ K' F( X; g# y3 `" E/ S# ~3 u. [6 d
        MOVL XAR6,#_pinit_loadstart                        ; Store Load Starting Address in XAR6/ S! |  g3 ]2 G2 Z0 w
    MOVL XAR7,#_pinit_runstart                        ; Store Run Address in XAR7
# e$ \4 u5 b' d( _# N    LCR  copy                                                        ; Branch to Copy   s' {; O- M2 ^  u1 \
# R9 |2 W+ L0 P& k9 s
        MOVL XAR5,#_switch_size                                ; Store Section Size in XAR53 {4 G- r0 `3 `$ ?2 B+ U! l
        MOVL ACC,@XAR5                                                ; Move Section Size to ACC
4 \9 X* f, _; {7 M# D6 _        MOVL XAR6,#_switch_loadstart                ; Store Load Starting Address in XAR64 T7 I9 A. ?% A# g  b6 |
    MOVL XAR7,#_switch_runstart                        ; Store Run Address in XAR7
8 M0 l! g0 u4 h( ?: v    LCR  copy                                                        ; Branch to Copy
7 {# F/ Y$ g5 O* M
' f9 {) R; g( B. |        MOVL XAR5,#_text_size                                ; Store Section Size in XAR5
7 q6 {; q4 _  ?) `1 U        MOVL ACC,@XAR5                                                ; Move Section Size to ACC( J% d: W. n3 C
        MOVL XAR6,#_text_loadstart                        ; Store Load Starting Address in XAR6
0 w8 P7 U. t4 J3 b2 m4 o2 w    MOVL XAR7,#_text_runstart                        ; Store Run Address in XAR74 A  i3 y8 e5 ~
    LCR  copy                                                        ; Branch to Copy
  i+ e: H# \0 f/ ^3 _    $ J  P6 b" N, ]2 u/ W5 y7 W' U
           MOVL XAR5,#_cinit_size                                ; Store Section Size in XAR5
0 Z4 M, F0 L; j' y& k        MOVL ACC,@XAR5                                                ; Move Section Size to ACC3 u# X/ [/ F# S  G. ]3 l. y9 N# M6 s
        MOVL XAR6,#_cinit_loadstart                        ; Store Load Starting Address in XAR64 @( F( C0 Y" u" a5 F! J6 A3 c
    MOVL XAR7,#_cinit_runstart                        ; Store Run Address in XAR7
+ y% `1 J. t  }6 m    LCR  copy                                                        ; Branch to Copy
' r2 b/ m" X+ Z; r4 Z/ p/ E3 O+ a* I; }6 J+ X( ~; ]: `) K. f& e4 g
    MOVL XAR5,#_cla_size                                ; Store Section Size in XAR5
) |; b+ @* W3 ?. E2 Q        MOVL ACC,@XAR5                                                ; Move Section Size to ACC
& }) |% j3 [* C$ @        MOVL XAR6,#_cla_loadstart                ; Store Load Starting Address in XAR62 f* V& f" e5 E6 q
    MOVL XAR7,#_cla_runstart                        ; Store Run Address in XAR7
" _/ I% q, r7 u# ]* M" K+ X* ?    LCR  copy                                                        ; Branch to Copy
+ A7 m$ B' t/ f7 n3 w1 `2 ~$ _8 \" L4 W
    LB _c_int00                                                         ; Branch to start of boot.asm in RTS library: n3 ^3 D! \' n+ k: X0 K

4 q4 q+ x0 V5 P, Ccopy:        ) ]9 {# Q/ I; M. M- G6 u2 I
        B return,EQ                                                        ; Return if ACC is Zero (No section to copy)
0 t8 J+ `3 n% m9 `% V; e: |/ |0 R
7 |) ?' f$ e# z1 N0 K! S5 u7 D8 I    RPT AL                                                                ; Copy Section From Load Address to
) A8 z& k9 e( w! h0 @+ O; O) ~6 |    || PWRITE  *XAR7, *XAR6++                        ; Run Address- Q" \% E( K, b+ B: q
4 k6 A+ A! c2 B
return:
( T& a) a0 K& {" w; |" h% J        LRETR                                                                ; Return) u& g/ I0 F6 m

0 n/ R# i" c9 m  Q* t5 _) E6 f        .end- @& d1 P* q  c9 r' t1 ?7 ^2 e. @% @
        0 z' T4 c" V- o  p! _
;//===========================================================================
' ?7 l, \/ E5 E8 n- m;// End of file.
$ f+ H! h6 K- T8 l% D3 G+ i  d6 A;//===========================================================================
: Y' @$ S+ k9 ?  M. ?3 x) O复制代码7 @: x6 j9 i! H% w  D3 Z: l' q

6 F" F6 Z0 C$ u5 Q1 z3 \看到这个文件比较长,但其实是一直在重复。每段里是先把某一个程序段的长度给ACC,然后把存储起始地址,运行起始地址给XAR6,XAR7。然后就是拷贝。
) ^/ ]" ]- G, q( {% X8 v6 ?0 R( [然后所有的数据段都拷贝完了,在跳转会c_int00继续执行。
# a7 `6 _4 f4 S这样就完成啦。是不是很简单。
$ l; T$ Z: F6 e% ^0 @- g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

211

主题

652

帖子

1507

积分

四级会员(40)

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

积分
1507
2#
 楼主| 发表于 2016-6-28 15:08 | 只看该作者
看贴学心得,回贴是美德
8 b8 m0 O# ~- B

157

主题

597

帖子

1239

积分

四级会员(40)

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

积分
1239
3#
发表于 2016-6-29 10:36 | 只看该作者
好人啊 感恩感恩% e# x, A5 n2 A5 ?7 o
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 06:48 , Processed in 0.057770 second(s), 32 queries , Gzip On.

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

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

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