浅谈WinCE快速启动的几种方法

     前两天做了个WinCE的微内核,8MB,不到2s就启动起来了。但在实际项目中,最终的映像一般都高达好几十M,将如此大坨的映像从非易失性的存储器中搬运到内存,就需要2s多,那么一个功能完善的WinCE系统,最快多久能启动起来呢。希望是3s,这可能吗?加速WinCE的启动,又有几种可行的方法?

     采用更强劲的硬件平台肯定是行之有效的方法。但种种因素会导致实际情况中,这个最简便的方法往往最不可能实施。在特定的硬件平台下,提高系统的工作频率也会有所改善。但这也面临着系统功耗增加和系统稳定性降低等一系列问题。一般情况下,MCU的工作频率都略低于它的标称值。在项目方案基本确定的情况下,改动硬件是不太现实的,只有从软件的角度挖掘潜力。下面从软件的角度描述一些可行的方法。

      优化BOOT,提高BOOT运行时的工作频率。在一些平台上BOOT启动时,MCU并没有全速运行。这是可以尝试的一种方法,并能提高读取内核映像的速度。但如果BOOT已经全速运行,那可以看看是否可以再精简一些,总之是想尽一切办法,让它以最快的速度启动并加载内核到内存,然后将控制权交给内核。另外,在一些系统中会增加启动进度显示。如果要实现快速启动,并且系统能在5s内起来,进度条可以省了,因为本身它也会占用一定的时间。

     缩小NK,这是最关键也是最有效的一个方向。具体实施有两个考虑,首先是精简系统,既然WinCE是可定制的操作系统,就要用好这个特性,只在系统中添加必要的组件,项目应用无须的一概去掉。WinCE系统中一般占用空间较大的有标准Shell(大概6M多)、字体(有大有小)、IE浏览器、.NET CF等。这些都是大户,需要重点关注。能不放在NK中,就绝不留下。尤其是字体,完全可以单独加载。最近改造了一下WinCE6.0下的触摸屏校准程序,实现了动态修改触摸屏校准程序的界面以支持多国语言提示。实验证明,字体确实没必要放在NK中,而且能节省好几M的内存。从这个角度实现时,需要考虑如何确定哪些组件可以不放在NK.bin中,而哪些是必须的。不放在NK.bin中的文件,以什么方式存入到设备上。另外一个考虑就是实现MULTIBIN了,将整个WinCE内核切割中几分,CE启动时只加载一个最小的NK.bin,更多的文件放在EXT.bin中。这个方法曾在WinCE5.0下用过,效果相当好。2410上20多M的操作系统,分割成的NK.bin大概1M多,从复位到启动完成,大概5s,并且节省了的宝贵内存,64M的物理内存,可供WinCE使用的有60M左右,省了20M左右的内存。这个方法显然能一举多得,但需要BOOTLOADER支持。目前采用的BOOTLOADER是不支持该方式的,而且要实现MULTIBIN就必须修改固化操作系统的方法。现在通过USB的方式直接固化BOOT和NK肯定行不通了,也许会增加生产的麻烦。总之,投入产出基本成正比,要在WinCE6.0下实现这个,估计有一定的工作量,但实现完了肯定会有彻底的改善。

      在WinCE启动过程中,还有一个很重要的阶段就是加载驱动程序了。这个阶段在进入WinCE界面之前,往往也是比较费时间的。一般快的也要1~2S,慢的就不好说了。如果驱动的初始化代码中有很多延时或者读写硬件的操作,单线程方式加载驱动肯定会导致系统启动很慢。这个问题,已经有前人提供了解决方法,定制BusEnum,将单线程同步加载驱动的方式,改为异步加载并且提供了WinCE6.0下的示例代码BusEnum2。这个想法非常棒!我下载了他的示例代码,并编译到系统中,不过比较不幸,这代码只能在Debug模式下才能正常工作,在Release模式下总是会出现Data Abort,异步加载的驱动不能成功加载,很是诧异,目前还没找到原因,囧。实在不行,倒可以使用驱动调试助手的方法,自己单独写一个驱动来做这个事情。不过,解决问题最好还是能从根源着手,从根本上解决。问题不根治,只解决表象,总会有些隐患,心里也不踏实。有用过BusEnum2的同学,欢迎交流,希望能帮我解决这个疑惑。^_^

      总的来说,提高WinCE的启动速度,差不多就这些方法,你如果有高招,也请不吝指教。以上都是理论分析,实际情况如何需要实验和事实来证明,后续将进一步跟进,有进展会贴出来跟大家分享。

时间: 2024-11-08 23:39:31

浅谈WinCE快速启动的几种方法的相关文章

浅谈寻找友情链接的几种方法

友情链接的几种方法,对于友情链接,是我们每一个心中的必须,我们都知道友情链接我们应该怎么做,我们应该怎么找,或者是应该怎么去交换,其实交换友情链接也就几种方式,对于每一种方式用到极致就是一把最有利的方式,浅谈一下如何进行最有效的友情链接方法了. 友情链接之一:发现. 生活中并不缺少美,缺少的是发现美的眼睛,对于友情链接,我们也应该去发现,因为你的每一种发现都将为你带来全新的感触,比如说想做行业站的友情链接,那么就去百度里面找这方面的站,行业站一般就是比较排名和流量了,有了排名,一般还要看PR,凝

浅谈医院网络营销的几种方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 做SEO六年多了,但进入医院行业才一年半的时间,个人觉得网络营销在民营医院整合营销中占有非常重要的地位,特别是目标人群年龄在20-40之间的,网络营销已经成为其最主要的营销手段. 下面主要就说说网络营销的几种方法: 1.网络广告 网络广告应该说是医院网络营销中最主要且最直接有效的方式,如果认为随便找个人在那做网络就能做出一番成绩起来,那只能用

浅谈jQuery animate easing的具体使用方法(推荐)_jquery

从jQuery API 文档中可以知道,jQuery自定义动画的函数.animate( properties [, duration] [, easing] [, complete] )有四个参数: •properties:一组包含作为动画属性和终值的样式属性和及其值的集合 •duration(可选):动画执行时间,其值可以是三种预定速度之一的字符串("slow", "normal", or "fast")或表示动画时长的毫秒数值(如:1000)

浅谈PHP中try{}catch{}的使用方法_php实例

PHP中try{}catch{}的作用是用来处理异常.可以为我们收集并显示出错误信息.希望通过这篇文章的介绍,大家能掌握这一语句的应用. 在PHP语言中有许多语法需要我们去不断的熟悉,然后才能灵活的运用,编写我们需要的代码程序.在这篇文章中我们将为大家介绍PHP中try{}catch{}的用法. <?php try { //... } catch(Exception $e) { //... } ?> PHP中try{}catch{}是异常处理. 将要执行的代码放入TRY块中,如果这些代码执行过

浅谈PHP中try{}catch{}的使用方法

PHP中try{}catch{}的作用是用来处理异常.可以为我们收集并显示出错误信息.希望通过这篇文章的介绍,大家能掌握这一语句的应用. 在PHP语言中有许多语法需要我们去不断的熟悉,然后才能灵活的运用,编写我们需要的代码程序.在这篇文章中我们将为大家介绍PHP中try{}catch{}的用法. <?php try { //... } catch(Exception $e) { //... } ?> PHP中try{}catch{}是异常处理. 将要执行的代码放入TRY块中,如果这些代码执行过

word2016中让文字快速对齐的两种方法

  word2016中让文字快速对齐的两种方法          一.利用分散对齐 1.第一种文字对齐的方法是利用分散对齐,比如现在我们要对齐的这几项内容,要以字符数最多的为基准,现在最多的是四个字符,那么其他几个选项也要变成四个字符的宽度. 2.选中要对齐的文字,注意只选中文字不包括冒号,找到"开始"选项卡里,选择段落里的"分散对齐"按钮. 3.然后在"调整宽度"对话框里设置文字宽度为4个字符,因为咱们要对齐的字符里最长的字符是政治面貌,就是4

Windows7快速启动“性能监视器”的方法

在平时测试过程中,经常需要查看"性能监视器"这个工具.Windows7下的性能监视器工具更是得到了增强,非常好用. 这里介绍一下快速启动"性能监视器"的方法: 1.按Win+R键打开运行对话框 2.输入"perfmon", 然后回车即可. 如图: 执行后打开的"性能监视器"如图:         注:更多精彩教程请关注三联windows7教程栏目,三联电脑办公群:189034526欢迎你的加入

浅谈EasyUI常用控件的禁用方法_jquery

如下所示: input和textarea: $('#controlid').prop('disabled', true); $('input:not(:button,:hidden)').prop('disabled', true);//禁用除button和hidden控件外的所有input控件 $('textarea').prop('disabled', true); radio和checkbox: $('input:radio[name="radioname"]').prop('d

浅谈js中StringBuffer类的实现方法及使用_javascript技巧

如下所示: <strong>JAVA中有一个StringBuffer类,js中却没有下面来自己实现一个简单的js的StringBuffer类.</strong> //创建一个StringBuffer类 ,此类有两个方法:一个是append方法一个是toString方法 function StringBuffer() { this.__strings__ = []; }; StringBuffer.prototype.append = function(str) { this.__s