您的当前位置:首页正文

FLASHH到RAM的程序说明

2020-10-18 来源:好走旅游网


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;

因篇幅问题不能全部显示,请点此查看更多更全内容