AnsweredAssumed Answered

请问如何将程序拷贝到RAM中运行?

Question asked by MiKiJT Jiang on Apr 30, 2019
Latest reply on May 7, 2019 by Diana Batrlova

最近在写bootloadr ,程序能够通过上位机将APP下发到mcu中,但是在APP执行命令擦除FLASH时出现了死机;

单独调试APP程序的时候,执行擦除命令,PC跳转到0x00001 ;

我就在考虑是不是我的flash相关的程序有没有拷贝到RAM 中,之前的做法是就是在对应的函数前面加上:#pragma CODE_SEG DEFAULT_RAM

 

1.copydown sction是否实现了从flash到ram的拷贝?是否是在doCopyDown就已经实现了这个拷贝过程?

尝试过将函数前面加上#pragma CODE_SEG DEFAULT_RAM,能够发现法该函数的地址是在RAM中。带上我不太确定!

 

2.是否需要手动memcpy才能实现代码的拷贝?

参考某BootLoader例程中的关于代码拷贝的代码:

/*************************************************************************************/

#define __SEG_START_REF(a) __SEG_START_ ## a
#define __SEG_END_REF(a) __SEG_END_ ## a
#define __SEG_SIZE_REF(a) __SEG_SIZE_ ## a
#define __SEG_START_DEF(a) extern char __SEG_START_REF(a) []
#define __SEG_END_DEF(a) extern char __SEG_END_REF( a) []
#define __SEG_SIZE_DEF(a) extern char __SEG_SIZE_REF( a) []

__SEG_START_DEF(SHADOW_ROM);
__SEG_END_DEF(SHADOW_ROM);
__SEG_SIZE_DEF(SHADOW_ROM);

/*************************************************************************************/

static void CopyCodeToRAM(void)
{
/* Variable Declarations */
uchar *Src;
uchar *Dst;
uint SegSize;
uint x;
/* Begin Function CopyCodeToRAM() */
Src = (uchar *)__SEG_START_REF(SHADOW_ROM); /* RAM code resides in Flash from 0xf000 - 0xf1ff */
Dst = (uchar *)0x001000; /* copied to the upper 512 bytes of RAM */
SegSize = (uint)__SEG_SIZE_REF(SHADOW_ROM);
for (x = 0; x < SegSize; x++) /* just copy a byte at a time */
*Dst++ = *Src++;
}

但是在执行的时候发现,执行该局之后,对应的RAM并没有与源flash地址的内容相同,就是说拷贝过程失败。

 

请问那种方法是对的?或者别的方法?

 

3、如何确定程序已经被拷贝到RAM中?

Outcomes