毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

加入几条printf语句后,编译并烧写到板子上后在命令行下任意输入某个命令后板子就挂掉了

更新时间:2012-5-22:  来源:毕业论文

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

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

排除硬件问题,因为已经试过几块板子,都有这问题;会不会是堆栈或内存之类的问题呢?
总结:推断应该是板子出现异常,但是在挂掉板子前,底层没有打印任意信息,在加上手头上也没有仿真器,不能对问题进行定位,现在很是纠结。
 

是否只要有printf调用,你的uboot都会死掉?
如果是,可能是printf相关的串口设置有问题。
应该是内存越界了,也就是缓冲区溢出。
你可以做这样的测试:
将原来printf语句改成其他没用的语句,例如:n=1;i++之类的。
看看板子是否会挂掉。

如果同样会挂掉,则可能的问题如下:
1、代码的其他部分有内存溢出之类的Bug,你添加了这些指令后,使得某处内存正好溢出。(这样的问题比较难排查。)排除的方法比较简单:在程序其他任意地方(最好是不同的函数层次中)加入这样的没用的语句,如果每次加入哪怕一条语句都会挂掉的话,就可以基本排除是内存溢出。
2、硬件设计可能有bug(指内存模块的设计,也许地址线什么的连错了)。

如果不会挂掉,则很可能是你使用printf有问题,要么使用了空指针之类的东西,要么打印的目标内存地址不对,造成了系统的崩溃。 
,在第一阶段从onenand flash复制代码的时候,没有复制完全,原来的代码只复制了256K,而现在我的代码已经超过了256K,程序要是调用了这256K之后的代码,但内存中没有代码,那肯定就会造成楼上几位说的野指针。
代码如下:

C/C++ code
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的朋友请解答下

6410果然好用啊,连从nand复制的代码都已经固化了,也省得像2440那样,还要自己写nand的初始化代码。记得原来弄U-BOOT的时候,这段代码还是从vivi上复制过来的,不错啊。以后要搞U-BOOT的朋友这个问题一定要注意啊,一定要看看编译之后的二进制文件大小是否小于等于从nand上复制过来的大小。

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。