PXA270上的双启动功能已经实现了,但又引入了一个新问题,WinCE的启动太慢,大概需要2分钟!这显然是不能忍受的。通过两天的努力,现在已经缩短到20秒,虽然还是有点长,但已改善不少了。先整理一下,免得忘了,有时间再做优化。
WinCE启动慢的主要原因是从NAND FLASH中加载NK到内存特别慢,这几乎占了99%的时间,而加载完NK后的启动其实是挺快的。所以要缩短启动时间,可以通过缩小NK来实现,因为NAND FLASH的读写速度是一定的,没有太大的改善空间。
WinCE中提供了Multi-BIN的功能,它将整个内核映像分成几部分,在WinCE启动时可只加载核心部分,这样就能有效提高WinCE的启动速度。
要实现Multi-BIN,必须做两部分的修改,一是EBOOT,另外一个是映像。下面就简要说一下这两部分实现时的要点和注意点。
EBOOT中需要支持BINFS,这在先前做双启动时已经留好了路,没什么问题。
EBOOT中需要支持Multi-BIN的下载和烧写,这一部分可参考帮助文档的相关部分。
映像的修改,首先是bib文件,配置各部分的大小,并设定NK.bin中包含的文件,需要注意的是FLASH的驱动(nandflash.dll)必须包涵在NK.bin中。在定制系统时,需要添加BINFS、FATFS、ROMONLY的FS和HIVE-BASEED的注册表。修改NANDFLASH的注册表配置,使其在BOOTPHASE 0加载。整个过程,代码的修改比较少,除了EBOOT中需要修改一些代码外,映像只需修改几个配置文件。
需要注意的是调试Multi-BIN的映像最好不要用Debug的方式编译下载,否则会出现一堆可怕的打印信息,摘录如下:
0x83d16000: BINFS: InitVolume - Signature of ROM Header does not Match- Assuming Chain Region
0x83d16000: FLASHDRV.DLL:L2P_GetPhysicalSectorAddr() - Secondary table doesn't exist for logical sector 0x11689!!!
等这些打印信息完成,得要好几分钟。用Release的方式编译则不会有这个问题。Debug模式下,为什么会出现这些,还不清楚,有时间再看吧。
贴两张效果图,实现MULTI-BIN前后SDRAM的大小比较。
这是采用MULTI-BIN时,SDRAM的大小,60M Bytes。
没有采用MULTI-BIN时,只有35M Bytes。
这两幅图表明,MULTI-BIN除了能提高WinCE启动的速度,还能增加WinCE的可用内存。这是MULTI-BIN的另外一个重要作用。
除了MULTI-BIN能提高WinCE的启动速度外,优化启动时驱动的加载也能提高WinCE的启动速度。一般情况下,驱动的加载都很快,可以不予考虑。但在驱动加载很费时间时,如果通过异步的方式加载驱动,那将给用户带来极速体验,5秒钟进入WinCE界面!
、、============在CSDN里发贴问到的======================
30m的话你的NK是中文的吧?
如果是中文的添加Agfa AC3 Font Compression\GB18030 Dta Converter\simsun&nsimsun(subset 2_50)
这样大概可以小10M左右
另外你的BSP都调试确定没有问题之后,生产的时候可以将那些串口打印信息都屏蔽掉,还会省一点时间。
增加字体压缩组件,如LS所说是一个可行的方法
如果CPU速度低于300MHZ,Agfa AC3 Font Compression最好不要选,这样仍然可以比默认的减小7M左右
你的意思是不用设置下面的这个菜单了?
要设置,只是上边选组件的时候选的字体比PB默认选的中文字体小,并且Agfa AC3 Font Compression是压缩字库的。
我目前16M
相应的Boot程序也得跟着改,如果NK是10M,Boot上电只读10M。这样开机Boot读NK到内存速度快,NK启动速度也快。可以控制在10秒内
可以修改下启动文件,在NANDFLASH中存放nk.bin,在copy时将nk.bin释放到ram中,这样的话会快点。
IE浏览器也有几兆,还有那些JSCRIPT,去掉一些组件,目前我的压缩到18M了
如果用XIP会不会速度快点,或者调试注册表的信息。具体的我也不清楚,但是我想内核大和启动速度应该不是完全对应的吧!
调试信息,设备管理器加载驱动的多少等,也影响启动速度。所以注册表和BSP都要瘦身!
从NANDFLAG拷贝到SDRAM的时候很慢,要大概15S,运行的时候不慢。
所以问大家如何把WINCE剪小。
另外我重新编译的时候,发现NK.NB0并没有变小,字节长度一样,但NK.BIN却小很多了,
补充下(未测试):
==================================================
下载NK.NB0的时候,先清空SDRAMD的内润NB0后面的NULL数据都不下了,然后直接运行。
======================================================
如何在不删除必要组件的前提下减小内核文件长度?
1是自定义组件
2是压缩字库。
首先,NK.BIN中的内容是被压缩过的,NK.NB0中的内容是没有压缩的。
两者大小的区别是因为在生成过程中BIN会将你设定的后面的NULL自动去掉,而NB0就不会。
NB0的大小就是第三个变量ROMSIZE所设置的大小。
由于nk.nb0是非压缩的数据,里面的数据就是NK展开以后在内存里面的数据。
而nk.bin是有压缩的数据,里面的数据是压缩以后类似于成块形的数据,被loader拷贝到内存以后没有区别。
由于bin文件需要解压,因而其下载方式也不一样,
通常,通过串口直接下载用nb0,pb下载用bin。
其次,nk.nb0是可以直接烧到FLASH/ROM中的,是代码镜像,可以直接跳转到其入口执行。
而nk.bin是Microsoft binary image格式的文件,必须按其格式定义解开到其指定的地址空间的位置才能执行。
75、如何在不删除必要组件的前提下减小内核文件长度?
要减小内核文件长度首先要在使用PB的定制内核向导中选择自定义,也就是说对于每个组件都由自己来选择,而不是选择PB的标准配置。但减小内核文件长度最有效最直接的办法是缩小字体,尤其对于东亚字体,采用字体压缩技术并且选择合理的字库文件将明显缩小文件长度。
1)、在定制内核时选择AGFA AC3 Font Compression组件。SYSGEN变量为SYSGEN_AGFA_FONT。
2)、参考标题为“East Asian Font Versions”的帮助文档,从中选择你需要的字库文件加到内核中,从文档可以看出加AC3压缩比不加压缩在文件长度方面差距很大。