打印

(TI MCU分享)map文件中地址重合的问题

[复制链接]
3881|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lightorang|  楼主 | 2011-8-5 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, MCU, AD, RAM, ST
本帖最后由 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__
这两个变量的确是指向了同一个内存地址,但是在操作上没有重合的地方,故这个地址重合的问题并没有任何问题。

相关帖子

沙发
永远的不知| | 2011-8-5 14:08 | 只看该作者
1# lightorang

楼主的程序设计考虑的真仔细,值得学习。

使用特权

评论回复
板凳
dsh_zhou| | 2011-8-24 17:58 | 只看该作者
if "while(SourceAddr <= SourceEndAddr)" ?

使用特权

评论回复
地板
cscis| | 2011-8-25 11:38 | 只看该作者
coming~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

20

帖子

1

粉丝