WinCE启动失败原因与解决办法(3)
在StartUp 函数初始化CPU等核心硬件并跳转到Main函数后,系统就会转入C语言代码执行环境。这时Main函数分为3个模块:BLCOMMON、Download Function、FLASH Function。其中BLCOMMON模块是由微软提供的,执行一些逻辑上的功能。而Download Function、FLASH Function中的函数与硬件平台息息相关。因此,对于每种硬件平台都要将函数的实现进行适当修改,这种修改是需要对硬件非常熟悉的。当修改出现错误时,就会导致系统启动失败了。
在硬件平台初始化完成后,oal.exe的启动任务基本完成,余下的启动工作由内核相关且独立于内核的OAL层实现体kernel.dll接管。也就是说,这时Startup会调用OALStartUp函数,OALStartUp函数主要完成将OEMAddressTable表传递给内核,然后调用KernelStart函数跳转到内核。因此,如果此时OAL的启动Startup函数调用失败的话,就也会导致系统的启动失败了。
这里需要特别注意的是,Bootloader和OAL中均包含启动Startup函数。它的功能大致相同,都是要初始化最小硬件环境。Bootloader的启动Startup函数是在为自己的执行准备硬件环境,OAL的启动Startup函数则是为kernel的执行准备硬件环境。由于这两种硬件环境要求基本相同,所以它们的代码也有很大部分可以相互借鉴。但应该明白Bootloader与OAL在物理上是独立的,它们并不是同一段代码。当然,如果可以确定这一部分在Bootloader已经初始化过如热启动,则在OAL中不必重复执行。
②OAL入口位置定位失误导致的失败
从上述WinCE启动流程可知,在OAL初始化硬件后而在内核启动前,系统是需要调用KernelStart函数来跳转到内核。因此,这里有一个要点,就是WinCE需要找到OAL的入口位置,然后才能调用入口函数与全局块进行指针交换,这样内核才能使用OAL层中的信息,同样OAL层也才能访问内核(kernel)导出的函数。
OAL入口位置函数的调用实际上是通过OEMGLOBAL结构体实现的,实际调用位置为OEMInitDebugSerial和OEMInit。也就是说,OEMGLOBAL结构体构建了内核和OAL层之间进行通信的桥梁。OEMGLOBAL结构体定义了OAL层所有必须的函数,该结构体在oemglobal.c文件中被初始化,并会被编译在OEMMain.lib和 OEMMain_StaticKITL.lib两个库中。如果OAL链接这两个库,则必须要有正确的该结构体的函数实现体,同时还需要调用ARMSetup来设置物理地址和非缓冲的虚拟内存地址的映像、arm中断向量以及内核模式所需要的堆栈、调用OEMInitDebugSerial函数初始化调试串口、调用OEMInit进行平台初始化等。否则,如果OAL入口位置函数有误,则内核和OAL层之间的访问就会失败,也就会导致系统在启动时出错和失败。
三、导致的WinCE启动失败的其它相关因素
(1)驱动程序加载错误导致的失败
在调试中,我们还发现系统在启动时执行到OEMInit时也经常会出现错误。一般来说,系统调用OEMInit运行完成之后,就会跳回Private或Public下的代码继续运行,然后再启动device.exe加载各个驱动程序。由于这一段代码是微软提供的default代码,基本上不会有问题。所以,我们就有理由怀疑如果加载的驱动程序出了问题,是也会造成系统启动失败的。一般来说,这些加载的驱动程序主要是 BSP中的Audio、Display、SDMMC、Serial、USB等。
(2)启动时加载配置有误的注册表导致的失败
在WinCE中注册表在启动过程中也扮演着非常重要的角色。与桌面Windows一样,WinCE注册表(Registry)也是一个系统数据库,用来保存应用程序、驱动程序、用户的设定以及其它一些系统的配置信息,通常还存储着操作系统运作和调用程序的状态信息。例如,每个用户的配置文件、安装的应用程序以及每个应用程序可以创建的文档类型、文件夹和应用程序图标的属性表设置、系统上存在哪些硬件以及正在使用哪些端口等。(责任编辑:admin)
- “扫一扫”关注融合网微信号
免责声明:我方仅为合法的第三方企业注册用户所发布的内容提供存储空间,融合网不对其发布的内容提供任何形式的保证:不保证内容满足您的要求,不保证融合网的服务不会中断。因网络状况、通讯线路、第三方网站或管理部门的要求等任何原因而导致您不能正常使用融合网,融合网不承担任何法律责任。
第三方企业注册用户在融合网发布的内容(包含但不限于融合网目前各产品功能里的内容)仅表明其第三方企业注册用户的立场和观点,并不代表融合网的立场或观点。相关各方及作者发布此信息的目的在于传播、分享更多信息,并不代表本网站的观点和立场,更与本站立场无关。相关各方及作者在我方平台上发表、发布的所有资料、言论等仅代表其作者个人观点,与本网站立场无关,不对您构成任何投资、交易等方面的建议。用户应基于自己的独立判断,自行决定并承担相应风险。
根据相关协议内容,第三方企业注册用户已知悉自身作为内容的发布者,需自行对所发表内容(如,字体、图片、文章内容等)负责,因所发表内容(如,字体、图片、文章内容等)等所引发的一切纠纷均由该内容的发布者(即,第三方企业注册用户)承担全部法律及连带责任。融合网不承担任何法律及连带责任。
第三方企业注册用户在融合网相关栏目上所发布的涉嫌侵犯他人知识产权或其他合法权益的内容(如,字体、图片、文章内容等),经相关版权方、权利方等提供初步证据,融合网有权先行予以删除,并保留移交司法机关查处的权利。参照相应司法机关的查处结果,融合网对于第三方企业用户所发布内容的处置具有最终决定权。
个人或单位如认为第三方企业注册用户在融合网上发布的内容(如,字体、图片、文章内容等)存在侵犯自身合法权益的,应准备好具有法律效应的证明材料,及时与融合网取得联系,以便融合网及时协调第三方企业注册用户并迅速做出相应处理工作。
融合网联系方式:(一)、电话:(010)57722280;(二)、电子邮箱:2029555353@qq.com dwrh@dwrh.net
对免责声明的解释、修改及更新权均属于融合网所有。