|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
维护一个堆栈-(void)pushViewController:(UIViewController*)viewControlleranimated:(BOOL)animated是像堆栈里压一个UIViewController-(UIViewController*)popViewControllerAnimated:(BOOL)animated是从堆栈里弹出来一个UIViewController就算你的程序不是像联系人那样向右推进也可以用UINavigationController 近期,我所卖力的一个嵌进式开辟项目碰到了一点贫苦。这个嵌进式体系用的是ARM处置器+WinCE平台,我此次项目标目标是要把WinCE平台从旧版本移植到WinCE6.0平台上。但了局是这个WinCE体系在启动的时分常常会呈现失利,并且每次失利的缘故原由都莫明其妙和不尽不异。这使到我们开辟团队每一个人在启动WinCE体系时都心有余悸,十分忧虑体系又再一次呈现让人意想不到的失利。这类频仍的启动失利对开辟团队来讲明显是一种让人难以忍耐的熬煎。
为何会呈现这类情形呢?经由几个早晨夜以继日的加班剖析和研讨,本来主因是体系的引诱历程、内核加载历程、OAL启动历程和硬件驱动加载历程时都存在大概招致的失利的隐忧。本文经由过程对以上要素举行剖析,并提出响应的办理举措。但因为WinCE启动失利会十分取决于硬件平台,因而在详细使用时必要综合思索和剖析。
一.甚么是WinCE启动历程?
WinCE体系在启动时一样平常必要三个基础元素:引诱初始化、内核加载和OAL初始化等。它们的感化是要完成引诱历程的初始化和操纵体系实行情况的初始化。个中引诱初始化是由引诱工具BootLoader完成,次要是完成板级、片级的初始化。比方,经由过程设置存放器来完成硬件的初始化,如设置时钟、设置中止把持存放器、完成内存映照和初始化MMU的事情体例等。内核加载是指将操纵体系内核映像从只读存储器加载大概拷贝到体系的RAM中并实行。OAL(OEMAdaptionLayer,即原始设备打造商适配层)是位于操纵体系的内核与硬件之间的适配层,也是毗连体系内核与硬件的关键,它具有屏障硬件设备细节和笼统硬件功效的感化。而OAL初始化则是指经由过程一组函数来表现出0AL屏障和笼统硬件设备的感化。
别的,假如要WinCE体系成为完全的操纵体系,还得加上硬件驱动程序、硬件接口程序和使用程序组。因而,即便在一个复杂的嵌进式体系里,WinCE体系启动时是必要加载内核和加载很多组件或驱动程序。
如今让我们来看看WinCE体系在启动时挪用函数的按次:①CPU实行引诱向量,跳转到硬件初始化代码,即Startup函数。②在startup函数完成最小硬件情况初始化后跳转到KernelStart函数,来对内核举行初始化。③Kernelstart函数挪用OEMInitDebugSerial完成对换试串口的初始化;同时挪用0EMInit函数来完成硬件初始化事情和设置时钟、中止;最初,挪用OEMGetExtensionDRAM函数来判别是不是另有别的一块DRAM。至此,内核加载终了。因而可知,WinCE体系启动的重中之重是Startup函数的准确加载,假如这个Startup函数挪用失利,则会使到体系在启动频仍堕落。WinCE启动时挪用函数按次以下图所示:
<br> 因而,WinCE启动失利大概会存在于引诱初始化失利、内核加载失利、0AL函数初始化失利、驱动程序加载失利、组件加载失利和使用程序加载失利。也就是说,WinCE启动失利一方面多是在Startup函数的处置上,比方引诱初始化和OAL初始化。另外一方面还存在于驱动程序和组件自启动的失利上,比方基础的驱动程序、注册表设置或自运转的程序等。
就不克不及被利用。以是,当注册表在启动时加载毛病大概注册表设置有毛病时,也是会招致WinCE体系启动失利的。
二.招致WinCE启动失利的主因剖析
WindowsCE在启动时为何会失利呢?这个成绩也一向让我头痛。由于WindowsCE启动失利既有软件要素,也有硬件要素。比方,多是WinCE的启动引诱历程有成绩、大概是内核加载时有成绩、大概是OAL函数挪用的隐性成绩大概硬件设备自己的成绩酿成的。以是,办理起来对照贫苦和对照耗工夫,也是最使我们头疼的事变。
一样平常来讲,办理和剖析WinCE启动失利有一个准绳,就是"先软后硬"的准绳,也就是说要先剖析软件要素再到硬件要素。本文次要是在ARM微处置器和WindowsCE6.0平台长进行剖析软件要素酿成的失利。
(1)引诱程序BootLoader招致的失利
在WindowsCE体系中,全部体系的加载启动义务由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,它是WindowsCE二进制数据格局文件,不但包括了无效的程序代码,另有依照必定划定规矩到场的把持信息。
在体系启动时BootLoader能够经由过程两种分歧的体例来加载WinCE内核文件nk.bin。一种是下载形式,另外一种是当地启动形式。当地启动形式也称为自立形式,即BootLoader从方针机上的某个固态存储设备大将操纵体系加载到RAM中运转,全部历程并没有效户的参与。而下载形式则是方针机上的BootLoader将经由过程串口毗连或收集毗连等通讯手腕从主机(Host)下载文件。当BootLoader准确的把nk.bin解压到RAM后,就会把CPU把持权交给CE内核。因而,假如BootLoader处置不妥,便可能会形成加载息争压nk.bin文件的失利,如许天然也就会形成体系启动的失利了。
(2)OAL招致的启动失利
OAL(OEMAdaptationLayer)是指OEM适配层,它是位于WindowsCE内核和硬件之间的一层适配层,是OAL各个模块代码被编译后(.lib)和别的内核库链接到一同构成WindowsCE的内核可实行文档NK.EXE。OAL包含了和体系硬件通信的最底层代码,内核是经由过程OAL跟硬件举行交互。逻辑上,OAL是介于CE内核和设备硬件之间的一个代码层,是一个笼统的观点。物理上,OAL和别的一些库一同链接成可实行文件。
与之前的WinCE旧版本分歧的是,在WinCE6.0中内核(Kenerl)和OEM代码被分红oal.exe、kernel.dll和kitl.dll三个部分,个中启动代码(startup)和OAL层的完成部分不再与内核链接天生NK.exe,取而代之的是启动代码(startup)和硬件相干且自力于内核的OAL层的完成部分编译成oal.exe;而与内核相干且自力于硬件的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、DownloadFunction、FlashFunction。个中BLCOMMON模块是由微软供应的,实行一些逻辑上的功效。而DownloadFunction、FLASHFunction中的函数与硬件平台互相关注。因而,关于每种硬件平台都要将函数的完成举行得当修正,这类修正是必要对硬件十分熟习的。当修正呈现毛病时,就会招致体系启动失利了。
在硬件平台初始化完成后,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层之间的会见就会失利,也就会招致体系在启动时堕落和失利。
三.招致的启动失利的别的相干要素
(1)驱动程序加载毛病招致的失利
在调试中,我们还发明体系在启动时实行到OEMInit时也常常会呈现毛病。一样平常来讲,体系挪用OEMInit运转完成以后,就会跳回Private或Public下的代码持续运转,然后再启动device.exe加载各个驱动程序。因为这一段代码是微软供应的default代码,基础上不会有成绩。以是,我们就有来由嫌疑假如加载的驱动程序出了成绩,是也会形成体系启动失利的。一样平常来讲,这些加载的驱动程序次要是BSP中的Audio、Display、SDMMC、Serial、USB等。
(2)启动时加载设置有误的注册表招致的失利
在WinCE中注册表在启动过程当中也饰演着十分主要的脚色。与桌面Windows一样,WinCE注册表(Registry)也是一个体系数据库,用来保留使用程序、驱动程序、用户的设定和别的一些体系的设置信息,一般还存储着操纵体系运作和挪用程序的形态信息。比方,每一个用户的设置文件、安装的使用程序和每一个使用程序能够创立的文档范例、文件夹和使用程序图标的属性表设置、体系上存在哪些硬件和正在利用哪些端口等。
因而,关于硬件外设来讲注册表是一个纪录驱动程序设置和地位的数据库。当WinCE体系在启动时必要启动某些需要的硬件设备时,就会必要利用外设驱动程序。但假如在WinCE中这个外设驱动是自力于操纵体系的,WinCE体系就必要晓得从那里找到它们,比方文件名、版本号、别的设置和信息。因而,注册表上没有此设备的纪录时,它们就不克不及被利用。以是,当注册表在启动时加载毛病大概注册表设置有毛病时,也是会招致WinCE体系启动失利的。
除了在程序加载的时候把我的view加载到他上目前我还没用到过其他的苹果一直很推崇MVC的程序结构视图模型控制器简单说就是视图负责显示内容模型负责所有数据的保存结构或者一些其他数据操作控制器是用来协调视图和模型举车的发动机系统的例子 |
|