DSP 两个CMD文件讲解

来源:互联网 发布:大数据对营销的影响 编辑:程序博客网 时间:2024/05/31 15:18

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

                    

}

原创粉丝点击