本帖最后由 lightorang 于 2011-8-5 12:06 编辑
1.问题
在application生成的map中,有时候会发现有两个内存变量
(_RamfuncsLoadEnd ___cinit__)地址重合
003f4530 _RamfuncsLoadEnd
003f4530 ___cinit__
003f4530 cinit
003f4530 地址对应的空间为.cinit段,存放的内容是全局变量的初始化值
.cinit 0 003f4530 00000194
003f4530 000000f4 main.obj (.cinit)
003f4624 0000004b aaa.obj (.cinit)
003f466f 0000002b bbb.obj (.cinit)
003f469a 0000000a rts2800_ml.lib : _lock.obj (.cinit)
003f46a4 0000000a : exit.obj (.cinit)
003f46ae 00000008 ISR.obj (.cinit)
003f46b6 00000004 ccc.obj (.cinit)
003f46ba 00000004 ddd.obj (.cinit)
003f46be 00000004 eee.obj (.cinit)
003f46c2 00000002 --HOLE-- [fill = 0]
2.分析
_RamfuncsLoadEnd是一个全局变量,来源于CMD文件
ramfuncs LOAD = FLASHD, PAGE = 0,
RUN = RAML0, PAGE = 1,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart)
LOAD_ START(_RamfuncsLoadStart)令编译器创建一个全局变量RamfuncsLoadStart,该变量指向段ramfuncs的装载地址的首地址
LOAD_ START(_RamfuncsLoadEnd)令编译器创建了一个全局变量RamfuncsLoadEnd,该变量指向段ramfuncs的装载地址的末地址
LOAD_ START(_RamfuncsRunStart)令编译器创建了一个全局变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首地址
调用这三个变量的函数为MemCopy
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
{
while(SourceAddr < SourceEndAddr)
{
*DestAddr++ = *SourceAddr++;
}
return;
}
RamfuncsLoadEnd作为SourceEndAddr被传送,memcpy拷贝的内存地址范围为
RamfuncsLoadStart~RamfuncsLoadEnd-1
所以RamfuncsLoadEnd地址对应的内存内容没有被MemCopy所拷贝,进而也没有被运行。
3.结论
003f4530 _RamfuncsLoadEnd
003f4530 ___cinit__
这两个变量的确是指向了同一个内存地址,但是在操作上没有重合的地方,故这个地址重合的问题并没有任何问题。
|