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;
}