您好,欢迎来到61ic! | [登录] [注册] 忘记密码 | 设为首页 帮助
 . 网站首页 . 业界新闻 . 设计中心 . 移动技术 . TI专栏 . ADI专栏 . FPGA专栏 . 代码工厂 . 官方商城 . 
 . 活动专区 . 新品快递 . 解决方案 . 前沿科技 . TI资源 . ADI资源 . FPGA资源 . 下载中心 . 产品展示 . 
加入收藏
付款方式
联系我们
您现在的位置: 61IC电子在线 >> TI专栏 >> TI C2000 >> 28x 定点系列 >> 正文
  [图文]TI F2812 CMD文件编写           ★★★ 【字体:
TI F2812 CMD文件编写
作者:linux_xp…    文章来源:linux_xpj    点击数:    更新时间:2012-11-7    

TI 公司新的汇编器和链接器创建的目标文件采用一种 COFF (通用目标文件格式),该目标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程方法。用户可以通过编写链接命令文件(.cmd文件)将链接信息放在一个文件中,以便在多次使用同样的链接信息时调用。在命令文件中使用两个十分有用的伪指令 MEMORY SECTIONS,来指定实际应用中的存储器结构和进行地址的映射。Memory 用来指定目标存储器结构,Memory 下可以通过 PAGE 选项配置地址空间,链接器把每一页都当作一个独立的存储空间。通常情况下,PAGE0 代表程序存储器用来存放程序,PAGE1 代表数据存储器,用来存放数据。由编译器生成的可重定位的代码和数据块叫做“SECTIONS”()SECTIONS 用来控制段的构成与地址分配。对于不同的系统配置,“SECTION”的分配方式也不相同,链接器通过“SECTIONS”来控制地址的分配,所以“SECTIONS”的分配就成了配置 .cmd 文件的重要环节。以下是对“SECTIONS”的定义及分配的详细介绍。
1.
初始化的段(包括数据表和可执行代码)
.text
它包括所有的可执行代码和常数,必须放在程序页
.cinit
它包括常量表,要求放在程序页
.pinit
它包括全局构造器(C )初始化的变量和常量表,要求放在程序页
.const
它包括字符串、声明、以及被明确初始化过的全局和静态变量,要求放在低地址的数据页
.econst
:它是在使用大存储器模式时使用的,包括字符串、声明、以及被明确初始化过的全局变量和静态变量,可以放在数据页的任何地方;
.switch
它包括为转换声明设置的表格,可以放在程序页也可以放在低地址的数据页
2.
未初始化的段(为程序运行中创建和存放的变量在存储器中保留空间)
.bss
它为全局变量和静态变量保留空间,要求放在低地址的数据页
.ebss
它是在远(far)访问(只用于C)和大存储模式下使用,它为全局变量和静态变量保留空间,可以放在数据页的任何地方;
.stack
C 系统堆栈保留空间,这部分存储器为用来将声明传给函数及为局部变量留出空间,要求放在低地址的数据页
.system
动态存储器分配保留空间。这个空间用于 malloc 函数,如果不使用malloc函数,这个段的大小就是0,要求放在低地址的数据页
.esystem
动态存储器分配保留空间,这个空间用于外部malloc函数,如果不使用外部 malloc 函数,这个段的大小就是0,可以放在数据页的任何地方。

分析 F2812_EzDSP_RAM_lnk.cmd 文件(F2812_EzDSP_RAM_lnk.cmd 是在调试阶段使用的链接文件):
/*
//#######################################################################
// FILE: F2812_EzDSP_RAM_lnk.cmd
// TITLE:Linker Command File For F2812 eZdsp examples that run out of RAM
// This linker file assumes the user is booting up in Jump to H0 mode
//#######################################################################
// Ver | dd mmm yyyy | Description of changes
//======|=============|======|===========================================
// 1.00| 11 Sep 2003 | Changes since previous version (v.58 Alpha)
// | | Added BEGIN section to the start of H0
// | | Removed .bss, .const and .sysmem
// | | These are for a small memory model. All examples
// | | use the large model.
// | | Added .esysmem section
// | | Changed ramfuncs section to load and run from RAM
// | | (previously this was type DSECT)
// | | Moved peripheral register files to
// | | DSP28_Headers_BIOS.cmd
// | | and DSP28_Headers_nonBIOS.cmd
// | | Added CSM_RSVD memory section in FLASHA - this // | | region
// | | should be programmed with all 0x0000 when using // | | the CSM
//------|-------------|------|-------------------------------------------
//#######################################################################
*/
-w
MEMORY
{
PAGE 0 :
/* For this example, H0 is split between PAGE 0 and PAGE 1 */
/* BEGIN is used for the "boot to HO" bootloader mode */
/* RESET is loaded with the reset vector only if */
/* the boot is from XINTF Zone 7. Otherwise reset vector */
/* is fetched from boot ROM. See .reset section below */

RAMM0 : origin = 0x000000, length = 0x000400
BEGIN : origin = 0x3F8000, length = 0x000002
/*BEGIN : origin = 0x3F7FF6, length = 0x000002*/
PRAMH0 : origin = 0x3f8002, length = 0x001000
/* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */
RESET : origin = 0x3FFFC0, length = 0x000002
/* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */
VECTORS : origin = 0x3FFFC2, length = 0x00003E

PAGE 1 :
/* For this example, H0 is split between PAGE 0 and PAGE 1 */
RAMM1 : origin = 0x000400, length = 0x000400
DRAMH0 : origin = 0x3f9000, length = 0x001000
}

SECTIONS
{
/* Setup for "boot to H0" mode:
The codestart section (found in DSP28_CodeStartBranch.asm)
re-directs execution to the start of user code.
Place this section at the start of H0 */

codestart : > BEGIN, PAGE = 0
ramfuncs : > PRAMH0 PAGE = 0
.text : > PRAMH0, PAGE = 0
.cinit : > RAMM0, PAGE = 0
.pinit : > PRAMH0, PAGE = 0
.switch : > PRAMH0, PAGE = 0
.reset : > RESET, PAGE = 0, TYPE = DSECT /*not used*/

.stack : > RAMM1, PAGE = 1
.ebss : > DRAMH0, PAGE = 1
.econst : > DRAMH0, PAGE = 1
.esysmem : > DRAMH0, PAGE = 1
}
RAMM0 : origin = 0x000000, length = 0x001000 && .text : > PRAMH0, PAGE = 0
定义了代码存放位置,在用 TDS510 仿真器调试时,它应该是位于内存中。BEGIN : origin = 0x3F8000, length = 0x000002 && codestart : > BEGIN, PAGE = 0 定义了 Boot-ROM 启动后执行的代码,通过启动流程的分析我们知道,如果是 flash 启动,执行完 Boot-ROM 的代码将跳转到 0x3F7FF6,通常我们会在这里存放一条跳转指令让程序跳转到真正代码的入口点。但是如果在调试阶段定义成BEGIN : origin = 0x3F7FF6, length = 0x000002 ,在Load *.out 时就会出现如下错误。


这里定义成 0x3F8000 只是为了在调试阶段消除上述错误,并不是说程序会跳转到 0x3F7FF6 处。(注意:当使用仿真器调试时,Load *.out 可执行文件后,仿真器会自动将 PC 指针指向 _c_int00 的起始地址)
RESET : origin = 0x3FFFC0, length = 0x000002 && .reset : > RESET, PAGE = 0, TYPE = DSECT 定义了复位向量的位置,调试阶段不需要复位向量,因此需要加上 TYPE = DSECT 标识。

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    TI LM3S同时使用两个以上串口…
    基于TI的MSP430F247自动射击…
    简单的力量:TI SIMPLE SWIT…
    TI的无线应用解决方案
    TI-DSP控制板调试记录-DSP最…
    TI-DSP控制板调试记录-DSP外…
    TI-DSP控制板调试记录-TMS32…
    TI-DSP控制板调试记录-AD765…
    TI  EKK-LM3S8962使用蜂鸣器…
    TI C2833x介绍---系统的初始…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号