[CMD] DSP CMD文件详解
目录
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. 注意事项
- 一个工程可以有多个CMD文件,注意存储空间不要冲突。
- 自定义段必须用在变量定义和使用前,使用#pragma DATA_SECTION(symbol, "section name");和#pragma CODE_SECTION(symbol, "section name");
- 不能在函数体内定义段;
[CMD] DSP CMD文件详解相关推荐
- CMD文件详解与DSP存储空间
CMD文件详解与DSP存储空间 CMD的全称为链接命令配置文件.以ROM/FLASH和RAM两类存储器为对象,用户通过编写CMD文件,来管理和分配系统中的所有物理存储器和地址空间.DSP芯片的片内存储 ...
- Dockerfile中CMD和ENTRYPOINT命令详解
原文:https://m.jb51.net/article/136264.htm Dockerfile中CMD和ENTRYPOINT命令详解 发布时间:2018-03-12 11:46:00 作者:s ...
- 附005.Docker Compose文件详解
一 Docker Compose文件简介 compose文件使用yml格式,主要分为了四个区域: version:用于指定当前docker-compose.yml语法遵循哪个版本 services:服 ...
- 生成jni的android.mk,Android Studio 3.5版本JNI生成SO文件详解
学习在于记录,把自己不懂得容易忘记得记录下,才是最好得选择. 废话不多说,想要在Android开发中嵌入c/c++代码,直接开始如下步骤 1.创建需要调用的Java类 在你某个指定的包下创建如下类pa ...
- docker entrypoint入口文件详解
docker entrypoint入口文件详解 pasting Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较 [k8s]args指令案例-彻底理解docke ...
- vue-cli生成的模板各个文件详解(转)
vue-cli脚手架中webpack配置基础文件详解 一.前言 原文:https://segmentfault.com/a/1190000014804826 vue-cli是构建vue单页应用的脚手架 ...
- 红帽linux 系统日志,RedHat系统常见的日志文件详解一
RedHat系统常见的日志文件详解一 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息.% @7 h7 s, Y5 z! V' h- ...
- vue-cli脚手架配置基础文件详解/新手入门必看
vue-cli 脚手架中webpack 配置基础文件详解 需要Word版本 的小伙伴可以发我邮件2445478193@qq.com 一.前言 vue-cli是构建vue单页应用的脚手架,输入一串指定的 ...
- Makefile文件详解一(怎么在Windows下使用Makefile文件)
前言:如果熟悉在Linux开发的话,肯定知道Makefile文件的用处,它给我们带来很多的便利.在Linux系统下并不会像Windows那么多开发工具,在Windows下,只要在开发工具上点击一个按钮 ...
- Linux中/proc目录下文件详解
Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...
最新文章
- 给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler...
- 自定义ToolBar
- Spring Boot druid监控页添加登录访问权限(用户名+密码)
- ShopEx customSchema 定制可以根据客户的需求对网站进行相应功能的添加修改或者删除
- REVERSE-PRACTICE-BUUCTF-15
- [python]---从java到python(02)---多线程,队列
- oracle监听为blocked,关于“Instance +ASM1, status BLOCKED, ”
- Ubuntu 挂载新磁盘
- 主网上线也不开心,EOS背后公司被钓鱼
- cpu计算速度排行榜_CPU速度的计算方法和单位
- 一个让我瞠目结舌的电脑高手!(转自叁哥博客)
- 沐雪微信平台---企业微信营销专家
- 进销存excel_EXCEL也能连接扫码枪?商品扫码入库,免费进销存自由修改功能
- Echarts 中国地图(包括china.js文件)
- 风向风速传感器原理及应用
- python根据星座测性格_星座能够测试个人的性格吗?
- NCCL下载及安装教程
- 详解易经64卦-傅佩荣有声系列2
- java录入个人信息程序_Java:用键盘输入个人信息并输出
- 生产服务器的pcie错误
热门文章
- OATS和配对测试应该如何选择? 如何确定正交选择的强度?
- 2015070306 - EffactiveJava笔记 - 第55条 谨慎地进行优化(2)
- end=强制打印成一行;\t拉大列间距_xing2516_新浪博客
- 云和恩墨大讲堂 - 海南站
- windows7现实计算机内存不足,win7电脑内存不足怎么解决
- 实习时候的亚子==(三)
- maven导入oracle驱动jar包
- 程序员哪有朝九晚六的?朝九晚六只是形式
- 文件搜索神器everything 你不知道的技巧总结
- 重温经典(三)-百年思索