Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1634644
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2007-12-25 09:46:59

对于, 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的过程, 可以参考这个帖子,
 
=
 
主要的原因还是这个:

解决了 。

确实是地址设定的问题 , 问题已经解决了, 看这里:



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就正常了。


-------------
我总结了一条经验, 仿真器是个好东西, 但是有的时候, 仿真器毕竟不能模仿真实的一切,
所以还要自己调整。

阅读(4094) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~