编译器产生可以重新定位的数据和代码模块称为段。
利用CCS进行DSP编程时,如果不指定变量的存储位置,那么编译器会自动给变量分配存储位置,但是,有些时候,需要将某个变量存放到某个特定的位置,这个时候就可以利用#pragma DATA_SECTION指令了
第一步,利用#pragma DATA_SECTION指令将变量xxxCmdBuf关联到SECTIONS“ramdata”;
#pragma DATA_SECTION(xxxCmdBuf,“ramdata”);
uint16_t xxxCmdBuf[4];
第二步,修改CMD文件使得“ramdata”映射到指定的地址空间。
MEMORY
{
PAGE 0 : /* Program Memory */
......
PAGE 1 : /* Data Memory */
......
RAML_XXXCMD : origin = 0x00BFF0, length = 0x000004
}
......
SECTIONS
{
......
ramdata : > RAML_XXXCMD, PAGE = 1
......
}
只需完成上述简单的两步就可以将某个变量指定到特定的位置。
TI 的技术文档《Programming TMS320x28xx and 28xxx Peripherals in C/C++》(SPRAA85D–November 2005–Revised January 2013)对该方法也有相应的描述
SECTIONS
{
/* Allocate program areas: */
......
ramfuncs : LOAD = FLASHD,
RUN = RAML0_1,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
上面代码中,
LOAD = FLASHD, //指定了要加载程序在Flash里的地址段
RUN = RAML0_1, //指定了在RAM里运行程序的RAM地址段
LOAD_START(_RamfuncsLoadStart), // 所要加载程序在Flash里的初始地址
LOAD_END(_RamfuncsLoadEnd), // 所要加载程序在Flash里的结束地址
RUN_START(_RamfuncsRunStart), // 程序运行的起始地址
#pragma 可将变量分配到数据段
如将变量SicaRegs分配到命为SIciaRegsFile的数据段。
# ifdef _cplusplus
# pragma DATA_SECTION("SciaRegsFile")
#else
# pragma DATA_SECTION(SciaRegs,"SciaRegsFile")
#endif
volatile struct SIC_REGS SciaRegs;
将外设寄存器变量分配到数据daunt。