一般会有两个CMD文件:DSP281x_Headers_nonBIOS.cmd 和F2812_EzDSP_RAM_lnk.cmd。第一个用于确定程序和数椐的装载运行空间,校验数据和程序代码的长度,定义输入/输出文件,安排系统中可用的存储器,程序段、数据段、堆栈以及复位向量和中断向量的地址空间。第二个链接命令文件通过段定位控制命令,分配程序代码空间、数据代码空间、程序运行空间、堆栈空间。
下面是例子:
DSP281x_Headers_nonBIOS.cmd
MEMORY
{
PAGE 0:
PAGE 1:
DEV_EMU : origin = 0x000880, length = 0x000180
...
SCIB : origin = 0x007750, length = 0x000010
MCBSPA : origin = 0x007800, length = 0x000040
CSM_PWL : origin = 0x3F7FF8, length = 0x000008
}
SECTIONS
{
PieVectTableFile : > PIE_VECT, PAGE = 1
DevEmuRegsFile : > DEV_EMU, PAGE = 1
FlashRegsFile : > FLASH_REGS, PAGE = 1
CsmRegsFile : > CSM, PAGE = 1
XintfRegsFile : > XINTF, PAGE = 1
CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1
PieCtrlRegsFile : > PIE_CTRL, PAGE = 1
SysCtrlRegsFile : > SYSTEM, PAGE = 1
SpiaRegsFile : > SPIA, PAGE = 1
SciaRegsFile : > SCIA, PAGE = 1
XIntruptRegsFile : > XINTRUPT, PAGE = 1
GpioMuxRegsFile : > GPIOMUX, PAGE = 1
GpioDataRegsFile : > GPIODAT PAGE = 1
AdcRegsFile : > ADC, PAGE = 1
EvaRegsFile : > EVA, PAGE = 1
EvbRegsFile : > EVB, PAGE = 1
ScibRegsFile : > SCIB, PAGE = 1
McbspaRegsFile : > MCBSPA, PAGE = 1
ECanaRegsFile : > ECANA, PAGE = 1
ECanaLAMRegsFile : > ECANA_LAM PAGE = 1
ECanaMboxesFile : > ECANA_MBOX PAGE = 1
ECanaMOTSRegsFile : > ECANA_MOTS PAGE = 1
ECanaMOTORegsFile : > ECANA_MOTO PAGE = 1
CsmPwlFile : > CSM_PWL, PAGE = 1
}
解释:
从page1可看出,从DEV_EMU到MCBSPA都位于外设帧0上(0x000800-ox000D00),而最后一个CSM_PWL显然要位于FLASH中的设置密码区域(0x3F7FF8-0X3F8000)。这样把数据可使用的空间定义出来了。
而在section中有这么一句 PieVectTableFile : > PIE_VECT, PAGE = 1 说明PieVectTableFile段位于PIE_VECT,从字面上可以看出,是把pie向量表存入PIE_VECT这块区域中。而PieVectTableFile段已在 DSP281x_GlobalVariableDefs.c 这个文件中的下面语句定义了:
#ifdef __cplusplus
#pragma DATA_SECTION("PieVectTableFile")
#else
#pragma DATA_SECTION(PieVectTable,"PieVectTableFile");
#endif
struct PIE_VECT_TABLE PieVectTable;
即通过pragma来对PieVectTable在PieVectTableFile中进行地址分配,而PieVectTable又是已定义过的结构体,其结构体标号为PIE_VECT_TABLE。这个结构体是在DSP281x_PieVect.h中定义。
下面说下DSP281x_PieVect.h。
这个文件无非是通过PINT来定义一些中断函数,而这些中断函数中可以放置中断程序的入口地址。通过DSP281x_PieVect.c
中的下面子程序进行初始化:
void InitPieVectTable(void)
{
int16 i;
Uint32 *Source = (void *) &PieVectTableInit;
Uint32 *Dest = (void *) &PieVectTable;
EALLOW;
for(i=0; i < 128; i++)
*Dest++ = *Source++;
EDIS;
// Enable the PIE Vector Table
PieCtrlRegs.PIECRTL.bit.ENPIE = 1;
}