搜索
bottom↓
回复: 22

2812CMD详解(申请加酷,绝对原创)

[复制链接]

出0入0汤圆

发表于 2010-9-29 08:43:08 | 显示全部楼层 |阅读模式
作者:EDA Code成员 fly_in_sky
补充说明:作者是我们组员,他没空,所以我发上来,但绝对是原创,这里是原帖http://www.edacode.com/bbs/thread-176-1-1.html,代为申请加精。
PDF文件点击此处下载 ourdev_586516XJQN0H.pdf(文件大小:638K) (原文件名:2812CMD详解.pdf)


CMD:command命令,顾名思义就是命令文件指定存储区域的分配.2812的CMD采用的是分页制,其中PAGE0用于存放程序空间,而PAGE1用于存放数据空间。

1.)#pragma ,CODE_SECTION和DATA_SECTION伪指令
#pragma DATA_SECTION(funcA,"dataA");  ------  函数外声明
将funcA数据块定位于用户自定义的段"dataA"中  ------  需要在CMD中指定dataA段的物理地址

2.)MEMORY和SECTIONS是命令文件中最常用的两伪指令。MEMORY伪指令用来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自己的名字,起始地址和长度。SECTIONS伪指令是用来描述输入端是如何组合到输出端内的。

以常用的F2812_nonBIOS_RAM.cmd     F2812_nonBIOS_Flash.cmd   和   DSP281x_Headers_nonBIOS.cmd为例
F2812_nonBIOS_RAM.cmd ----- 用于仿真,无BIOS系统,片外SRAM配置

(原文件名:1.jpg)

CMD文件里有两个基本的段:初始化段和非初始化段。初始化段包含代码和常数等必须在DSP上电之后有效的数。故初始化块必须保存在如片内FLASH等非遗失性存储器中,非初始化段中含有在程序运行过程中才像变量内写数据进去,所以非初始化段必须链接到易失性存储器中如RAM。

已初始化的段:.text,.cinit,.const,.econst,..pinit和.switch..
.text:所有可以执行的代码和常量
.cinit:全局变量和静态变量的C初始化记录
.const:包含字符串常量和初始化的全局变量和静态变量(由const)的初始化和说明
.econst:包含字符串常量和初始化的全局变量和静态变量(由far const)的初始化和说明
.pinit:全局构造器(C++)程序列表
.switch:包含switch声明的列表

(原文件名:2.jpg)


非初始化的段:.bss,.ebss,.stack,.sysmem,和esysmem.(更好的理解就是,这些段就是存储空间而已)

.bss: 为全局变量和局部变量保留的空间,在程序上电时.cinit空间中的数据复制出来并存储在.bss空间中。
.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中
.stack:为系统堆栈保留的空间,用于和函数传递变量或为局部变量分配空间。
.sysmem:为动态存储分配保留的空间。如果有宏函数,此空间被宏函数占用,如果没有的话,此空间保留为0
.esysmem:为动态存储分配保留的空间。如果有far函数,此空间被相应的占用,如果没有的化,此空间保留为0.


(原文件名:3.jpg)

F2812_nonBIOS_Flash.cmd --- 用于无BIOS,从片内FLASH引导

(原文件名:4.jpg)


(原文件名:5.jpg)

对于程序在FLASH中运行时,需要注意的: DSP在150M时钟频率下,FLASH中只能提供大约120M的时钟频率,所以有时候我们希望在RAM中运行时间敏感或计算量很大的子程序(比如AD采样)。但是我们所有代码都放在FLASH中,这就必须在上电后将FLASH中的这段敏感程序复制到RAM中运行,加快速度。这是在.CMD文件就必须划分一段用来设置RAM的载入和运行地址。 程序代码如下:
SECTIONS {………
   ramfuncs      :   LOAD = FLASHD,
                              RUN = RAML0,
                              LOAD_START(_RamfuncsLoadStart),
                              LOAD_END(_RamfuncsLoadEnd),
                              RUN_START(_RamfuncsRunStart),
                              PAGE = 0
  }

DSP281x_Headers_nonBIOS.cmd ----- 用于无BIOS,外设寄存器产生的数据段映射至对应的存储器空间

(原文件名:6.jpg)


(原文件名:7.jpg)


cmd小技巧:
如果.text文件很大将其放在一段放不下,需将其放到两个程序段中
最长的一个length=0x002000,也放不下时.可以这样处理:
PAGE 0 :
            PRAMH0     : origin = 0x3F8002, length = 0x0014FE
            L0RAM      : origin = 0x008000, length = 0x001000

SECTIONS
              .text:{*(.text)} >>PRAMH0|L0RAM
这样就可以将.text文件放在两个定义段中。


查看段的分配及使用情况.map的链接器(存储器)分配映射文件,链接器的map文件描述以下内容: 通过map文件可以查看各段的分配情况,包括段的起始地址,使用的字节数等配合cmd文件的使用,可确定各个段的使用情况,从而保证程序的正常运行和最小的空间使用。

VisualLinker可视化链接器TI公司出品的DSP软件开发环境CCS还提供了一种可视化生成存储器配置文件的工具:VisualLinker可视化链接器。如果程序原来包含了一个链接器命令文件(.cmd文件),则当创建可视化链接文件的时候,原来cmd文件中的内存配置仍然会被使用。如果读者想修改内存配置,双击.rcp文件就会在CCS中打开可视化链接器的图形界面,调整每个内存模块的大小,直到认为合适,然后只需要重新连编,程序即可生成新的输出文件,重复上面的步 骤,直到出现满意的结果。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-9-29 08:45:32 | 显示全部楼层
马上上图。

出0入0汤圆

发表于 2010-9-29 09:05:31 | 显示全部楼层
作者:EDA Code成员 fly_in_sky

作者是你吗?为啥名字不叫一样的呢?

出0入0汤圆

 楼主| 发表于 2010-9-29 09:09:46 | 显示全部楼层
作者是我们组员,他没空,所以我发上来,但绝对是原创,这里是原帖http://www.edacode.com/bbs/thread-176-1-1.html。同样申请加精。

出0入0汤圆

发表于 2010-9-29 09:39:35 | 显示全部楼层
这个有用呀,多谢了

出0入0汤圆

发表于 2010-9-29 09:43:57 | 显示全部楼层
2812 的cmd就像 stm32的s文件,启动和内存的管理文件。

官方都提供了例子代码,一般很少改动。

出0入0汤圆

 楼主| 发表于 2010-9-29 09:57:27 | 显示全部楼层
回复【5楼】fickle
-----------------------------------------------------------------------

知其然,而不知所以然。

出0入0汤圆

发表于 2010-9-29 21:47:38 | 显示全部楼层
回复【6楼】shawge
回复【5楼】fickle  
-----------------------------------------------------------------------
知其然,而不知所以然。
-----------------------------------------------------------------------

呵呵,cmd很简单的。不需要大张旗鼓的+括号云云吧。一般编译器会提示,看看改改就ok。

出0入0汤圆

发表于 2010-9-29 21:52:45 | 显示全部楼层
比如,F2812_nonBIOS_RAM.cmd 和F2812_nonBIOS_Flash.cmd 都是例子库的源代码。楼主花费只是打字功夫,或者copy功夫。这是所谓

的“所以然”吧。

出0入0汤圆

 楼主| 发表于 2010-9-30 08:35:33 | 显示全部楼层
等编译器提示的时候你慢慢改吧,等编译器不提示的时候去网上慢慢查吧,等查不出来的时候去问别人吧,等问不到别人的时候,自个哭吧,没用的家伙!

出0入0汤圆

发表于 2010-9-30 10:28:40 | 显示全部楼层
回复【9楼】shawge
-----------------------------------------------------------------------

“自个哭吧,没用的家伙!”你不会为了这个cmd而哭泣吧?呵呵,急了。

只是说了点实话,没有打击你的意思。

出0入0汤圆

发表于 2010-9-30 10:30:32 | 显示全部楼层
打了这么字,辛苦了。

顶你!

出0入0汤圆

发表于 2010-9-30 10:31:45 | 显示全部楼层
http://www.edacode.com/index.php?option=com_flexicontent&view=items&id=579:at89c2051
-------------------------------------------------------------------------------------
LZ这个是原创吗?转的话要注明ouravr

出0入0汤圆

发表于 2010-9-30 12:25:53 | 显示全部楼层
做DSP搞懂CMD文件非常重要,支持楼主

出0入0汤圆

发表于 2010-9-30 12:38:25 | 显示全部楼层
楼主原话,“2812的CMD采用的是分页制,其中PAGE0用于存放程序空间,而PAGE1用于存放数据空间。”

呵呵,然后看下面那个图,似乎给与佐证。但是搞笑的是 RAMH0 是难道不可以存储数据?

看来楼主是娱乐大家,呵呵,套用楼上的话“做DSP搞懂CMD文件非常重要,支持楼主 ”

出0入0汤圆

发表于 2010-10-2 18:24:11 | 显示全部楼层
使用过2000系列许多芯片,觉得2812确实不是个上佳之选。

1、双电源使用。3.3V和1.8(9)V,很奇怪的组合,很难发现其他公司有这样的产品。

2、ADC,虽然很快。精度差的太多。不如用后续产品2808,28335之类。

3、gpio口。现在芯片复用非常流行,这个2812居然没有。(最近使用stm32f103 的gpio复用8种之多)

4、居然没有dma。时钟频率150MHz,居然没有dma,速度瓶颈。

5、开发环境。jtag速度太慢了,而且非常不稳定。ccs版本达到4.0,但是使用2812还是用2.2版,很奇怪的事情。

出0入0汤圆

发表于 2010-11-10 19:55:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-4 10:29:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-11 16:31:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-8 00:22:01 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2011-7-12 10:03:11 | 显示全部楼层
写的挺详细的啊

出0入0汤圆

发表于 2011-7-17 10:44:46 | 显示全部楼层
非常感谢!

出0入0汤圆

发表于 2012-7-10 21:51:22 | 显示全部楼层
mark,多多学习天天向上
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 01:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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