免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 720 | 回复: 0
打印 上一主题 下一主题

【porting u-boot 之1】 env的设置和保存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-25 09:46 |只看该作者 |倒序浏览
对于, 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP