DSP

DSP2812 关于FLASH TO RAM

2019-07-13 11:05发布

ramfuncs: LOAD=FLASHD, PAGE=0
             RUN=RAML0,PAGE=0
       LOAD_START(_RamfuncsLoadStart),
             LOAD_END(_RamfuncsLoadEnd),
             RUN_START(_RamfuncsRunStart)

初始化FLASH时,会有这么一段CMD链接代码,其中,
RamfuncsLoadStart、RamfuncsLoadEnd、RamfuncsRunStart应该是定义成extern 全局变量,
但它们的赋值语句在哪啊!?或者说它们到底是多少?
请高手们不吝赐教!!   这个就是定义和赋值语句,extern只是个外部声明。真正的拷贝是用拷贝函数进行的        
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
可以去查看CCS的帮助文档
LOAD_START(sym)          Define sym with load-time start address of related allocation unit.   ramfuncs: 是一个段名,
LOAD=FLASH, PAGE=0
/*这句的意思是说,我在PAGE=0的FLASH中分出一段,名字叫ramfuncs。
我想用这个段来保存一些东西(在这里用来保存程序)。
RUN=RAML0,PAGE=0
/*这句的意思是说,当运行放在ramfuncs中的程序时,我想把这些程序搬到PAGE=0中的RAML0中再运行(因为在FLASH运行有点慢),
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart)
/*搬运的工作是由MemCopy完成,可是要告诉MemCopy,从哪里开始搬呢! 想一想,应该是从FLASH的起始地址开始搬(也就是_RamfuncsLoadStart等于FLASH的起始地址),要搬多少呢?当然是根据放在ramfuncs中的程序的长度,(也就是_RamfuncsLoadEnd等于_RamfuncsLoadStart+程序的长度,你放在ramfuncs中的东西越多,_RamfuncsLoadEnd越大,)。
要搬到什么地方呢?当然是RAML0的起始地址,(也就是_RamfuncsRunStart=RAML0的起始地址),

_RamfuncsLoadStart,
_RamfuncsLoadEnd,
_RamfuncsRunStart,
是由编译器生成的,

在CSS自带的例子,有一个叫FLASH的例子,可以用软件仿真一下,看看上面三个的值!
以上纯属个人理解,仅供参考   赵利国对于       ramfuncs: LOAD=FLASHD, PAGE=0 
             RUN=RAML0,PAGE=0 
           LOAD_START(_RamfuncsLoadStart), 
             LOAD_END(_RamfuncsLoadEnd), 
             RUN_START(_RamfuncsRunStart)的认识   首先、LOAD=FLASH是指,把ramfuncs这个段装载到FLASHD这个位置(即allocation). 其次、RUN=RAML0,PAGE=0表示ramfuncs这个段将在RAML0这个位置(即allocation)运行. LOAD_START(_RamfuncsLoadStart)首先表示定义了RamfuncsLoadStart这个变量, 其次LOAD_START又将装载(LOAD)ramfuncs这个段的区域(即FLASHD的一个区域)的开始(START)地址赋给了RamfuncsLoadStart;LOAD_END则将装载(LOAD)ramfuncs这个段的区域的结束地址赋给了RamfuncsLoadEnd。 而RUN_START,将ramfuncs这个段运行空间(即RAML0的一个区域)的首地址赋给了RamfuncsRunStart。从而才有了后面的. 在这里LOAD_START就决定要从FLASH 复制到RAM程序的首地址,而RUN_START决定了要复制到RAM中的运行的 目的首地址。从MemCopy()函数开始从FLASH装载区首地址将程序依次复制到运行区相应地址。   #pragma CODE_SECTION(epwm1_timer_isr, "ramfuncs"); #pragma CODE_SECTION(epwm2_timer_isr, "ramfuncs"); #pragma CODE_SECTION(epwm3_timer_isr, "ramfuncs");   MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);   其中 void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr) {     while(SourceAddr < SourceEndAddr)     {        *DestAddr++ = *SourceAddr++;     }     return; }