硬件平台: TMS320F28377D
软件版本: CSS 7.3
cmd文件说明:cmd文件主要是用于定位代码及数据的地址;
MEMRORY
定义各区域(名称)的起始地址及大小,然后在SECTIONS中使用;
必须与芯片实际情况相符(重要)。
MEMORY
{
PAGE 0: // PAGE0为ROM
........
PAGE 1: // PAGE1为RAM
ADCA : origin = 0x007400, length = 0x000080
ADCB : origin = 0x007480, length = 0x000080
ADCC : origin = 0x007500, length = 0x000080
ADCD : origin = 0x007580, length = 0x000080
}
SECTIONS
指明代码/数据的具体位置;
,
.text 代码段(必须定义)
.data(必须定义)
.bss 全局变量/静态变量(必须定义)
.stack 指定堆栈位置,不可用GS内存
.esystem 动态内存分配段
.econst 常量
LOAD:指明加载的位置
LOAD = 0x000000 定位到指定的地址
LOAD>ROM 定位到指定名称(MEMRORY中定义的)的存储区,可以简写为>
AdcaRegsFile : > ADCA, PAGE = 1
SECTIONS
{
AdcaRegsFile : > ADCA, PAGE = 1
}
一个工程可以有多个cmd文件,只要不冲突即可,TI的例程中BIOS.cmd就是定义寄存器级的,所有工程可以共用;
代码地址定位:
#pragma CODE_SECTION(InitFlash, "ranfuncs");
第一个参数是函数名称;
第二个参数是SECTIONS中定义位置;
数据地址定位:
#pragma DATA_SECTION(AdcaRegs, "AdcaRegsFile");
volatile struct ADC_REGS AdcaRegs;
第一个参数为变量名称;
第二个参数是在SECTIONS中定义的字段名称;
基于RAM运行例程:
存储器详细信息参考数据手册 6.3.1 Memory章节
GS 128KB(64KW = 4KW * 16) Global Shared RAM
LS 24KB(12KW = 2KW * 2) Local Shared RAM (CPU与CLA都可以访问)
M0/M1 1KW * 2 Dedicated RAM(仅CPU可以访问)
D0/D1 2KW * 2 Dedicated RAM(仅CPU可以访问)
MEMORY
{
PAGE 0 : /* ROM */
/* BEGIN 用于从SARAM引导模式 */
BEGIN : origin = 0x000000, length = 0x000002
/* CPU直接访问内存 */
RAMM0 : origin = 0x000122, length = 0x0002DE
RAMD0 : origin = 0x00B000, length = 0x000800
/* 全局共享RAM(共64KW) 32KW 用于ROM */
RAMGS0 : origin = 0x00C000, length = 0x001000
RAMGS1 : origin = 0x00D000, length = 0x001000
RAMGS2 : origin = 0x00E000, length = 0x001000
RAMGS3 : origin = 0x00F000, length = 0x001000
RAMGS4 : origin = 0x010000, length = 0x001000
RAMGS5 : origin = 0x011000, length = 0x001000
RAMGS6 : origin = 0x012000, length = 0x001000
RAMGS7 : origin = 0x013000, length = 0x001000
RESET: : origin = 0x3FFFC0, length = 0x000002
PAGE 1 : // RAM
BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part of M0, BOOT rom will use this for stack */
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
RAMD1 : origin = 0x00B800, length = 0x000800
/* 本地共享RAM 共12KW = 2KW*6 */
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
RAMLS5 : origin = 0x00A800, length = 0x000800
/* 全局共享RAM(共64KW) 32KW 用于RAM */
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
RAMGS11 : origin = 0x017000, length = 0x001000
RAMGS12 : origin = 0x016000, length = 0x001000
RAMGS13 : origin = 0x017000, length = 0x001000
RAMGS14 : origin = 0x016000, length = 0x001000
RAMGS15 : origin = 0x017000, length = 0x001000
CANA_MSG_RAM : origin = 0x049000, length = 0x000800
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800
}
SECTIONS
{
codestart : > BEGIN, PAGE = 0
ramfuncs : > RAMM0 PAGE = 0
.text : >>RAMM0 | RAMD0 | RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3 | RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7, PAGE = 0
.cinit : > RAMM0, PAGE = 0
.pinit : > RAMM0, PAGE = 0
.switch : > RAMM0, PAGE = 0
.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */
/*---------------------------------------------------*/
.stack : > RAMM1, PAGE = 1
.ebss : > RAMLS5, PAGE = 1
.econst : > RAMLS5, PAGE = 1
.esysmem : > RAMLS5, PAGE = 1
ramgs0 : > RAMGS8, PAGE = 1
ramgs1 : > RAMGS9, PAGE = 1
#ifdef __TI_COMPILER_VERSION
#if __TI_COMPILER_VERSION >= 15009000
.TI.ramfunc : {} > RAMM0, PAGE = 0
#endif
#endif
/* The following section definitions are for SDFM examples */
Filter1_RegsFile : > RAMGS10, PAGE = 1, fill=0x1111
Filter2_RegsFile : > RAMGS11, PAGE = 1, fill=0x2222
Filter3_RegsFile : > RAMGS12, PAGE = 1, fill=0x3333
Filter4_RegsFile : > RAMGS13, PAGE = 1, fill=0x4444
Difference_RegsFile : >RAMGS14, PAGE = 1, fill=0x3333
}