首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

2440偶尔不能启动的原因——难道真的必须在bootloader阶段清零内存吗?解决方法

2012-02-21 
2440偶尔不能启动的原因——难道真的必须在bootloader阶段清零内存吗?我的2440机器偶尔会出现不能启动的现象

2440偶尔不能启动的原因——难道真的必须在bootloader阶段清零内存吗?
我的2440机器偶尔会出现不能启动的现象,并且每次都是挂在同一个地方,下面是启动信息

Windows CE Kernel for ARM (Thumb Enabled) Built on Feb 8 2007 at 23:36:51
ProcessorType=0920 Revision=0
sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 8c201344

Windows CE Firmware Init
INFO: Initializing system interrupts...
INFO: Initializing system clock(s)...
INFO: Initializing driver globals area...
---------------InitDisplay-----------------
SDMMC config set rGPGCON: ff214185
SDMMC config Init Done.
OEMInit Done...
Sp=ffffc7cc

  后来我发现别人的机器都有清零机器内存这一段,而我的没有,难道一定要在bootloader阶段清零内存吗?我加入这个部分,发现启动慢了不少,难道没有别的办法?
期待各位解答,谢谢。


[解决办法]
估计不是这个问题,内存断电就没有了。重新写过去的数据对现在是没有影响的!
[解决办法]
下面应该系统调用IOCTRL了,把所有的ioctrl打出了,看看调用哪个driver出的问题。。。
加载的过程向来是先flash(FMD)的,看看是不是FMD出问题了
[解决办法]
以前也遇到过,查了很多都说是内存清零!因为从起后内存中的数据并不是全部丢失了,所以它误认为是热启动,但是启动的数据也不对,所以就卡到那块了!许多BOOTLOADER都会在判断那块直接给内存清零,做过一个试验只有把串口,U口等带电的全拔了,才能重启后吧系统器起来,现在发现QQ的,和立宇态的BOOTLOADER都会在启动或是其他的下载前作此清零。
[解决办法]

探讨
引用:
估计不是这个问题,内存断电就没有了。重新写过去的数据对现在是没有影响的!


我看看6410是否是这样的。我也觉得是,明明内存掉电就什么都没有了的。怎么会呢?

[解决办法]
不清零重启有时候确实有问题。你可以试验一下,掉电10分钟后再上电看看能不能起来。
[解决办法]

结论如下:必须清,因为 Windows CE 不会在启动时自动设置 ZO 区域,导致全局变量可能不能正常初始化,如果机器断电时间不够长,内存可能没有完全停止工作。
[解决办法]
主要是 config.bib 文件里面定义的 RAM 区域,然后就是 Platform Builder 利用 pTOC 打包成 BIN 文件, 理论上来说,将代码复制到内存中运行的时候,必须将ZO段清零来初始化全局变量,但是 Kernel 没有做该工作,在 EBoot 的 Blcommon.c 的 BootloaderMain 函数中,调用的第一个函数就是完成改工作的,如果你有使用 Eboot 那么几乎就不会碰到这个问题,如果没有使用 EBoot, 你自己又不手动清,就会碰到该问题,清内存不需要全部清,只需要清 ZO 段就行了
[解决办法]
我以前也碰到这个问题,而我是用EBOOT的。曾经想用emulator跟踪死在哪儿了,由于emulator的介入会改变板子的状态,没有成功。clean boot和非clean boot的区别在于这个地方的流程不同:
if (fForceCleanBoot || (LogPtr->magic1 != LOG_MAGIC)) {
}
我的看法是(没法核实不一定对)刚掉电又起来的结果是LogPtr->magic1 == LOG_MAGIC,导致RAM section的配置没有做,但是有些配置因为掉电已经变了,所以在某个地方hang了。

热点排行