windowscehi8刷机模式无法读取取RAM怎么刷机

[转载]wince&6.0&启动过程
以S3C6410为例子,S3C6410的内部SRAM地址为0x0C00 0000 ~ 0x0C00
1FFF,DRAM的Base地址为0x
,S3C6410支持NAND,SD启动,S3C6410里面有固化的ROM,
当系统上电的时候,将执行固化ROM中的代码,然后检查硬件的GPIO配置,如果配置成NAND
启动,则把NAND的前8K读入内部的SRAM(stepping Stone)中,然后跳转到
Stepping Stone的开头,执行Bootloader1 (也就是下文的stepldr),
stepldr负责把eboot从NAND中搬到DRAM中,然后执行eboot( boot loader
2),eboot通过网络下载
NK.bin或者从NAND中把内核搬到DRAM中,然后执行WINCE内核.所以整个启动过程分为三阶段,stepldr
--&eboot --& wince kernel .
下面详细地分析各个阶段.
一 bootloader 1&
从stepldr的startup.s开始.startup.s主要是初始化硬件,中断,配置好C运行的环境,然后跳转到main函数中,执行C代码.
&& startuo.s 的流程是 :
startup --& Enable I cache --&关闭watchdog ,Interrupt dosable
-& 时钟初始化 --& 初始化DRAM控制器 --& 初始化IRQ,SVC stack
判断是否睡眠 ---N--& Clear DRAM --&main
&&&&&&&&&&&&&&&&&
--Y-& 跳到NK的开头 (也就是DRAM + 0x100000的地方)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&& main.c :
UART初始化 --& nand 初始化 -& 从NAND中把eboot搬到DRAM中 --&跳转到
eboot的开头
& 我们看代码有2个全局变量。
&& ROMHDR * volatile const pTOC =
(ROMHDR *)-1; 这个在ROMImage里面会赋值。
&& static BOOL g_bLargeBlock =
FALSE; // For Large Block Check
&& 这两个全局变量的位置为:500F0000
根据stepldr.bib
二 bootloader 2& eboot&
& startup.s&
&& startup
--&& Enable I cache --&关闭watchdog ,Interrupt
dosable -& 时钟初始化 --& Disable VIC --& enable 中断 --&CLEAR
DRAM(从1M到128M地址的DRAM,因为低1M地址
&& 空间目前放的是eboot ) --& 初始化MMU
(根据g_oalAddressTable,把DRAM的Base地址0x映射到0x,此后地址都用虚拟地址)
--& 初始化IRQ,SVC stack --&
&&& main --&
BootloaderMain&
& BootloaderMain的流程:
& KernelRelocate
--&OEMDebugInit(初始化串口,这样就可以打印信息了) --&OEMPlatformInit
--&OEMPreDownload --&DownloadImage--&OEMLaunch
(切换到ce内核了)
& OEMPlatformInit :
InitializeDisplay --& 初始化中断 --&NAND Flash驱动 初始化 --&
MainMenu (一些选项,比如设置IP) --&ethernet 驱动初始化
& OEMPreDownload : get IP , initialize
& DownloadImage :
先用OEMReadData读7位头,然后根据这7位判断是bin 还是 nb0 等
&& 假如是bin , 调用 DownloadBin
三 wince OS
& wince os
的启动我们也可以换分为2个阶段,第一个阶段,初始化OAL,一直到FirstSchedule开始调度,第二阶段,开始对文件系统,注册表,driver的
& 初始化和加载。
(1)初始化 OAL&
1.startup.s
&&& 初始化一些硬件外设
--& KernelStart
2.KernelStart
在PRIVATEWINCEOSCOREOSNKLDRARMarmstart.s中
&& 根据OALAddress Table初始化页表 ,
打开MMU和初始化Cache和中断向量
初始化stack&
&& 调用ArmInit
r0, =KData
r12&&&&&&&&&&&&&&&&&&&&&&&&&
; jump to entry of kernel.dll
在PRIVATEWINCEOSCOREOSNKLDRARMarminit.c中
&& LPVOID ARMInit (struct
KDataStruct *pKData)&
KernelRelocate (pTOC);
pKData-&dwTOCAddr&&&&
= (DWORD) pTOC;
pKData-&dwOEMInitGlobalsAddr = (DWORD) OEMInitG
SetOsAxsDataBlockPointer(pKData);
&&& return
FindKernelEntry (pTOC);
&主要是内核重定位 .返回kernel.dll的入口位置.
& 在上面的KernelStart函数中,mov pc,
r12指令跳转到kernel.dll的入口位置.
4 FindKernelEntry找到NKStartup
在PRIVATEWINCEOSCOREOSNKKERNELARMmdarm.c中&
&& 调用 ARMSetup
(PRIVATEWINCEOSCOREOSNKKERNELARMmdarm.c)to perform addition
setup for CPU (vector table, 1st-level PT mappings, etc)
&& 调用OEMInitDebugSerial
5&& OEMInit
在PLATFORMSMDK6410SRCOALOALLIBinit.c中
OALCacheGlobalsInit();
OALArgsInit((BSP_ARGS *)IMAGE_SHARE_ARGS_UA_START);// Check and
Initialize the BSP Args area
if (!OALIntrInit())// Initialize Interrupts
OALMSG(OAL_ERROR, (L"[OAL:ERR] OEMInit() : failed to initialize
interruptsn"));
OALTimerInit(RESCHED_PERIOD, (OEM_COUNT_1MS ), 0);// Initialize
System Clock
KITLIoctl(IOCTL_KITL_STARTUP, NULL, 0, NULL, 0,
NULL);& // Initialize the KITL connection if
6、KernelSstart函数:
这里的KernelStart函数与前面的KernelStart函数的属于两个完全不同的函数,NKStartup函数中调用的KernelStart
$(_PRIVATEROOT)WINCEOSCOREOSNKKERNELARMarmtrap.s文件中的KernelStart
主要完成调用内核初始化函数KernelInit,并跳转到操作系统的第一个启动的任务。
LEAF_ENTRY KernelStart
&&& ldr r4,
=KD (r4) = ptr to KDataStruct
&&& ldr r0,
&&& str r0, [r4,
#pAPIReturn] ; set API return address
&&& mov r1,
#SVC_MODE&
&&& msr cpsr_c,
r1 ; switch to Supervisor Mode w/IRQs enabled
KernelI initialize scheduler, etc.
&&& mov r0, #0 ;
no current thread
&&& mov r1,
#ID_RESCHEDULE
FirstSchedule
7、KernelInit函数:
&&& Windows CE
6.0的内核初始化函数同其他版本的内核初始化函数基本相近,主要完成在启动第一个线程前对内核进行初始化,主要包括API函数集初始化、堆的初始化、初始化内存池、进程初始化、线程初始化和文件映射初始化等操作。
void KernelInit (void)&
#ifdef DEBUG&
g_pNKGlobal-&pfnWriteDebugString (TEXT("Windows CE
KernelInitrn"));
&&& APICallInit
();// setup API set
&&& HeapInit
();// setup kernel heap
InitMemoryPool ();// setup physical memory
&&& PROCInit
();// initialize process
&&& VMInit
(g_pprcNK);// setup VM for kernel
&&& THRDInit
();// initialize threadsv
&&& MapfileInit
#ifdef DEBUG&
g_pNKGlobal-&pfnWriteDebugString (TEXT("Scheduling the first
thread.rn"));
8、FirstSchedule:
FirstSchedule函数为Windows CE操作系统启动过程中最后无条件跳转的一个函数,windows
CE进行第一个调度,实际为一个空闲线程,因为windows CE系统还没有完成启动,只有当windows
CE完全启动并进入稳定状态,然后启动文件系统filesys.dll,设备管理device.dll,窗体图像子系统gews.dll和shell程序
explore.exe。
(2)系统的其它部分初始化
FirstSchedule --〉SystemStartupFunc
而在SystemStartupFunc中,会创立一个内核线程
&& CreateKernelThread
(RunApps,0,THREAD_RT_PRIORITY_NORMAL,0)&
&& 这样就执行线程的函数RunApps
在RunApps中,NKLoadLibraryEx (L"filesys.dll", MAKELONG
(LOAD_LIBRARY_IN_KERNEL, LLIB_NO_PAGING),
进行filesys.dll的加载,
然后启动一个线程,执行filesys.dll的 WinMain
等待filesys.dll 的event SYSTEM/FSReady
收到后:&&
&&&&&&&&&&&
InitMUILanguages();// Initialize MUI-Resource loader (requires
&&&&&&&&&&&
InitSystemSettings (); // Read system settings from
我们再来看看 FILESYS.DLL 。它相当于Windows
CE以前版本中的FILESYS.EXE,负责初始化文件系统、对象存储、注册表、CEDB数据库、设备通知以及其它一些工作。
1& Filesys.dll 检测是冷启动还是热启动
如果是冷启动,对象存储内存将被初始化并映射给Filesys.dll.对于热启动,不用初始化而直接映射给Filesys.dll
2 Filesys.dll 从ROM中加载 OEM的 Certification DLL .
3 对于热启动,如果系统必须冷启动, Filesys.dll调用OAL函数pNotifyForceCleanboot.
4 对于冷启动, Filesys.dll
初始化RTC,通过调用OEMIoControl函数,控制号为IOCTL_HAL_INIT_RTC I/O.
5 Filesys.dll 按照顺序初始化下列APIs:
&& Database APIs
&& File system APIs
&& Point-to-point message queue
&& Event log APIs
&& Registry
对于冷启动, Filesys.dll初始化注册表数据.数据初始化过程取决于是hive注册表还是RAM注册表.
如果在注册表里指定了缺省的用户Profile, Filesys.dll加载缺省用户的profile并初始化
HKEY_CURRENT_USER下的数据.
6 如果Device.dll 没有启动并且HKEY_LOCAL_MACHINESystemStorageManager
指向一个可以加载的DLL, Filesys.dll加载存储管理器.
& 如果存储管理器加载了, Filesys.dll创建一个线程来初始化它.
7 Filesys.dll 初始化NLS数据(national language support).
对于一个干净的启动,Filesys.dll查阅Initobj.dat文件,然后从ROM中拷贝这些文件到根文件系统.
& 比如Initobj.dat内容为:
& root:-Directory("Program Files")
& root:-Directory("My Documents")
Directory("Windows"):-Directory("Desktop")
Directory("Windows"):-Directory("Programs")
Directory("Windows"):-Directory("Recent")
& Directory("WindowsDesktop"):-File("Media
Player.lnk", "Windowsceplayer.lnk")
& Directory("WindowsPrograms"):-File("Media
Player.lnk", "Windowsceplayer.lnk")
Directory("WindowsDesktop"):-File("Messenger.lnk",
"Windowsmsmsgs.lnk")
Directory("WindowsPrograms"):-File("Messenger.lnk",
"Windowsmsmsgs.lnk")
& 它的意思是:&
先用root命令在根目录下面建立2个文件夹,分别叫Program Files和My Documents.
然后在Windows下面建立3个文件夹Desktop,Program,Recent
&& 最后把Media
Player的链接ceplayer.lnk,msmsgs.lnk拷贝到windowsDesktop,Programs目录下,命名为Media
Player.lnk,Messenger.lnk.&
9 如果需要的话,Filesys.dll初始化时区并设置夏令时 (daylight saving time
10 对于冷启动, Filesys.dll为用数据库引擎设置区域,对于EDB数据库,通过调用CeChangeDatabaseLCID
(EDB)而对于CEDB数据库调用CeChangeDatabaseLCID (CEDB).
此外,对于冷启动,Filesys.dll从Initdb.ini文件中加载数据来填充对象存储数据库.
11 Filesys.dll告诉kernel:Filesys.dll已经好了.
Filesys.dll然后等待kernel通知去启动OS的其他部分.
12 Filesys.dll根据HKEY_LOCAL_MACHINESystemEvents注册表创建命名的事件.
这些事件被拥有他们的进程设置.
13 Filesys.dll 启动HKEY_LOCAL_MACHINEInit所列的应用
如果Device.dll在HKEY_LOCAL_MACHINEInit中,而它又已经被启动,Filesys.dll会去打开SYSTEM/BOOTPHASE2事件,并会向Device.dll发信号。
该动作使得Device.dll会去重读注册表,并完成最后阶段的驱动初始化。任何驱动都可以去等待该同样的事件,这样驱动就可以去再读一次注册表。
在正常的启动过程中,Filesys.dll建立了一些文件并把他们存储在user storage中. 这些文件将占用 1.8
MB的可用的user storage.
下列文件在启动过程中被创建:
System.hv&&&
Documents and
Settingssystem.hv&&&&&&&&&
系统注册表hive文件&
User.hv&&&&&&
Documents and
Settingsdefaultuser.hv&& 345
缺省用户的用户注册表hive文件
对于filesys.dll启动过程,参见&
再来看Device.dll,它被加载后,将读取
HKLMDriversBuildIn下面的信息,然后一个一个驱动被加载,加载后相应地在
HKLMDriversActive下面创立相应的键.
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。  CE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,Windows CE的图形用户界面相当出色。
  Windows CE作业系统是Windows家族中最新的成员,专门设计给掌上型电脑(HPCs)所使用的电脑环境。这样的作业系统可使完整的可携式技术与现有的Windows桌面技术整合工作。Windows CE 被设计成针对小型设备(它是典型的拥有有限内存的无磁盘系统)的通用操作系统,Windows CE 可以通过设计一层位于内核和硬件之间代码来用设定硬件平台,这即是众所周知的硬件抽象层(HAL)。不象其它的微软 Windows 操作系统,Windows CE 并不是代表一个标准的相同的对所有平台适用的软件。为了足够灵活以达到适应广泛产品需求, Windows CE 采用标准模式,这就意味着,它能够由一系列软件模式做出选择,从而使产品定制。另外,一些可利用模式也可作为其组成部分,这意味着这些模式能够通过从一套可利用的组份做出选择,从而成为标准模式,通过选择,能够达到系统要求的最小模式, OEM 能够减少存储脚本和操作系统的运行。
  Windows CE中的C代表袖珍(Comt)、消费(CONsumer)、通信能力(Connectivity)和伴侣(Companion);E代表电子产品(Eleons)。与Windows 95/98、Windows NT不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于Windows 95/98,但Windows CE是基于WIN32 API重新开发、新型的信息设备的平台。Windows CE具有模块化、结构化和基于Win32应用程序接口和与处理器无关等特点。Windows CE不仅继承了传统的Windows图形界面,并且在Windows CE平台上可以使用Windows 95/98上的编程工具(如Visual Basic、Visual C++等)、使用同样的函数、使用同样的界面风格,使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。Windows CE并非是专为单一装置设计的,所以微软为旗下采用Windows CE作业系统的产品大致分为三条产品线,Pocket PC(掌上电脑)、Handh PC(手持设备)及Auto PC.
  我们的嵌入式系统用的是ARM处理器+WinCE平台,目的是要把WinCE平台从旧版本移植到WinCE6.0平台上。但结果是这个WinCE系统在启动的时候经常会出现失败,而且每次失败的原因都莫明其妙和不尽相同。
  为什么会出现这种情况呢?经过分析和研究,原来主因是系统的引导过程、内核加载过程、OAL启动过程和硬件驱动加载过程时都存在可能导致的失败的隐忧。本文通过对以上因素进行分析,并提出相应的解决办法。但由于WinCE启动失败会非常取决于硬件平台,因此在具体应用时需要综合考虑和分析。
  一 什么是WinCE启动过程?
  WinCE系统在启动时一般需要三个基本元素:引导初始化、内核加载和OAL初始化等。它们的作用是要完成引导过程的初始化和操作系统执行环境的初始化。其中引导初始化是由引导工具BootLoader完成,主要是完成板级、片级的初始化。例如,通过设置寄存器来完成硬件的初始化,如设置时钟、设置中断控制寄存器、完成内存映射和初始化MMU的工作方式等。内核加载是指将操作系统内核映像从只读加载或者拷贝到系统的RAM中并执行。OAL是位于操作系统的内核与硬件之间的适配层,也是连接系统内核与硬件的枢纽,它具有屏蔽硬件设备细节以及抽象硬件功能的作用。而OAL初始化则是指通过一组函数来体现出0AL屏蔽和抽象硬件设备的作用。
  此外,如果要WinCE系统成为完整的操作系统,还得加上硬件驱动程序、硬件接口程序和应用程序组。因此,即使在一个简单的嵌入式系统里,WinCE系统启动时是需要加载内核和加载许多组件或驱动程序。
  WinCE系统在启动时调用函数的顺序:①CPU执行引导向量,跳转到硬件初始化代码,即STartup函数。②在start up函数完成最小硬件环境初始化后跳转到KernelStart函数,来对内核进行初始化。③Kernelstart函数调用OnitDebugSerial完成对调试串口的初始化;同时调用0EMInit函数来完成硬件初始化工作以及设置时钟、中断;最后,调用OEMGetextensionDRAM函数来判断是否还有另外一块DRAM.至此,内核加载完毕。由此可见,WinCE系统启动的重中之重是Startup函数的正确加载,如果这个Startup函数调用失败,则会使到系统在启动频繁出错。WinCE启动时调用函数顺序如下图所示:
  WinCE启动失败可能会存在于引导初始化失败、内核加载失败、0AL函数初始化失败、驱动程序加载失败、组件加载失败和应用程序加载失败。也就是说,WinCE启动失败一方面可能是在Startup函数的处理上,例如引导初始化和OAL初始化。另一方面还存在于驱动程序和组件自启动的失败上,例如基本的驱动程序、注册表配置或自运行的程序等。就不能被使用。所以,当注册表在启动时加载错误或者注册表配置有错误时,也是会导致WinCE系统启动失败的。
  二 导致WinCE启动失败的主因分析
  Windows CE在启动时为什么会失败呢?这个问题也一直让我头痛。因为Windows CE启动失败既有软件因素,也有硬件因素。例如,可能是WinCE的启动引导过程有问题、也许是内核加载时有问题、也许是OAL函数调用的隐性问题或者硬件设备本身的问题造成的。所以,解决起来比较麻烦和比较耗时间,也是最让我们头疼的事情。
  一般来说,解决和分析WinCE启动失败有一个原则,就是"先软后硬"的原则,也就是说要先分析软件因素再到硬件因素。本文主要是在arm和Windows CE 6.0平台上进行分析软件因素造成的失败。
  (1)引导程序BootLoader导致的失败
  在Windows CE系统中,整个系统的加载启动任务由BootLoader来完成,BootLoader是在WinCE内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图和初始化MMU等。从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。因此,只有在引导程序正确的完成自己的任务后,才会将控制权移交给内核。
  在WinCE平台上,引导装载程序是在硬件上执行的第一段代码,通常将引导程序放置在不易丢失的存储器的开始地址或者是系统冷启动时PC寄存器的初始值。如果这段小程序代码编写错误,则系统无法完成第一步的引导操作,这是导致启动系统失败的第一个因素。
  ①BootLoader初始化硬件失败
  BootLoader第一个功能是要实现板级和片级初始化硬件,主要是把CPU初始化到一已知状态。在BootLoader目录下,会发现一些。s文件,可能会是init.s或者是reset.s等,这样的文件是CPU加电后最先执行的代码。StartUp 函数是BootLoader的入口函数。该函数一般是使用汇编语言编写,与CPU关系非常紧密,能完成初始化CPU、内存等核心硬件。然后,BootLoader在平台初始化完毕后就可以在不用人工干预的情况下自动加载WinCE内核了。但如果BootLoader在初始化硬件时失败,就会直接导致系统的启动失败了。
  ②BootLoader加载内核时失败
  一般在平台调试完毕后,BootLoader就会加载WinCE内核映像,这也是BootLoader的功能之一。WinCE内核映像文件通常叫做nk.bin,它是Windows CE数据格式文件,不仅包含了有效的程序代码,还有按照一定规则加入的控制信息。
  在系统启动时BootLoader可以通过两种不同的方式来加载WinCE内核文件nk.bin.一种是下载模式,另一种是本地启动模式。本地启动模式也称为自主模式,即 BootLoader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。而下载模式则是目标机上的 BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件。当BootLoader正确的把nk.bin解压到RAM后,就会把CPU控制权交给CE内核。因此,如果Boot Loader处理不当,就可能会造成加载和解压nk.bin文件的失败,这样自然也就会造成系统启动的失败了。
  (2)OAL导致的启动失败
  OAL(OEM Adaptation Layer)是指OEM 适配层,它是位于Windows CE内核和硬件之间的一层适配层,是OAL各个模块代码被编译后(。lib)和其它内核库链接到一起形成Windows CE的内核可执行文档NK.EXE.OAL包括了和系统硬件通讯的最底层代码,内核是通过OAL跟硬件进行交互。逻辑上,OAL是介于CE内核和设备硬件之间的一个代码层,是一个抽象的概念。物理上,OAL和其它一些库一起链接成可执行文件。
  与以前的Win CE旧版本不同的是,在Win CE 6.0中内核(Kenerl)和OEM代码被分成oal.exe、kernel.dll和kitl.dll三个部分,其中启动代码(startup)和 OAL层的实现部分不再与内核链接生成NK.exe,取而代之的是启动代码(startup)和硬件相关且独立于内核的OAL层的实现部分编译成 oal.而与内核相关且独立于硬件的OAL层代码包含在kernel.dll中,内核无关传输层(KITL)的支持代码从OAL层分离出来编译成 kitl.dll.因此,WinCE6.0的启动只与oal.exe和kernel.dll有关。至于kitl.dll,只有将操作系统编译成具有 KITL功能时才用到。这样做的好处是可以单独升级OAL,但整体的OAL结构并没有改变。
  ①OAL初始化硬件时失败
  oal.exe是通过Startup函数来完成硬件的初始化。一般来说,OAL的启动代码(Startup.s)与该硬件平台的Bootloader的启动代码(Startup.s)是可以共享的。例如,其中PreInit 函数主要完成将arm处理器工作模式切换到管理员模式,同时关闭MMU,并检测系统启动原因。如果是热启动,即在该函数调用之前已经启动过 Bootloader的启动代码(Startup.s),相当基本硬件初始化已经完成,则可直接跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟、管理等硬件的基本初始化过程。
  在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)启动时加载配置有误的注册表导致的失败
  与桌面Windows一样,WinCE注册表(Registry)也是一个系统数据库,用来保存应用程序、驱动程序、用户的设定以及其它一些系统的配置信息,通常还存储着操作系统运作和调用程序的状态信息。例如,每个用户的配置文件、安装的应用程序以及每个应用程序可以创建的文档类型、文件夹和应用程序图标的属性表设置、系统上存在哪些硬件以及正在使用哪些端口等。
  对于硬件外设来说注册表是一个记录驱动程序设置和位置的数据库。当WinCE系统在启动时需要启动某些必要的硬件设备时,就会需要使用外设驱动程序。但如果在WinCE中这个外设驱动是独立于操作系统的,WinCE系统就需要知道从哪里找到它们,例如文件名、版本号、其它设置和信息。因此,注册表上没有此设备的记录时,它们就不能被使用。所以,当注册表在启动时加载错误或者注册表配置有错误时,也是会导致WinCE系统启动失败的。
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670&}

我要回帖

更多关于 hi8刷机模式无法读取 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信