[资料] CMD文件那些事(上)

[复制链接]
发表于 2016-10-13 17:00:34   1207 查看 7 回复 显示全部楼层 倒序浏览
分享
概述
如果从事 TI DSP 处理器开发,CMD 文件一定是不可忽略的重要文件。当然,CMD 文件也并不是 DSP 处理器的专利,开发 TI ARM(不运行 HLOS 高阶操作系统),MCU 等处理器也都会遇到 CMD 文件。本文就以 C6000 DSP CMD 文件为例,给大家说说 CMD 文件的那些事。首先,需要知道 CMD 文件到底是什么文件?CMD 即 Linker Command Files 命令链接文件。CMD 发挥作用的阶段是在我们程序开发的链接阶段。即下图 Linker 阶段。 1.png 需要注意的是英文 Linker Command Files 中的 Files 是复数,也就是说在一个 DSP 项目中,CMD 文件可以不止一个。不论是否运行实时操作系统,都可以有多个 CMD 文件,但是不同的 CMD 文件中的内容不能有冲突,否则编译工具链会报链接错误!既然 CMD 文件在链接阶段发挥作用,那么就需要知道编译工具链在链接阶段究竟做了些什么?◆分配段到目标系统可配置内存区域◆重新定位符号和段并指派最终地址◆解析不同文件中未定义的外部引用◆分配段到特定的内存区域◆合并目标文件段◆定义或重定义链接时全局符号说了这么多,简而言之链接过程主要是一些对符号和程序段内存分配的操作。而 CMD 文件最主要的功能就是内存分配。使用 CMD 文件
CMD 文件结构:
CMD 文件主要有三部分内容
  1. 1、链接选项
  2.    可以在 CMD 文件修改链接选项,比如
  3.    -heap 0x1000
  4.    -stack 0x1000
  5.    这两个参数是指定堆和栈的大小,这里需要注意的是堆栈,虽然一般都放在一起描述,但它们可不是一回事。
  6. -l ../../../Library/Codec/h264hpvdec_ti.le66
  7. 还可以链接静态库(-l 小写英文字母 L),这里使用的是相对路径。
复制代码
  1. 2、MEMORY 指令 - 目标处理器内存区域描述
  2.        这一部分主要是描述目标处理器中内存区域,只要是可访问的内存区域都可以在这里描述,当然需要用到的内存空间要描述,不用到的可以不用描述。需要注意的是,这个内存描述仅在 CMD 文件中有效,不会影响其它文件,也不可以在其它文件中引用。
  3. 语法
  4. MEMORY
  5. {
  6. name 1 [( attr )] : origin = expression , length = expression [, fill = constant]
  7. .
  8. .
  9. name n [( attr )] : origin = expression , length = expression [, fill = constant]
  10. }
  11. name 命名一段内存区域,长度 1 - 64 个字符,可以使用 A - Z,a - z,$,.以及 _。
  12. attr 为这段内存区域指定 1 - 4 个属性。可选参数。属性限制对于段的分配。如果,不指定该参数即代表不限制该内存段属性。有效的属性有
  13. R 内存区域可读
  14. W 内存区域可写
  15. X 内存区域包含可执行代码
  16. I  内存区域可被初始化
  17. origin 指定内存区域起始地址,也可以写作 origin,org 或 o。地址以字节为单位的 32 位常量表达式,可以是十六进制、十进制或者八进制。
  18. length 指定内存区域长度,也可以写作 length,len 或 l。可以是十六进制、十进制或者八进制。
  19. fill 使用指定字符填充内存区域,也可以写作 fill 或 f。可选参数。填充字符为一个整数常量,可以是十六进制、十进制或者八进制。 fill 用于填充一段不用来分配段的内存区域。
  20. 地址操作可以使用的表达式,表达式的规则与标准 C 语言一致。
  21. 单目运算符 - ~ !
  22. 双目运算符 * / % + - <<>> == = <<= >>= & | && ||
  23. 其它 START SIZE END 这三个关键字分别用于获取引用内存区域的起始地址、大小及结束地址。

  24. 使用表达式描述地址的范例。
  25. /********************************************************/
  26. /* 范例                                     */
  27. /********************************************************/
  28. file1.obj file2.obj /* 输入文件 */
  29. --output_file=prog.out /* 选项 */
  30. #define ORIGIN 0x00000000
  31. #define BUFFER 0x00000200
  32. #define CACHE 0x0001000

  33. MEMORY
  34. {
  35. FAST_MEM (RX): origin = ORIGIN + CACHE length = 0x00001000 + BUFFER
  36. SLOW_MEM (RW): origin = end(FAST_MEM) length = 0x00001800 - size(FAST_MEM)
  37. EXT_MEM (RX): origin = 0x10000000 length = size(FAST_MEM) - CACHE
  38. }
  39. 1、SECTIONS 指令 - 分配程序段到内存
  40. 描述输入段如何合并到输出段;
  41. 定义可执行文件中的输出段;
  42. 指定输出段放置到的内存区域;
  43. 允许重命名输出段。

  44. SECTIONS
  45. {
  46. name : [property [, property] [, property] . . . ]
  47. name : [property [, property] [, property] . . . ]
  48. name : [property [, property] [, property] . . . ]
  49. }

  50. 加载分配 定义段被加载到的内存区域
  51. 语法:     load = 区域或
  52.           区域或
  53. > 区域
  54. 运行分配 定义段运行的内存区域
  55. 语法:     run = 区域 或
  56. run > 区域
  57. 输入段定义用于组成输出段的输入段(目标文件)
  58. 语法:     { 输入段 }
  59. 段类型   定义特定段标志
  60. 语法:     type = COPY 或
  61. type = DSECT 或
  62. type = NOLOAD
  63. 填充值   定义用来填充未初始化区域(Hole)值
  64. 语法:     fill = 值 或
  65.           名称: [属性= 值]

  66. SECTIONS 指令范例
  67. /**************************************************/
  68. /* 范例                                         */
  69. /**************************************************/
  70. file1.obj file2.obj /* 输入文件 */
  71. --output_file=prog.out /* 选项 */
  72. SECTIONS
  73. {
  74. .text: load = EXT_MEM, run = 0x00000800
  75. .const: load = FAST_MEM
  76. .bss: load = SLOW_MEM
  77. .vectors: load = 0x00000000
  78. {
  79. t1.obj(.intvec1)
  80. t2.obj(.intvec2)
  81. endvec = .;
  82. }
  83. .data:alpha:
  84. .data:beta:
  85. }

  86. 结合前面的范例,最终的内存分配如下图所示
复制代码


2.png
此外,有部分段由编译器及程序设计语言(C++ / C / 汇编)定义,当然开发人员也可以自行定义段。
编译工具创建的已初始化的程序段(EABI) 3.png 编译工具创建的未初始化的程序段(COFF ABI 及 EABI) 4.png
自行定义段名称不能跟这些名称冲突。

转自创龙微信公众号


标签:处理器

助理工程师

发表于 2016-10-13 19:08:41  

PCB在线计价下单

板子大小:

cm
X
cm

层数:

2

板子数量:

10

厚度:

1.6
谢谢大家得分享。谢谢。
回复

助理工程师

发表于 2016-10-13 19:12:31  
谢谢老师们的教导。谢谢帮助。
回复

点赞

技术员

发表于 2016-12-5 22:47:29  
谢谢楼主的分享。谢谢。
回复

技术员

发表于 2016-12-31 22:24:36  
好东西
回复

助理工程师

发表于 2017-1-5 09:09:41  
学习一下,虽然不懂
回复

实习生

发表于 2017-2-8 14:12:27  
谢谢分享
回复

工程师

发表于 2017-2-14 16:41:36  
感谢楼主,谢谢分享
回复

点赞

高级模式
您需要登录后才可以回帖 登录 | 注册

专家问答 查看更多>>
关闭

站长推荐 上一条 /7 下一条

小黑屋|手机版|Archiver| 电子发烧友 ( 粤ICP备14022951号-2 )     

GMT+8, 2017-6-27 15:14 , Processed in 0.176463 second(s), 16 queries , Memcache On.

微信扫描
快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

我的提问

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

-

硬件设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PCB设计论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

DFRobot专区

树莓派论坛

智能硬件论坛

开发快智能硬件开发平台

Intel物联网开发者专区

Waveshare

乐美客SBC专区

Arduino论坛

BeagleBone论坛

机器人论坛

创客神器NanoPi

小钢炮CANNON

比派科技banana pi专区

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

个人版区

阿东Verilog技术专版

直流马达驱动电路设计

LabVIEW英雄联盟

特权同学FPGA专区

-

厂商专区

灵动微电子 MM32

盈鹏飞嵌入式

TI论坛

TI Deyisupport社区

芯灵思嵌入式论坛

Tisan

米尔科技

庆科社区

WIZnet技术专区

Cypress技术论坛

飞凌嵌入式

Qualcomm技术论坛

英创嵌入式

机智云GoKit论坛

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区