目录

1. CMD文件是什么?

2. CMD文件的功能

3. CMD文件的使用方法

MEMORY伪指令——指示存储空间

SECTIONS伪指令——分配段到存储空间

4. 注意事项


1. CMD文件是什么?

CMD是链接器配置文件,指明连接器如何链接obj、lib等文件,生成可执行文件(.out)。

2. CMD文件的功能

  • 指示存储空间
  • 分配段到存储空间
  • 修改链接配置,如:

① -l test.lib链接文件

② -o test.out重定义生成可执行文件名称

③ -m test.map 重定义生成map文件名称

④ -stack 0x1000 栈大小0x1000字节

⑤ -heap 0x10000 堆大小为0x10000字节

注:在CMD文件中修改配置会覆盖工程配置

3. CMD文件的使用方法

MEMORY伪指令——指示存储空间

MEMORY
{PAGE 0: name0[attr]:     origin = constant, length = constant [, fill = constant]name0_0[attr]:   org = constant, len = constant [, fill = constant]PAGE 1: name1[attr]:     origin = constant, length = constant [, fill = constant]name1_0[attr]:   o = constant, l = constant [, f = constant]PAGE n: namen[attr]:     origin = constant, length = constant [, fill = constant]
}

PAGE —— 关键字,用于指示存储空间,页号最大值为255,实际应用中一般分为两页,PAGE0 程序存储器和 PAGE1 数据存储器。

name —— 代表某一属性和地址范围的存储空间名称。长度可以是1~8个字符,在同一页内名称不能相同,不同页内名称可以相同。

attr —— 用来规定存储空间的属性,共有四种属性:R-只读、W-只写、X-该空间包含可执行代码、I-该空间可以被初始化。实际使用,常忽略此选项。

orgin —— 用来定义存储空间起始地址的关键字。也可以写作org 或 o。

length —— 用来定义存储空间长度的关键字。也可以写作len 或 l。

fill —— 使用指定字符填充内存区域,也可以写作 f。可选参数。填充字符为一个整数常量,可以是十六进制、十进制或者八进制。 fill 用于填充一段不用来分配段的内存区域。

SECTIONS伪指令——分配段到存储空间

SECTIONS
{name : [property [, property] [, property] … ]name : [property [, property] [, property] … ]name : [property [, property] [, property] … ]
}

name —— 段的名称

property —— 段的属性,常用属性如下:

  • load —— 定义输出段将被装载到哪里的关键字,其语法如下:load = allocation 或者 allocation 或者 >allocation,allocation可以是绝对地址,例如“load = 0x000400”;当然,更多的时候allocation是存储空间的名称,这也是最为通常的用法。
  • run —— 定义输出段从哪里开始运行的关键字,其语法如下:run = allocation 或者>allocation
  • { input_sections } —— 输入段,其语法如下:花括号“{}”中是输入段名。这里对输入段和输出段做一个区分,每一个C语言文件经过编译都会生成若干个段,多个汇编语言或C语言文件生成的段大都是同名的,常见的的段有如.cinit、.ebss等,这些都属于输入段。这些归属于不同文件的输入段,在CMD文件的指示下,会被链接器链接在一起生成输出段。
  • PAGE —— 定义段分配到存储空间的类型。其语法如下:PAGE = 0或者PAGE = 1或者PAGE = n

注:CMD文件中规定,当只出现一个关键字load或者run时,表示load地址和run地址是重叠的。实际应用中,大部分的load地址和run地址都是重叠的。除了.const段。

自定义段:#pragma DATA_SECTION( 函数名或全局变量名,"用户自定义在数据空间的段名");#pragma CODE_SECTION(函数名或全局变量名,"用户自定义在程序空间的段名"),不能在函数体内声明,必须在定义和使用前声明, #pragma可以阻止对未调用的函数的优化。

段的存储特性
初始化? 存储器类型 分配的存储空间 内容 说明
.text 已初始化 ROM/RAM(Flash) PAGE0 所有可以执行的代码和常量  
.cinit ROM/RAM(Flash) PAGE0 初始化的全局变量和static变量表  
.const ROM/RAM(Flash) PAGE1 初始化的全局const变量和static const变量和字符串常量  
.econst ROM/RAM(Flash) PAGE1 长调用的常量  
.pinit ROM/RAM(Flash) PAGE0 全局对象的构造函数表(C++)  
.switch ROM/RAM(Flash) PAGE0/PAGE1 switch语句产生的表  
.bss 未初始化 RAM PAGE1 全局变量和static变量 为全局变量和局部变量保留的空间,在程序上电时.cinit空间中的数据复制出来并存储在.bss空间中。
.ebss RAM PAGE1 长调用的全局变量和static变量 为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中,与.ebss不同的是.bss分配范围被限制在低64K 16位数据区
.stack RAM PAGE1 栈空间 为系统堆栈保留的空间,用于和函数传递变量或为局部变量分配空间。
.system RAM PAGE1 malloc函数产生的内存 为动态存储分配保留的空间。如果有宏函数,此空间被宏函数占用,如果没有的话,此空间保留为0
.esystem RAM PAGE1 far_malloc函数产生的内存 动态存储分配保留的空间。如果有far函数,此空间被相应的占用,如果没有的化,此空间保留为0
CODE_SECTION自定义段   ROM/RAM(Flash) PAGE0 定义代码段 1. 自定义段必须用在变量定义和使用前,使用#pragma DATA_SECTION(symbol, "section name");和#pragma CODE_SECTION(symbol, "section name");
2.不能在函数体内定义段
DATA_SECTION自定义段   RAM PAGE1 定义数据段

4. 注意事项

  1. 一个工程可以有多个CMD文件,注意存储空间不要冲突。
  2. 自定义段必须用在变量定义和使用前,使用#pragma DATA_SECTION(symbol, "section name");和#pragma CODE_SECTION(symbol, "section name");
  3. 不能在函数体内定义段;

[CMD] DSP CMD文件详解相关推荐

  1. CMD文件详解与DSP存储空间

    CMD文件详解与DSP存储空间 CMD的全称为链接命令配置文件.以ROM/FLASH和RAM两类存储器为对象,用户通过编写CMD文件,来管理和分配系统中的所有物理存储器和地址空间.DSP芯片的片内存储 ...

  2. Dockerfile中CMD和ENTRYPOINT命令详解

    原文:https://m.jb51.net/article/136264.htm Dockerfile中CMD和ENTRYPOINT命令详解 发布时间:2018-03-12 11:46:00 作者:s ...

  3. 附005.Docker Compose文件详解

    一 Docker Compose文件简介 compose文件使用yml格式,主要分为了四个区域: version:用于指定当前docker-compose.yml语法遵循哪个版本 services:服 ...

  4. 生成jni的android.mk,Android Studio 3.5版本JNI生成SO文件详解

    学习在于记录,把自己不懂得容易忘记得记录下,才是最好得选择. 废话不多说,想要在Android开发中嵌入c/c++代码,直接开始如下步骤 1.创建需要调用的Java类 在你某个指定的包下创建如下类pa ...

  5. docker entrypoint入口文件详解

    docker entrypoint入口文件详解 pasting Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较 [k8s]args指令案例-彻底理解docke ...

  6. vue-cli生成的模板各个文件详解(转)

    vue-cli脚手架中webpack配置基础文件详解 一.前言 原文:https://segmentfault.com/a/1190000014804826 vue-cli是构建vue单页应用的脚手架 ...

  7. 红帽linux 系统日志,RedHat系统常见的日志文件详解一

    RedHat系统常见的日志文件详解一 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息.% @7 h7 s, Y5 z! V' h- ...

  8. vue-cli脚手架配置基础文件详解/新手入门必看

    vue-cli 脚手架中webpack 配置基础文件详解 需要Word版本 的小伙伴可以发我邮件2445478193@qq.com 一.前言 vue-cli是构建vue单页应用的脚手架,输入一串指定的 ...

  9. Makefile文件详解一(怎么在Windows下使用Makefile文件)

    前言:如果熟悉在Linux开发的话,肯定知道Makefile文件的用处,它给我们带来很多的便利.在Linux系统下并不会像Windows那么多开发工具,在Windows下,只要在开发工具上点击一个按钮 ...

  10. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

最新文章

  1. 给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler...
  2. 自定义ToolBar
  3. Spring Boot druid监控页添加登录访问权限(用户名+密码)
  4. ShopEx customSchema 定制可以根据客户的需求对网站进行相应功能的添加修改或者删除
  5. REVERSE-PRACTICE-BUUCTF-15
  6. [python]---从java到python(02)---多线程,队列
  7. oracle监听为blocked,关于“Instance +ASM1, status BLOCKED, ”
  8. Ubuntu 挂载新磁盘
  9. 主网上线也不开心,EOS背后公司被钓鱼
  10. cpu计算速度排行榜_CPU速度的计算方法和单位
  11. 一个让我瞠目结舌的电脑高手!(转自叁哥博客)
  12. 沐雪微信平台---企业微信营销专家
  13. 进销存excel_EXCEL也能连接扫码枪?商品扫码入库,免费进销存自由修改功能
  14. Echarts 中国地图(包括china.js文件)
  15. 风向风速传感器原理及应用
  16. python根据星座测性格_星座能够测试个人的性格吗?
  17. NCCL下载及安装教程
  18. 详解易经64卦-傅佩荣有声系列2
  19. java录入个人信息程序_Java:用键盘输入个人信息并输出
  20. 生产服务器的pcie错误

热门文章

  1. OATS和配对测试应该如何选择? 如何确定正交选择的强度?
  2. 2015070306 - EffactiveJava笔记 - 第55条 谨慎地进行优化(2)
  3. end=强制打印成一行;\t拉大列间距_xing2516_新浪博客
  4. 云和恩墨大讲堂 - 海南站
  5. windows7现实计算机内存不足,win7电脑内存不足怎么解决
  6. 实习时候的亚子==(三)
  7. maven导入oracle驱动jar包
  8. 程序员哪有朝九晚六的?朝九晚六只是形式
  9. 文件搜索神器everything 你不知道的技巧总结
  10. 重温经典(三)-百年思索