Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150835
  • 博文数量: 28
  • 博客积分: 1476
  • 博客等级: 上尉
  • 技术积分: 356
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-11 11:39
文章分类
文章存档

2011年(1)

2010年(18)

2009年(9)

我的朋友

分类: 嵌入式

2010-07-16 18:41:43

 

 

正在改u-boot的代码,发现了奇怪的问题
1,步骤:我在代码中加入几条printf语句后,编译并烧写到板子上后,重启进入boot的命令行
  现象:在命令行下任意输入某个命令后板子就挂掉了,串口上没有任何显示
  修改:如果将新加入的这几行printf语句注释掉后,就恢复正常了

2,步骤:在函数内调用某个函数后,此函数中也有新加入的printf语句,编译并烧写到板子上后,重启进入boot的命令行
  现象:同上
  修改:将该函数注释掉后,恢复正常

问题已经解决,多谢木易大哥的提点,虽然没说到要害,但却启发了我,在第一阶段从onenand flash复制代码的时候,没有复制完全,原来的代码只复制了256K,而现在我的代码已经超过了256K,程序要是调用了这256K之后的代码,但内存中没有代码,那肯定就会造成楼上几位说的野指针。
代码如下:

void onenand_bl2_copy(void)
{
    int block, page;
    volatile uint *base = (uint *)0x57e00000;

    for (block = 0; block < 2; block++) {
        for (page = 0; page < 64: page++) {
            ONENAND_ReadPage_4burst(0, block, page, (uint *)base);
            base += (2048 / sizeof(uint));
        }
    }
}

推算如果1 page = 2K, 1 block = 64 pages, 那么这里只复制了256K,将以上代码中改为block < 3复制3block,编译下载之后,就一切OK了。
这里还有个疑问:
base += (2048 / sizeof(uint));这里为什么还要除以sizeof(uint)呢?除了之后base每次只增加512个字节,照这么算,不是只复制了64K吗?不知道是不是我想错了呢,有弄过onenand的朋友请解答下

因为base是uint型的指针。
它每次加1相当于char型指针加4

原贴请看我在CSDN上发的:

 


 

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