一个DSP工程中主要包含如下几种类型文件:
<1>C文件(*.c及*.h);
<2>汇编文件(*.asm),注意有两种比较特殊的汇编文件,一种是中断向量表(vectors.asm-常见于不包含DSP/BIOS的程序中),
另一种是bootloader文件(该文件实现二级启动功能);
<3>库文件(*.lib、*.a、*.a64等),该类型文件是对源文件的一种封装,通常只提供API调用接口,不提供源码,既可以防止对
源文件的误修改,也可以起到保护知识产权的作用;
<4>dsp/bios(*.tcf),该文件见于使用DSP/BIOS中的工程中,是DSP/BIOS的配置文件,可以使用图形或文本方式进行DSP/BIOS的配置
<5>链接命令文件,该文件主要是定义存储器的物理空间(MEMORY)及程序段与物理空间的映射关系(SECTIONS);
这里先从CMD文件说起,首先说一下MEMORY部分,这里以TMS320C6455的一个实例进行讲解:
MEMORY {
L1PRAM: o = 0x00E00000 l = 0x00008000 /* 32kB L1 Program SRAM/CACHE */
L1DRAM: o = 0x00F00000 l = 0x00008000 /* 32kB L1 Data SRAM/CACHE */
L2RAM: o = 0x00800000 l = 0x00200000 /* 2MB L2 Internal SRAM */
EMIFA_CE2: o = 0xA0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
EMIFA_CE3: o = 0xB0000000 l = 0x00800000 /* 8MB EMIFA CE3 */
EMIFA_CE4: o = 0xC0000000 l = 0x00800000 /* 8MB EMIFA CE4 */
EMIFA_CE5: o = 0xD0000000 l = 0x00800000 /* 8MB EMIFA CE5 */
DDR2_CE0: o = 0xE0000000 l = 0x10000000 /* 256MB EMIFB CE0 */
}
上面的MEMORY部分主要分三个部分:存储器名 存储器起始地址 存储器长度;
该段定义与相应DSP芯片及硬件板卡(外部扩展存储部分)是密切相关的,大家可以查一下6455的手册的memory map部分,可以看到该部分
与上面的代码是一一对应的,上面定义的存储器名部分是用于SECTIONS后面段分配的。
接下来再说说SECTIONS部分,如下:
SECTIONS {
.vector > 0x00800000, RUN_START(_ISTP_START)
.text > L2RAM
.stack > L2RAM
.bss > L2RAM
.cio > L2RAM
.const > L2RAM
.data > L2RAM
.switch > L2RAM
.sysmem > L2RAM
.far > L2RAM
.args > L2RAM
.ppinfo > L2RAM
.ppdata > L2RAM
/* COFF sections */
.pinit > L2RAM
.cinit > L2RAM
}
上面这种是最简单的一种SECTIONS定义,这个SECTIONS部分的格式如下:
段名 > 存储器名
首先说一下什么是“section”,所谓的section是一个目标文件(*.obj)中的最小单元,它通常是占据一段连续存储空间的代码或数据,
<1>C文件(*.c及*.h);
<2>汇编文件(*.asm),注意有两种比较特殊的汇编文件,一种是中断向量表(vectors.asm-常见于不包含DSP/BIOS的程序中),
另一种是bootloader文件(该文件实现二级启动功能);
<3>库文件(*.lib、*.a、*.a64等),该类型文件是对源文件的一种封装,通常只提供API调用接口,不提供源码,既可以防止对
源文件的误修改,也可以起到保护知识产权的作用;
<4>dsp/bios(*.tcf),该文件见于使用DSP/BIOS中的工程中,是DSP/BIOS的配置文件,可以使用图形或文本方式进行DSP/BIOS的配置
<5>链接命令文件,该文件主要是定义存储器的物理空间(MEMORY)及程序段与物理空间的映射关系(SECTIONS);
这里先从CMD文件说起,首先说一下MEMORY部分,这里以TMS320C6455的一个实例进行讲解:
MEMORY {
L1PRAM: o = 0x00E00000 l = 0x00008000 /* 32kB L1 Program SRAM/CACHE */
L1DRAM: o = 0x00F00000 l = 0x00008000 /* 32kB L1 Data SRAM/CACHE */
L2RAM: o = 0x00800000 l = 0x00200000 /* 2MB L2 Internal SRAM */
EMIFA_CE2: o = 0xA0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
EMIFA_CE3: o = 0xB0000000 l = 0x00800000 /* 8MB EMIFA CE3 */
EMIFA_CE4: o = 0xC0000000 l = 0x00800000 /* 8MB EMIFA CE4 */
EMIFA_CE5: o = 0xD0000000 l = 0x00800000 /* 8MB EMIFA CE5 */
DDR2_CE0: o = 0xE0000000 l = 0x10000000 /* 256MB EMIFB CE0 */
}
上面的MEMORY部分主要分三个部分:存储器名 存储器起始地址 存储器长度;
该段定义与相应DSP芯片及硬件板卡(外部扩展存储部分)是密切相关的,大家可以查一下6455的手册的memory map部分,可以看到该部分
与上面的代码是一一对应的,上面定义的存储器名部分是用于SECTIONS后面段分配的。
接下来再说说SECTIONS部分,如下:
SECTIONS {
.vector > 0x00800000, RUN_START(_ISTP_START)
.text > L2RAM
.stack > L2RAM
.bss > L2RAM
.cio > L2RAM
.const > L2RAM
.data > L2RAM
.switch > L2RAM
.sysmem > L2RAM
.far > L2RAM
.args > L2RAM
.ppinfo > L2RAM
.ppdata > L2RAM
/* COFF sections */
.pinit > L2RAM
.cinit > L2RAM
}
上面这种是最简单的一种SECTIONS定义,这个SECTIONS部分的格式如下:
段名 > 存储器名
首先说一下什么是“section”,所谓的section是一个目标文件(*.obj)中的最小单元,它通常是占据一段连续存储空间的代码或数据,