admin管理员组

文章数量:1570428

2024年6月24日发(作者:)

CMD 命令文件解析

CMD 文件的专业名称叫做链接器配置文件,用以存放链接器的配置信息,简称命令文

件。其中比较关键的就是MEMORY、SECTIONS两个伪指令的使用。MEMORY和SECTIONS

的相关语句必须使用大写字符。MEMORY是用以配置目标存储器的,而SECTIONS是用以指

定段的存放位置的。

1 存储空间的配置

DSP存储器分为三个独立选择的空间:程序空间、数据空间和I/O空间,其中程序存储

器存放待执行的指令和执行中所用的系数(常数),可使用片内或片外的RAM、ROM、EPROM

等构成;数据存储器存放指令执行中产生的数据,可使用片内或片外的RAM和ROM来构成。

I/O存储器存放与映像外围接口相关的数据,也可以作为附加的数据存储空间来使用。下表

是TMS320F28335的存储空间分布:

TMS320F28335的存储空间分布:

0x00 0000

0x00 0040

0x00 0400

0x00 0800

0x00 0D00

0x00 0E00

0x00 2000

0x00 4000

0x00 5000

0x00 6000

0x00 7000

0x00 8000

0x00 9000

0x00 A000

0x00 B000

0x00 C000

M0 矢量RAM(32*32)(VMAP = 1)

M1 SARAM(1K * 16)

PIE Vector-RAM(256*16)(VMAP=1,ENPIE=1)

XINTF Zone 0(XZCS0 ,Protected)(DMA-Accessible)

Peripheral Frame3(Protected)(DMA-Accessible)

Peripheral Frame1(Protected)

Peripheral Frame2(Protected)

L0 SARAM(4K * 16 ,Secure Zone,Dual-Mapped)

L1 SARAM(4K * 16 ,Secure Zone,Dual-Mapped)

L2 SARAM(4K * 16 ,Secure Zone,Dual-Mapped)

L3 SARAM(4K * 16 ,Secure Zone,Dual-Mapped)

L4 SARAM(4K * 16 ,DMA-Accessible)

Peripheral Frame0

M0 SARAM(1K *

16)

0x00 D000

0x00 E000

0x00 F000

0x01 0000

0x10 0000

0x20 0000

0x30 0000

0x32 0000

0x33 FFF8

0x34 0000

0x38 0080

0x38 0090

0x38 0400

0x38 0800

0x3F 8000

0x3F 9000

0x3F A000

0x3F B000

0x3F C000

0x3F E000

0x3F FFC0

L5 SARAM(4K * 16 ,DMA-Accessible)

L6 SARAM(4K * 16 ,DMA-Accessible)

L7 SARAM(4K * 16 ,DMA-Accessible)

XINTF Zone 6 ( 1M * 16,XZCS6)(DMA-Accessible)

XINTF Zone 7 ( 1M * 16,XZCS7)(DMA-Accessible)

FLASH(128K * 16 ,Secure Zone)

128 bit Password

ADC Calibration Data

User OTP(1K * 16, Secure Zone)

L0 SARAM(4K * 16 ,Secure Zone,Dual-Mapped)

L1 SARAM(4K * 16 ,Secure Zone,Dual-Mapped)

L2 SARAM(4K * 16 ,Secure Zone,Dual-Mapped)

L3 SARAM(4K * 16 ,Secure Zone,Dual-Mapped)

Boot Rom ( 8K * 16 )

BROM Vector – ROM(32 * 32)(VMAP =1 , ENPIE = 0)

2 BootRom

BootRom 是位于存储器地址0x3F E000 ~ 0x3F FFFF处的8K * 16位存储区域。并利用M0

区域的0x0002 ~ 0x004E作为其Boot程序的堆栈和ebss区。其内存映射如下:

3 Cmd 文件的分配方法

TI公司新的汇编器和链接器创建的目标文件采用一种COFF(通用目标文件格式),该目

标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程

方法。用户可以通过编写链接命令文件(cmd文件)将链接信息放在一个文件中,以便在多

次使用同样的链接信息时调用。在命令文件中使用两个十分有用的伪指令MEMORY 和

SECTIONS,来指定实际应用中的存储器结构和进行地址的映射。MEMORY用来指定目标存

储器结构,MEMORY下可以通过PAGE选项配置地址空间。链接器把每一页都当作一个独立

的存储空间,通常情况下,PAGE0 代表程序存储器用来存放程序,PAGE1 代表数据存储器,

用来存放数据。由编译器生成的可重定位的代码和数据块叫做“SECTIONS”(段),SECTIONS

用来控制段的构成与地址分配。对于不同的系统配置,“SECTION”的分配方式也不相同,链

接器通过“SECTIONS”来控制地址的分配,所以“SECTIONS”的定义及分配就成了配置.cmd

文件的重要环节。以下是对“SECTIONS”的定义及分配的详细介绍。

4 SECTIONS介绍

SECTIONS可分为两个基本的部分:

1. 被初始化的“SECTIONS”,包括数据表和可执行代码。

a) .text

b) .cinit

c) .pinit

d) .const

:所有的可执行代码和常数,必须放在程序页

:存放程序中的变量初值和常量,要求放在程序页

:C++的全局构造器列表,要求放在程序页。

:全局及静态常量,包括字符串,要求放在低地址的数据页,由const

进行申明。

e) .econst :在使用大存储器模式时使用,包括字符串、申明,以及被明确初始

化过的全局变量和静态变量,或由(far const)进行申明,可放在数据段的任何

位置

f) .switch :大的Switch语句的跳转地址表,当有-mt编译选项时放在程序页,

否则放在数据页

2. 未被初始化的“SECTIONS”(为程序运行中创建和存放的变量在存储器中保留空间)

a) .bss :为全局变量和静态变量保留空间。在程序开始运行时,C导入程序

把数据从.cinit节复制出去然后存在.bss节中。要求放在低地址的数据页

b) .ebss :在远(far)访问(只用于C)和大存储模式下使用,它为全局变量和

静态变量保留空间。在程序开始运行时,C导入程序把数据从.cinit段复制出来

然后存于.ebss节中。可以放在数据页的任何地方

c) .stack :为C系统堆栈保留空间,这部分存储器为用来将声明传给函数及位

局部变量留出空间。要求放在低地址的数据页。

d) .sysmem :动态存储器分配保留空间,这个空间用于malloc函数,如果不使

用malloc函数,这个段的大小就是0。要求放在低地址的数据页。

e) .esysmem:动态存储器分配保留空间,这个空间用于外部malloc函数

(far_malloc),如果不使用外部malloc函数,这个段的大小就是0。可以放

在数据页的任何地方。

5 .const详述

上述几个常用段中,.text段和.cinit段被固定连接至程序空间,存储器类型可以使ROM

或RAM(一般为ROM);.bss段和.stack段则被固定连接至数据空间,存储器类型只能是

RAM。.const的使用则相对灵活。.const段被固定连接至数据空间,但存储器类型可以是ROM

或RAM,这有别于.cinit段、cinit段被连接至程序空间,程序在执行时,再被复制到数据空

间中的.bss段。这样一张未用const声明的数据表要同时占用程序(.cinit段)和数据空间(.bss

段)的一部分。与之相比较,如果系统支持数据ROM,则该数据表改用const声明后,只需

占用数据空间(.const段)的一部分。

6 存储模式

C语言编译器将存储器当作一个由代码子模块和数据子模块组成的线性模块,每个由C

程序生成的代码子模块或数据子模块被放到各自的连续存储空间中。编译器认为目标存储器

的全部24位地址都有效。

编译器支持两种存储器模式:小存储器模式和大存储器模式,两种存储模式的数据在存

储器中的放置和访问有所不同。

6.1 小存储器模式(默认模式)

使用小存储器模式将得到比使用大存储器模式时更少的代码和数据。但是,程序必须满

足一定的大小和存储放置限制。

在小存储器模式中,在单页(64KB)存储器内的以下段都必须分配合适:

 .bss 和.data段(所有静态和全局数据)

 .stack 和 sysstack段(第1和第2系统堆栈)

 .sysmem段(动态存储空间)

 .const段

而对.text段(代码)、.switch(Switch语句)和.cinit(变量初始化)的大小和位置没有限制。

小模式下编译器使用16位数据指针来访问数据。XARn寄存器的高7位用来设置指向包

含.bss段的存储页。

6.2 大存储器模式

大存储器模式支持不严格的数据放置。用-ml 选项就可以应用该模式。在大存储器模式

下,数据指针为23位,在存储器中占2字空间。.stack和.sysstack必须在同一页上。在大存

储器模式下编译代码时,必须与运行时间库链接。应用程序中的所有文件都必须

使用相同的存储器模式。

链接器不允许同时存在大存储器模式和小存储器模式

《摘自 TMS 320C55X DSP 的说明》

本文标签: 存储器数据模式