- 论坛徽章:
- 0
|
对于, env ,常用的命令就是 printenv ,savenv 了,
saveenv要保存到 nor flash里面去的,自然,nor flash写实要ok的。
env的初始化过程是这样的:
1,第一次从nor启动,nor 里面的env变量肯定是空,crc校验出错, 体现在env_init()
2,然后 env_ptr = default_environment ,当然这个default environment肯定是在SDRAM里面的。
3,然后用户就可以修改环境变量了, 这些都是保存在内存中的(SDRAM) ,这些是在env_relocate() 里面做的, 主要的目的就是把flash里面的环境变量copy到 SDRAM中去 ,当然第一次肯定是用default environmental了, 一旦写入flash , 以后启动都要从flash copy到 SDRAM里面 ,加快用户的读写速度。
4,用户执行saveenv() , 就从 SDRAM 里面写到 flash当中, 这有个前提, 就是 CFG_ENV_SIZE 必须是扇区大小对齐的,比如 我的nor flash sector size 是128k , 那么在include/configs/xx.h 定义 CFG_ENV_SIZE 就是 0x20000 (128k) ,
在进行调试的时候, 主要涉及的几个变量就是:
env_init() , env_relocate , CFG_ENV_SIZE, FLASH_SECTOR_SIZE , malloc
+++++++++++++
关于 调试 env的过程, 可以参考这个帖子,
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=job&Number=668016&page=0&view=collapsed&sb=5&o=&fpart=1#Post668743
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=668346&page=0&view=collapsed&sb=5&o=0&fpart
=
主要的原因还是这个:
解决了 。
确实是地址设定的问题 , 问题已经解决了, 看这里:http://www.linuxforum.net/forum/showflat.php?Cat=&Board=driver&Number=668357&page=0&view=collapsed&sb=5&o=31&fpart=
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就正常了。
-------------
我总结了一条经验, 仿真器是个好东西, 但是有的时候, 仿真器毕竟不能模仿真实的一切,
所以还要自己调整。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22617/showart_449524.html |
|