在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。
全部博文(197)
分类: LINUX
2007-12-25 09:46:59
解决了 。
确实是地址设定的问题 , 问题已经解决了, 看这里:
malloc 返回 0 , 就是 内存太小了, 导致无法分配更多的内存。
我的memory是这样的:
0x3000 0000 SRAM0 (64k)
0x3001 0000 SRAM1 (64k)
0x3002 0000 SRAM2 (64k)
0x3003 0000 SRAM3 (64k)
.....
0x6000 0000 SDRAM(16MB)
------------------
从上面看的话, SRAM总共才256KB , SDRAM 16MB
而我们是上仿真器的, 因为一开始 代码要下到一个memory 执行,
而此时SDRAM肯定还没有初始化, 因此 ,只好选 SRAM1的地址作为下载地址, SRAM0
存放其他的内容,比如 CFG_MALLOC_LEN , gd ,还有 各种模式的堆栈等。
而在代码中:
void env_relocate (void)
{
DEBUGF ("%s[%d] offset = 0x%lx , no modify : env_ptr addr=%p\n",__FUNCTION__,__LINE__,
gd->reloc_off,env_ptr);
env_ptr = (env_t *)malloc (CFG_ENV_SIZE);
DEBUGF ("%s[%d] malloced ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
而这里 CFG_ENV_SIZE 我定义的是 128k ,( 因为 nor flash的 扇区大小刚好是 128k) ,
而CFG_MALLOC_LEN 我又恰好根据SRAM 大小调整了 ,
include/configs/xx.h
/*------------------------------
* Size of malloc() pool
*-----------------------------*/
#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024) //use for SDRAM(64M)
//#define CFG_MALLOC_LEN 0xa000 //temp modify to fit for SRAM --bob
这样的话, malloc 就有可能失败了, 因为SRAM实在太少了。 ]
当以上配置都采用正常值的时候, 直接把 u-boot 烧写到 nor 里面去 执行 , config.mk
里面配置的 TEXT_BASE也改为 SDRAM的相应地址(我是 0x63f80000) , malloc就正常了。
-------------
我总结了一条经验, 仿真器是个好东西, 但是有的时候, 仿真器毕竟不能模仿真实的一切,
所以还要自己调整。