none
如何改善WinCE的启动时间 RRS feed

  • 常规讨论

  •  

    我用的是ARM处理器,上面跑WinCE6.0,有一片4GBit的Nandflash. 每次启动的时候,在加载nandflash驱动以后,好像都要将整个nandflash读一遍,结果启动时间要花10多秒,主要都花在nandflash上了。

     

    是不是每次启动,WinCE都要读取整个nandflash的文件系统??

     

    有没有别的办法,可以缩短启动时间?? 比如,是否可以分两个区,启动的时候先加载一个小的分区,等启动以后,再加载另外一个大的分区??

     

    不知道是否可行,如何实现??

     

    请大家指教呀!!

     

    先谢了!!

     

     

     

    • 已更改类型 lotikayanModerator 2009年5月31日 14:26 长时间没有解决的问题统一改为讨论
    2007年11月8日 4:58

全部回复

  • 我是在DSK驱动之上,用FAT文件系统,可以支持多个分区.当然DSK要重新定�?还可以将Hive落在上面,保存Registry.可以参�?

    ftp://windowsce.vicp.net/common/SMDK2440-Hive-Registry/

    2007年11月8日 6:45
    版主
  •  

    多谢回复!!

     

    我看了你的doc了。在WinCE启动之后,我也可以将我的4G的nandflash分区,这个没有问题。

     

    问题是每次启动还是很慢,好像在加载文件系统的时候,要将整个nandflash搜索一遍,不知为何??

     

    我可以在WinCE启动后对nandflash分区,分一个小的,分一个大的。我的问题是,能不能实现在下次启动的时候,只加载小的分区,等WinCE启动以后,通过程序或者控制面板再加载那个大的分区??如何实现??

     

    不知是否可行??

     

    我的主要问题是因为WinCE启动慢,而且慢的主要原因是在启动的时候加载nandflash驱动以后,好像要把整个nandflash读一遍似的。

     

     

    不知道我的理解是否正确??

     

    请大家指点!!

     

    多谢了!

    2007年11月8日 7:03
  • 就是把DSK驱动查找坏区的函数去�?改成固定的信息就OK�?我是这样搞的.

    2007年11月8日 7:10
    版主
  • 在nandflash里面,坏块是会动态产生的。一般上层会通过调用FMD_GetBlockStatus(..)函数来获得flash中某个块的状态。改成固定的信息对nandflash来说,不可行吧??

     

    我的问题是每次启动都会在加载nandflas后花很长时间,我感觉好像是文件系统在扫描整个nandflash,不知道理解是否正确??

     

    有什么好办法缩短这个时间么??

    2007年11月8日 7:20
  • 有没有人回答呀??

     

    2007年11月14日 2:03
  • 这个问题我已经解决了,就是写两个nandflash驱动,分别对一个4G的nandflash的不同区域进行读写擦除操作。当然,注册表也有两套nandflash的配置。

     

    这种方法虽然很弱,至少帮我解决了问题。也没有人告诉我还有什么其他的好办法...

     

    我现在用WinCE6.0开发flash驱动,我看微软网站的msdn里面讲,在WinCE6.0里面flash驱动支持两种模式:

    一种是FMD+FAL模式,一种是MDD+PDD模式。

     

    一般都采用FMD+FAL模式,我的驱动也是这样。我在WINCE600目录下面没有搜索到关于MDD+PDD模式的flash驱动代码,不知道是否有人在这种模式下开发过flash驱动??在MDD+PDD模式下,是否支持在驱动程序里面进行分区??

    2007年11月30日 2:03
  •  

    晕!

     

    为啥把我的帖子给结了,都没人回答呀!!

    2007年12月14日 1:46
  • 我没结过,顺便问一下怎么样看帖子有没有结?

    2007年12月14日 6:27
    版主
  • 我也不知道。今早来了就收到email,打开一看,帖子前面的问号变成绿色的对勾了,还问我是否有帮助,我就选择了一下否,然后帖子前面还是对勾,后来我好像又选了个什么东西,然后就又变回来了,现在应该正常了!

     

    希望大家多关注我的帖子,呵呵!

     

     

     

     

     

     

    2007年12月14日 6:40
  •  

    晕倒!!

     

    为什么又把我的帖子标记为解答???????

     

    我来总结一下:

     

    对于我最开始提的问题,一直没人能解答,后来我自己想了个办法解决了问题。但是解决问题的方法我个人觉得不是很好,也希望能多和大家交流,看看有没有更好的方法。

     

    后来我又提出了一个问题,也没有人回答。我希望没有真正解答的问题不要“标示为解答”,因为本来就没解答嘛。

     

    也不知道目前WinCE6.0是否能解决我上面提的问题??

     

     

    2007年12月18日 10:33
  • 我也遇到这样的问题,这问题发到SAMSUNG到现在还没搞定,

    我觉得可以将FLASH分一块出来做一个关于FLASH的好坏表出来,在OS起来第一次就读这一块的信息给FMD_GetBlockStatus,之后就不再用这个表了,且有坏的要修改此表.这样OS就可以建立一个目前的好坏块的表了!我是这样想的,应该是OK的,我还没有时间做,现在在做FLASH通用FMD,卡卡!OK了,正在测试中!
    2007年12月20日 7:25
  •  

    你的方法也许可行。问题是我并不认为检查整个nandflash的坏块会花很长时间。我觉得WinCE在加载flash驱动的时候,如果发现这是一块nandflash,就会扫描坏块,但实际上扫描坏块应该不会花太长的时间。我觉得WinCE也会扫描整个nandflash里面的FAT表,检查其是否正确,完整。这个会比较花时间,不知道我理解得对不对??

     

    所以我做了两个nandflash驱动,分别对一块nandflash的两个区域进行读写,注册表也是两套,同样也加了保护。这样我可以先加载一个小的,另一个以异步模式加载,这样会省很多时间。

     

    我的nandflash是512MB,我的NK内核也放在nandflash上面,而且是双内核备份,每个占15MB。所以用作WinCE文件系统的只有482MB。然后又分成了两块nandflash,也就是两个驱动,一个占4MB,另一个站478MB。启动的时候,先加载4MB的,这样WinCE可以很快启动起来。

     

    除了这种方法,还有什么方法能够在WinCE启动的时候,选择性的加载不同的分区??

     

    还有就是WinCE6.0里面支持所谓的MDD+PDD模式的Flash驱动,在WinCE目录下没有找到源代码,有没有人用过??相关的资料好像不多呀!

    2007年12月21日 2:22
  •  

    他是在起动时要读取,在剩余空间里标注了扇区号的FLAH的页的INFO,对未标注的就只读取好坏块的INFO,

    也就是说你的文件或删掉的文件,只要曾使用过的页都会被标注扇区号,都会被读,即如国你的扇区越小越浪费时间!

     

    FMD这块,我认为微软做的很差径,卡卡!

    2007年12月22日 9:56
  •  

    看来是没什么好的办法了??

     

    FMD不支持驱动里面进行分区。除非你写两个FMD驱动。目前WinCE6.0里面好像只支持FAL+FMD模式,看微软的文档说在WinCE6.0 R2中还支持另一种叫MDD+PDD模式,好像可以支持多个Region和多个Partition??

    2007年12月24日 2:00
  •  

    Hi,

     

    我觉得你的这种方法是有效的,并且也没什么不妥;

    不过就是不是不是很标准;既然是定制,还谈什么标准啊,做好可移植方面处理就好!

     

    NANDFLASH 需要进行物理地址到虚拟地址的映射,应该是很需时间的;容量越小,消耗时间越短;也是最有效的;

     

    如果去掉一些坏块处理功能的话,对于做产品应该是不妥当的。

     

    个人意见,谢谢

    2008年1月7日 4:03
  • 非常感谢你的回复!!

     

    对于你说的“NANDFLASH 需要进行物理地址到虚拟地址的映射,应该是很需时间的”,我谈谈我的看法:我用的是ARM,物理地址/虚拟地址的映射应该是由MMU来完成的,我觉得这个时间是可以忽略不计的。

     

    我同意你说的“容量越小,消耗时间越短”。

     

    我觉得个人的水平和想法是有限的。所以虽然我找到了解决的方法,还是希望多和大家交流,看看还有没有更好的方法。

     


    2008年1月7日 8:58
  • 你好:
        能告诉哥们一下FAL的源码在哪里么?CE6.0环境下,网上有些地方提到在D:\WINCE600\PUBLIC\COMMON\OAK\DRIVERS下面,但是我实在没有办法确定是那个目录下面;
        按道理来讲,应该是位于block下面,可是msflashfmd下的代码根本就没有涉及到FAL层的代码。
        可否告诉哥们,FAL的源码在哪里?劳烦将路径或者源码发送到邮箱guopeixin@126.com.
        谢谢了。

    2008年4月25日 7:51
  • 在WinCE6.0中:

     

    D:\WINCE600\PRIVATE\WINCEOS\DRIVERS\MSFLASH\SRC

    2008年4月28日 1:16
  •  

    如何异步加载nand??
    2008年8月30日 13:40
  • 这帖子浏览次数够高的。你想异步加载,需要修改注册表,将"LoadFlags"和"BootPhase"两个注册表项设置为2。具体的解释你看一下PB的文档把。

    2008年9月1日 4:27
  • ms FAL对于64,128, 256M flash还是很不错的选择.事实上如果是4G Bytes的flash你会发现根本没法使用.

    可以enable debug版本FAL获得更多信息,默认好像只打开了init,error两个地方,可以手动把lib中的debug zone直接改掉,变成0xff,但这样就输出太多内容了.

     

    两个DSK driver是个很好的idea,目前已经看到很多人这样做了.

     

    关于mdd+pdd的DSK driver没有什么印象,原则上只要实现DSK接口的stream driver.有实力做这个的包括sunsumg onenand,mDoc等.如能参考这部分代码的实现,离自己的DSK driver也就不远了.

     

    最后还是建议用FAL+FMD,最大的好处是出现稳定性问题可以直接用debug FAL调试.

    2008年9月1日 16:01
  • 我也遇到这个问题,主要原因是在FAL+FMD架构中物理扇区号和逻辑扇区好的对应关系是保存在16字节的冗余区中的,当系统起来后,FAL必须要了解物理扇区和逻辑扇区的对应关系,所以在BuildupMappingInfo函数中会遍历整个nandflash,如果当前的block是free,系统会直接遍历下一个block,这样速度还是很快的,但是如果block是mapped的,那么就会读每个扇区的冗余区来得到逻辑扇区好,这就会浪费很多是间。
    解决的方法,1,可以nand flash分成1个binfs和1个fat分区,binfs放大的只读的程序,fat分区要小,用来放可读可写的数据,这样系统启动的速度会很快。
    2,采用mdd+pdd结构,因为在这种结构中物理扇区和逻辑扇区的对应关系不是放在每个扇区的冗余表里的,这个表是集中存放在nand中,所以启动时之用读出这个表就ok了,不用遍历整个扇区了。
    3,修改fal代码,在关机时保存m_pDynamicLUT这个2级表,在启动时直接回复就ok了,注意这是应该也要保存和恢复free和dirty扇区的数目和链表结构。

    2009年5月13日 9:20
  • To ARM_WINCE:
         你好,看到大家都在这么认真的讨论CE6.0,我想问下 你是开发板还是什么板子?
    我想找个有CE6.0的BSP的开发板,在网上没有找到,楼上各位是否可以给小弟提供点信息,
    先谢过了!!

    2009年5月13日 9:49