14140|13

215

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【TI C2000的使用经验】CMD文件解读&从flash里搬运RAM函数 [复制链接]

 
首先每个数据段的存放位置,以及运行位置都是在cmd文件里面存放控制的。例如下面一段:
  1.    .cinit                        :        LOAD = FLASHC,        PAGE = 0        /* Load section to Flash */
  2.              RUN = RAML6,             PAGE = 1    /* Run section from RAM */
  3.              LOAD_START(_cinit_loadstart),
  4.              RUN_START(_cinit_runstart),
  5.              SIZE(_cinit_size)
复制代码
我们就可以看到.cinit这个段。存放在flashC段里。运行的会把函数拷贝到RAML6段里来运行。后面的三行表示存储的起始位置,运行的起始位置,以及该函数的长度。
有了这些就够了。如果不能保证DSP在下载程序后不会掉电,那么程序就要烧写在flash里。运行的时候呢。要么就拷贝到RAM里,要么就直接在flash里面跑。拷贝到RAM里又要看你程序会不会比较大,可以只拷贝一部分还是全部都拷进去。
那么本文后半部分就讲全部拷贝的方法。
首先我们来看F2806x_CodeStartBranch.asm这个文件。
  1. ***********************************************************************
  2. * Function: codestart section
  3. *
  4. * Description: Branch to code starting point
  5. ***********************************************************************

  6.     .sect "codestart"

  7. code_start:
  8.     .if WD_DISABLE == 1
  9.         LB wd_disable       ;Branch to watchdog disable code
  10.     .else
  11.         LB _c_int00         ;Branch to start of boot.asm in RTS library
  12.     .endif

  13. ;end codestart section
复制代码
controlSUITE默认的文件呢是这个样子的。先关看门狗,然后在跳转到c_int00开始执行。当然这些都是在main执行之前做的事。

那么我们就把这句话改掉。让他跳转到另一个地方去。
  1.     .sect "codestart"

  2. code_start:
  3.     .if WD_DISABLE == 1
  4.         LB wd_disable       ;Branch to watchdog disable code
  5.     .else
  6.         LB copy_sections    ;Branch to copy_sections
  7.     .endif
复制代码
跳转到哪里去呢?我们就需要另一个文件给我们指示F2806x_SectionCopy_nonBIOS.asm
  1. ;############################################################################
  2. ;
  3. ; FILE:   DSP28xxx_SectionCopy_nonBIOS.asm
  4. ;
  5. ; DESCRIPTION:  Provides functionality for copying intialized sections from
  6. ;                                flash to ram at runtime before entering the _c_int00 startup
  7. ;                                routine
  8. ;############################################################################
  9. ; Author: Tim Love
  10. ; Release Date: March 2008       
  11. ;############################################################################


  12.         .ref _c_int00
  13.         .global copy_sections
  14.         .global _cinit_loadstart, _cinit_runstart, _cinit_size
  15.         .global _const_loadstart, _const_runstart, _const_size
  16.         .global _econst_loadstart, _econst_runstart, _econst_size
  17.         .global _pinit_loadstart, _pinit_runstart, _pinit_size
  18.         .global _switch_loadstart, _switch_runstart, _switch_size
  19.         .global _text_loadstart, _text_runstart, _text_size
  20.         .global _cla_loadstart, _cla_runstart, _cla_size
  21.        
  22. ***********************************************************************
  23. * Function: copy_sections
  24. *
  25. * Description: Copies initialized sections from flash to ram
  26. ***********************************************************************

  27.         .sect "copysections"

  28. copy_sections:

  29.         MOVL XAR5,#_const_size                                ; Store Section Size in XAR5
  30.         MOVL ACC,@XAR5                                                ; Move Section Size to ACC
  31.         MOVL XAR6,#_const_loadstart                        ; Store Load Starting Address in XAR6
  32.     MOVL XAR7,#_const_runstart                        ; Store Run Address in XAR7
  33.     LCR  copy                                                        ; Branch to Copy
  34.    
  35.         MOVL XAR5,#_econst_size                                ; Store Section Size in XAR5
  36.         MOVL ACC,@XAR5                                                ; Move Section Size to ACC
  37.         MOVL XAR6,#_econst_loadstart                ; Store Load Starting Address in XAR6
  38.     MOVL XAR7,#_econst_runstart                        ; Store Run Address in XAR7
  39.     LCR  copy                                                        ; Branch to Copy

  40.         MOVL XAR5,#_pinit_size                                ; Store Section Size in XAR5
  41.         MOVL ACC,@XAR5                                                ; Move Section Size to ACC
  42.         MOVL XAR6,#_pinit_loadstart                        ; Store Load Starting Address in XAR6
  43.     MOVL XAR7,#_pinit_runstart                        ; Store Run Address in XAR7
  44.     LCR  copy                                                        ; Branch to Copy

  45.         MOVL XAR5,#_switch_size                                ; Store Section Size in XAR5
  46.         MOVL ACC,@XAR5                                                ; Move Section Size to ACC
  47.         MOVL XAR6,#_switch_loadstart                ; Store Load Starting Address in XAR6
  48.     MOVL XAR7,#_switch_runstart                        ; Store Run Address in XAR7
  49.     LCR  copy                                                        ; Branch to Copy

  50.         MOVL XAR5,#_text_size                                ; Store Section Size in XAR5
  51.         MOVL ACC,@XAR5                                                ; Move Section Size to ACC
  52.         MOVL XAR6,#_text_loadstart                        ; Store Load Starting Address in XAR6
  53.     MOVL XAR7,#_text_runstart                        ; Store Run Address in XAR7
  54.     LCR  copy                                                        ; Branch to Copy
  55.    
  56.            MOVL XAR5,#_cinit_size                                ; Store Section Size in XAR5
  57.         MOVL ACC,@XAR5                                                ; Move Section Size to ACC
  58.         MOVL XAR6,#_cinit_loadstart                        ; Store Load Starting Address in XAR6
  59.     MOVL XAR7,#_cinit_runstart                        ; Store Run Address in XAR7
  60.     LCR  copy                                                        ; Branch to Copy

  61.     MOVL XAR5,#_cla_size                                ; Store Section Size in XAR5
  62.         MOVL ACC,@XAR5                                                ; Move Section Size to ACC
  63.         MOVL XAR6,#_cla_loadstart                ; Store Load Starting Address in XAR6
  64.     MOVL XAR7,#_cla_runstart                        ; Store Run Address in XAR7
  65.     LCR  copy                                                        ; Branch to Copy

  66.     LB _c_int00                                                         ; Branch to start of boot.asm in RTS library

  67. copy:       
  68.         B return,EQ                                                        ; Return if ACC is Zero (No section to copy)

  69.     RPT AL                                                                ; Copy Section From Load Address to
  70.     || PWRITE  *XAR7, *XAR6++                        ; Run Address

  71. return:
  72.         LRETR                                                                ; Return

  73.         .end
  74.        
  75. ;//===========================================================================
  76. ;// End of file.
  77. ;//===========================================================================
复制代码

看到这个文件比较长,但其实是一直在重复。每段里是先把某一个程序段的长度给ACC,然后把存储起始地址,运行起始地址给XAR6,XAR7。然后就是拷贝。
然后所有的数据段都拷贝完了,在跳转会c_int00继续执行。
这样就完成啦。是不是很简单。

最新回复

学习了,很有用的经验!  详情 回复 发表于 2018-6-29 15:55

赞赏

1

查看全部赞赏

 
点赞 关注(4)

回复
举报

330

帖子

907

TA的资源

一粒金砂(中级)

沙发
 
谢谢分享  学习一下

 
 

回复

59

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
的确是高手,看了似懂非懂
 
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

4
 
本帖最后由 dontium 于 2015-4-19 10:50 编辑

2806x 的片内SARAM最大为50K(16bit),如果小程序倒是可以这么做的。


2802x/ 2803x使用的是MemCopy()函数,与它的作用相当。但2802x/ 2803x的例程中没有将所有程序拷贝到RAM里的例子,可能是因为2802x/ 2803x的 RAM空间太小(最大10K)的原因吧。

程序中使用了几个LCR, 实际上它调的程序只有一句(另一句可在程序编译前确定是否使用):

RPT AL     || PWRITE  *XAR7, *XAR6++

使用LCR调用子程序,在进入子程序时,需要最少4个周期,返回时,也需要4个周期。
所以可以将其直接写进程序里。

点评

感谢dotium提到的问题。 说得确实是小型程序的时候。程序文件较大的时候仅能将比较核心的函数memcopy到RAM里面运行。我只是提供一个全部都拷贝进去的方法。也算是个偷懒了的方法。 核心的功能实际上就  详情 回复 发表于 2015-4-20 00:24
 
 
 

回复

215

帖子

0

TA的资源

一粒金砂(高级)

5
 
dontium 发表于 2015-4-19 10:46
2806x 的片内SARAM最大为50K(16bit),如果小程序倒是可以这么做的。


2802x/ 2803x使用的是MemCopy()函数,与它的作用相当。但2802x/ 2803x的例程中没有将所有程序拷贝到RAM里的例子,可能是因为2802x/ 2803x的 RAM空间太小(最大10K)的原因吧。

程序中使用了几个LCR, 实际上它调的程序只有一句(另一句可在程序编译前确定是否使用):

RPT AL     || PWRITE  *XAR7, *XAR6++

使用LCR调用子程序,在进入子程序时,需要最少4个周期,返回时,也需要4个周期。
所以可以将其直接写进程序里。


感谢dotium提到的问题。


说得确实是小型程序的时候。程序文件较大的时候仅能将比较核心的函数memcopy到RAM里面运行。我只是提供一个全部都拷贝进去的方法。也算是个偷懒了的方法。



核心的功能实际上就只有那个把函数从flash拷贝到RAM里面的那句话。这个文件是从TI的源文件里面改的所以就显得比较臃肿了。确实可以放回到程序里。
 
 
 

回复

70

帖子

1

TA的资源

一粒金砂(高级)

6
 
说得确实是小型程序的时候。程序文件较大的时候仅能将比较核心的函数memcopy到RAM里面运行。我只是提供一个全部都拷贝进去的方法。也算是个偷懒了的方法。

核心的功能实际上就只有那个把函数从flash拷贝到RAM里面的那句话。这个文件是从TI的源文件里面改的所以就显得比较臃肿了。确实可以放回到程序里。
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

7
 
高手啊,学习一下
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(中级)

8
 
非常感谢楼主,最近正在学相关方面的知识,遇到一些问题,正好楼主在这里做了详细的分析和说明,给我们提供了一些解决问题的思路和方法,我要向楼主学习,楼主真棒~~
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

9
 
那么如果是部分搬移的话,哪些函数或者功能需要搬移到RAM中去执行呢

点评

在flash中读取速度要比RAM中慢。虽然有优化,但还是慢一点。涉及到经常运算的要搬运到RAM里面去。 除此以外,还有就是flash操作。是制定要在搬运到RAM里面才能进行调用的。  详情 回复 发表于 2015-9-14 16:23
 
 
 

回复

483

帖子

0

TA的资源

一粒金砂(中级)

10
 
大数据的处理需要搬移到RAM中 处理快。

eg:波形处理  图像处理
 
 
 

回复

215

帖子

0

TA的资源

一粒金砂(高级)

11
 
cl0201 发表于 2015-9-11 15:39
那么如果是部分搬移的话,哪些函数或者功能需要搬移到RAM中去执行呢

在flash中读取速度要比RAM中慢。虽然有优化,但还是慢一点。涉及到经常运算的要搬运到RAM里面去。
除此以外,还有就是flash操作。是制定要在搬运到RAM里面才能进行调用的。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
感谢楼主分享心得
但楼主说:“运行的时候,要么就拷贝到RAM里,要么就直接在flash里面跑。“这个地方应该不是很正确,如果一个函数定义在一个段里面(而这个段在CMD文件里声明成RAN = RAM),那么如果要调用这个函数,那么必须在调用前将它复制到指定RAM里面,不然程序应该会跑飞,因为编译器会根据CMD文件将函数名指向RAM。

捕获.PNG (18.47 KB, 下载次数: 2)

捕获.PNG

点评

yes你说的对。写程序的人语言描述起来都有点差劲。定义在ram里。可以储存在flash里。函数调用之前从flash拷贝一下就好了。不然ram区域里面就是空的,程序肯定要跑飞的。这也就是某一段的loadstart 和 Runstart的区别  详情 回复 发表于 2016-3-23 16:05
 
 
 

回复

215

帖子

0

TA的资源

一粒金砂(高级)

13
 
NashSKY 发表于 2016-3-23 01:20
感谢楼主分享心得
但楼主说:“运行的时候,要么就拷贝到RAM里,要么就直接在flash里面跑。“这个地方应该 ...

yes你说的对。写程序的人语言描述起来都有点差劲。定义在ram里。可以储存在flash里。函数调用之前从flash拷贝一下就好了。不然ram区域里面就是空的,程序肯定要跑飞的。这也就是某一段的loadstart 和 Runstart的区别了。
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

14
 
学习了,很有用的经验!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表