本文大部分内容都是别人,不是大部分,应该是全部:
首先理解什么是cmd文件,他是干嘛的,cmd文件首先它是用来分配ROM和RAM用的,告诉连接器怎么样计算地址和分配空间。所以不同的DSP型号,它都有不同的内存分配方式。
MEMORY命令:描述系统实际的硬件资源
SECTION命令:描述“段”如何定位
所以不同的芯片就有不同大小的
存储模型:c程序的代码和数据如何定位
系统定义
.cinit存放程序中的变量初值和常量
.const存放程序中的字符常量、浮点常量和用const声明的常量
.switch存放程序中switch语句的跳转地址表
.text存放程序代码
.bss为程序中的全局和静态变量保留存储空间
.far为程序中用far声明的全局和静态变量保留空间
.stack为程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果
.sysmem用于程序中的malloc、calloc、和realoc函数动态分配存储空间.
.text段和.cinit段被固定连接至程序空间,存储器类型可以使ROM或RAM(一般为ROM);.bss段和.stack段则被固定连接至数据空间,存储器类型只能是RAM。.const的使用则相对灵活。.const段被固定连接至数据空间,但存储器类型可以是ROM或RAM,这有别于.cinit段、cinit段被连接至程序空间,程序在执行时,再被复制到数据空间中的.bss段。这样一张未用const声明的数据表要同时占用程序(.cinit段)和数据空间(.bss段)的一部分。与之相比较,如果系统支持数据ROM,则该数据表改用const声明后,只需占用数据空间(.const段)的一部分。
下面是我的sections里面的一些东西。
SECTIONS {
.bss: {} > DDR2
.hwi_vec: {
HWI_A_VECS = .;
*(.hwi_vec)
} align = 0x400 > DDR2
.far: {} > DDR2
.sysdata: {} > DDR2
frt: {} > DDR2
.mem: {} > DDR2
.bios: {} > DDR2
.cio: {} > DDR2
.data: {} > DDR2
.gio: {} > DDR2
.pinit: {} > DDR2
.sys: {} > DDR2
.sysregs: {} > DDR2
.text: {} > DDR2
.cinit: {} > DDR2
.switch: {} > DDR2
.gblinit: {} > DDR2
.sysinit: {} > DDR2
.trcdata: {} > DDR2
.hwi: {} > DDR2
.rtdx_text: {} > DDR2
GROUP {
.const: align = 0x8 {}
.printf (COPY): {}
} > DDR2
.args: align=4 fill=0 {
*(.args)
. += 0x4;
} > DDR2
.stack: {
GBL_stackbeg = .;
*(.stack)
GBL_stackend = GBL_stackbeg + 0x400 - 1;
_HWI_STKBOTTOM = GBL_stackbeg + 0x400 - 4 & ~7;
_HWI_STKTOP = GBL_stackbeg;
} > DDR2
.DDR2$heap: {
DDR2$B = .;
_DDR2_base = .;
DDR2$L = 0xa00000;
_DDR2_length = 0xa00000;
. += 0xa00000;
} > DDR2
.dsm: {} > IRAM
.mbx: {} > IRAM
.sem: {} > IRAM
.TSK_idle$stk: {
*(.TSK_idle$stk)
} > IRAM
/* LOG_system buffer */
.LOG_system$buf: align = 0x100 {} > IRAM
.rtdx_data: align = 0x40 { . += 0x80; *(.rtdx_data) } > IRAM
/* RTA_fromHost buffer */
.hst1: align = 0x4 {} > IRAM
/* RTA_toHost buffer */
.hst0: align = 0x4 {} > IRAM
.mbx$que: align = 0x4 {
mbx$queElems = .;
. += 12;
} > IRAM
.mbx1$que: align = 0x4 {
mbx1$queElems = .;
. += 12;
} > IRAM
.trace: fill = 0x0 align = 0x4 {
_SYS_PUTCBEG = .;
. += 0x200;
_SYS_PUTCEND = . - 1;
} > IRAM
.hst: {
HST_A_TABBEG = .;
_HST_A_TABBEG = .;
*(.hst)
HST_A_TABEND = .;
_HST_A_TABEND = .;
HST_A_TABLEN = (. - _HST_A_TABBEG) / 20;
_HST_A_TABLEN = (. - _HST_A_TABBEG) / 20;
} > IRAM
.log: {
LOG_A_TABBEG = .;
_LOG_A_TABBEG = .;
*(.log)
LOG_A_TABEND = .;
_LOG_A_TABEND = .;
LOG_A_TABLEN = (. - _LOG_A_TABBEG) / 24;
_LOG_A_TABLEN = (. - _LOG_A_TABBEG) / 24;
} > IRAM
.pip: {
PIP_A_TABBEG = .;
_PIP_A_TABBEG = .;
*(.pip)
PIP_A_TABEND = .;
_PIP_A_TABEND = .;
PIP_A_TABLEN = (. - _PIP_A_TABBEG) / 100;
_PIP_A_TABLEN = (. - _PIP_A_TABBEG) / 100;
} > IRAM
.sts: {
STS_A_TABBEG = .;
_STS_A_TABBEG = .;
*(.sts)
STS_A_TABEND = .;
_STS_A_TABEND = .;
STS_A_TABLEN = (. - _STS_A_TABBEG) / 16;
_STS_A_TABLEN = (. - _STS_A_TABBEG) / 16;
} > IRAM
}
.