一、CMD文件
链接命令文件(Link Command Files),以后缀.cmd结尾,简称CMD文件。
CMD文件的两大功能是指示存储空间和分配段到存储空间。
在编写CMD文件时,主要采用MEMORY和SECTIONS 两条伪指令。
在281x调试时,可以将程序代码链接到Flash或者RAM,因此对应两种CMD文件。
MEMORY伪指令
作用:指示存储空间。
语法如下:
MEMORY
{
PAGE 0 : name 0[(attr)]:origin = constant, length = constant
PAGE n : name n[(attr)]:origin = constant, length = constant
}
PAGE:用来指示存储空间的关键字。PAGE n的最大值为255。
name:代表某一属性和地址范围的存储空间名称。长度可以是1~8个字符,在同一页内名称不能相同,不同页内名称可以相同。
attr:用来规定存储空间的属性,共有四种属性:R-只读、W-只写、X-该空间包含可执行代码、I-该空间可以被初始化。实际使用,常忽略此选项。
orgin:用来定义存储空间起始地址的关键字。
length:用来定义存储空间长度的关键字。
举例
MEMORY
{
PAGE 0 :
FLASH : origin = 0x3D8000, length = 0x01FF80 /* FLASH */
BEGIN : origin = 0x3F7FF6, length = 0x000002
ROM : origin = 0x3FF000, length = 0x000FC0
RESET : origin = 0x3FFFC0, length = 0x000002
RAML0 : origin = 0x008000, length = 0x001000
PAGE 1 :
RAMM0 : origin = 0x000000, length= 0x000400 /* RAM M0 */
RAMM1 : origin = 0x000400, length= 0x000400 /* RAM M1 */
RAML1 : origin = 0x009000, length = 0x001000 /* RAM L1 */
RAMH0 : origin = 0x3F8000, length= 0x002000 /* RAM H0 */
}
SECTIONS伪指令
作用:分配段到存储空间,也就是指定段的实际硬件地址空间。
语法如下:
SECTIONS
{
name 0 : > 存储空间名称, PAGE = 页数
name n : > 存储空间名称, PAGE = 页数
}
name :编译器输出段的名称。
存储空间名称:采用MEMORY伪指令指示的存储器空间名称。
PAGE :前面存储器空间名称对应的存储器页。
举例
SECTIONS
{
.cinit : > FLASH, PAGE = 0
.text : > FLASH, PAGE = 0
.const : > FLASH, PAGE = 0
.econst : > FLASH, PAGE = 0
.stack : > RAMM0, PAGE = 1
.bss : > RAML1, PAGE = 1
.ebss : > RAML1, PAGE = 1
}
二、C28x存储器模型
存储器模型:TMS320C28x将存储器分成程序和数据两个线性块。
程序存储器:包含可执行代码,初始化数据和开关量;
数据存储器:包含外部变量、静态变量和系统堆栈。
编译器产生可重定位的代码和数据块,允许链接器将代码和数据分配到适当的存储器空间,而链接器则根据链接命令文件将代码和数据分配到目标存储器。这些代码和数据块,称为sections(段),有两种基本的sections类型,为初始化段和非初始化段。
初始化段
初始化段包含数据表和可执行代码。C编译器创建如下初始化段:
.text段:包含所有可执行代码和常量;
.cint段:已初始化的变量和常量表(用于C程序);
.pint段:已初始化的变量和常量表(用于C++程序);
.const段:包含字符串常数以及用const声明的全局和静态变量;
.econst段:同.const段,但用far const声明的变量或编译器采用大存储器模式时;
.switch段:为开关语句(switch)建立的数据表。
未初始化段
未初始化段在存储器(通常是RAM)中保留空间,程序在运行时可在此空间创建和存储变量。C编译器创建如下非初始化块:
.bss段:为全局和静态变量保留空间。程序引导过程中,C引导程序会将ROM中的.cint块中的数据复制到.bss块中;
.ebss段:为用far声明的或大存储器模式下的全局和静态变量保留空间。程序引导过程中,C引导程序会将ROM中的.cint块中的数据复制到.bss块中;
.stack段:为C系统的堆栈分配的空间,用于函数调用时传递参数以及为局部变量分配空间;
.sysmem段:为动态存储器分配保留空间,如果未用到malloc函数,则该块的空间为0;
.esysmem段:为动态存储器分配保留空间,如果未用到far malloc 函数,则该块的空间为0。