TMS320F28377D.cmd文件分析
-
存储器分配
MEMORY { PAGE 0 : /* 程序存储区 */ /* BEGIN用于"引导至FLASH" bootloader模式 */ /* Flash引导地址, 见图1.1 */ BEGIN : origin = 0x080000, length = 0x000002 /* Flash扇区 */ FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */ FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */ FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */ FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */ FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */ FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */ FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */ FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */ FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */ FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */ FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */ FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */ FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */ FLASHN : origin = 0x0BE000, length = 0x002000 /* on-chip Flash */ RESET : origin = 0x3FFFC0, length = 0x000002 /* 向量表首地址, 见图1.2 */ PAGE 1 : /* 数据存储区 */ /* 保留0x000002 ~ 0x000122存储区域, 用作BOOT rom的栈空间 */ BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part of M0, BOOT rom will use this for stack */ M01SARAM : origin = 0x000122, length = 0x0006DE /* on-chip RAM M0的部分空间及M1全部空间 */ LS05SARAM : origin = 0x008000, length = 0x003000 /* on-chip RAM LS0~LS5全部空间 CLA可访问 */ /* on-chip Global shared RAMs */ 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 RAMGS8 : origin = 0x014000, length = 0x001000 RAMGS9 : origin = 0x015000, length = 0x001000 RAMGS10 : origin = 0x016000, length = 0x001000 RAMGS11 : origin = 0x017000, length = 0x001000 RAMGS12 : origin = 0x018000, length = 0x001000 RAMGS13 : origin = 0x019000, length = 0x001000 RAMGS14 : origin = 0x01A000, length = 0x001000 RAMGS15 : origin = 0x01B000, length = 0x001000 /* Shared MessageRam */ CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400 /* CPU2发给CPU1消息用RAM */ CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400 /* CPU1发给CPU2消息用RAM */ }
图1.1 FLASH存储器映射
图1.2 C28x 存储器映射 -
存储器分配
SECTIONS { /* 分配程序区域 : * .cinit C语言 显式初始化的全局和静态变量表 程序区 * .binit * .pinit C++语言 全局构造函数表 程序区 * .text 代码段 */ .cinit : > FLASHA | FLASHB | FLASHC | FLASHD | FLASHE | FLASHF | FLASHG | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0 .binit : > FLASHA | FLASHB | FLASHC | FLASHD | FLASHE | FLASHF | FLASHG | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0 .pinit : > FLASHA | FLASHB | FLASHC | FLASHD | FLASHE | FLASHF | FLASHG | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0 .text : > FLASHA | FLASHB | FLASHC | FLASHD | FLASHE | FLASHF | FLASHG | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0 codestart : > BEGIN PAGE = 0 ramfuncs : LOAD = FLASHA | FLASHB | FLASHC | FLASHD | FLASHE | FLASHF | FLASHG | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0 RUN = LS05SARAM PAGE = 1 LOAD_START(_RamfuncsLoadStart), LOAD_SIZE(_RamfuncsLoadSize), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), RUN_SIZE(_RamfuncsRunSize), RUN_END(_RamfuncsRunEnd) #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 15009000 .TI.ramfunc : {} LOAD = FLASHA | FLASHB | FLASHC | FLASHD | FLASHE | FLASHF | FLASHG | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0, RUN = LS05SARAM PAGE = 1, table(BINIT) #endif #endif /* 分配未初始化的数据区: * .stack 栈 低64K * .ebss Far 全局/静态变量 数据区任意位置 * .esysmem far_malloc函数的存储区 数据区任意位置 * .cio */ .stack : > M01SARAM | LS05SARAM PAGE = 1 .ebss : > M01SARAM | LS05SARAM PAGE = 1 .esysmem : > LS05SARAM | M01SARAM PAGE = 1 .cio : > LS05SARAM | M01SARAM PAGE = 1 /* Initalized sections go in Flash 初始化在Flash中运行的区 * .econst Far常量 数据区任意位置 * .switch 大型switch语句跳转表 程序则带上 -mt 选项, 数据则不可带 -mt 选项 * .args * Filter_RegsFile * */ .econst : > FLASHA | FLASHB | FLASHC | FLASHD | FLASHE | FLASHF | FLASHG | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0 .switch : > FLASHA | FLASHB | FLASHC | FLASHD | FLASHE | FLASHF | FLASHG | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0 .args : > FLASHA | FLASHB | FLASHC | FLASHD | FLASHE | FLASHF | FLASHG | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0 Filter_RegsFile : > RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3 | RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8 | RAMGS9 | RAMGS10 | RAMGS11 | RAMGS12 | RAMGS13 | RAMGS14 | RAMGS15 PAGE = 1 /* 下面的段定义是使用IPC API驱动程序需要的 */ GROUP : > CPU1TOCPU2RAM, PAGE = 1 { PUTBUFFER PUTWRITEIDX GETREADIDX } GROUP : > CPU2TOCPU1RAM, PAGE = 1 { GETBUFFER : TYPE = DSECT GETWRITEIDX : TYPE = DSECT PUTREADIDX : TYPE = DSECT } }