DSP

DSP 两个CMD文件讲解

2019-07-13 10:16发布

一般会有两个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;                      }