日期:2014-05-16  浏览次数:20582 次

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

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

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



希望有遇到过类似问题的朋友多多指教,弄了两天了,没什么头绪啊!

------解决方案--------------------
是否只要有printf调用,你的uboot都会死掉?
如果是,可能是printf相关的串口设置有问题。
------解决方案--------------------
以上情况,可能有几种可能的原因。第一:你的printf代码放在了串口初始化之前,应该还在之后;第二:没有初始化串口,printf在哪都不行。
------解决方案--------------------
楼上正解,printf最终通过串口打印出来的
------解决方案--------------------
有可能存在地址越界或者野指针,改写了代码段或者某个关键位置。加了printf可能刚好避开了这个修改。
如果把你加的造成问题的printf 换成别的代码会怎么样?
------解决方案--------------------
探讨

我的u-boot编译出来后都已经有250多K了,是不是太大造成了堆栈或内存越界的问题呢?

------解决方案--------------------
应该是内存越界了,也就是缓冲区溢出。
你可以做这样的测试:
将原来printf语句改成其他没用的语句,例如:n=1;i++之类的。
看看板子是否会挂掉。

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

如果不会挂掉,则很可能是你使用printf有问题,要么使用了空指针之类的东西,要么打印的目标内存地址不对,造成了系统的崩溃。
------解决方案--------------------
因为base是uint型的指针。
它每次加1相当于char型指针加4