WinCE.Net 4.2定制中的几点注意事项
By ZYH 2005-02-20
前言:Windows CE .Net Platform Builder 4.2为我们提供了定制自己的CE系统的良好环境,而且文档丰富,按理说“依葫芦画瓢”应该不成问题,但事实还是有些地方值得注意,笔者积累了些简单的经验,特共享给同道s,但愿能为初涉CE泥沼的你提供点方便,节约点时间,倘因此不至于挨骂,吾心大慰矣J
本文大致只对初级用户有益,如您已是高手,就别浪费时间了;-)
有几点常常容易被人忽视:
I. 习惯向Google老师找答案,而不是自己查PB的在线文档
II. 习惯逛论坛找高手,而不是上M$的支持网站找答案
III. 不究其“所以然”,而浮于问题表面
微软的补丁恐怕也是前无古人后无来者的了,让很多人望而却步,尤其是网速慢的兄弟L。但你既然选择了,就要不停地打下去。如果你不知道这个补丁能为你解决什么问题,那么,最简单的办法,就是全装上,虽然可能带来新的问题,但永远比不装好。
可以肯定的一点,如果你用的是PB 4.2 2003年早期的版本,那么,你在你定制的NK中,就无法使用CPropertySheet/CPropertyPage(关闭Full Kernel Mode时),至于memory leak一类的bug,或者你还暂时感觉不到。
PB 4.2的帮助文档已经对大内存的支持有了详细的说明,鉴于我的痛苦经验,特书下述文字J。以支持128MB内存(其中4MB用于现存,实际为124MB,x86哦)为例。
请先记住这个位置,在PB的帮助文档中:
Platform Development
->Board Support Package Development
->Supported Board Support Packages
->x86 Board Support Packages
->CEPC Based SDBs
->How to Configure and Build an OS Image for a CEPC
->Supporting or Simulating More than 64MB of RAM
然后,咱们来看看这个HOWTO的内容:
The default end address of RAM is 28 MB, unless you set IMGRAM16, IMGRAM32, or IMGRAM64, or build an OS image for a locale outside the United States. The Config.bib file for your platform specifies the end address of RAM. The OEMInit function determines whether to search for additional RAM past the end address of RAM. If you modify Config.bib, OEMInit does not search for additional RAM.
首先,它告诉咱,您按缺省条件建立的OS image,RAM的末尾地址是28MB,除非你把IMGRAM16或IMGRAM32或IMGRAM64设上(为1),或者干脆自己搞一个完全不同的。另外,在%_WINCEROOT%\Public\Common\Oak\Csp\i486\Oal\OEMInit.asm这个文件中,有一个OEMInit函数,它用来检测你定制的OS的Config.bib文件中给出的RAM末尾地址,来确定是否要检查额外的RAM。
然后,它就以这个缺省是28MB RAM的设置为例,来说明怎么支持超过64MB RAM。如下:
Note Microsoft assumes in the following procedure that Config.bib specifies the default 28 MB of RAM. If you want to change the default amount, edit the IsDRAM function in the %_WINCEROOT%\Public\Common\OAK\CSP\i486\OAL\Cfwpc.c file.
To support or simulate more than 64 MB of RAM
In %_WINCEROOT%\Public\Common\Oak\Csp\i486\Inc\Pc.h, change CEPC_EXTRA_RAM_SIZE to the total amount of RAM you want to support, minus the amount specified in the Config.bib file.
The default value is 0x2400000 and the default RAM in Config.bib is 28 MB. To support 128 MB of RAM, change the value to 0x6400000.
In %_WINCEROOT%\Public\Common\Oak\Csp\i486\Oal\OEMInit.asm, change the first entry of _OEMAddressTable to the total amount of RAM you want to support.
The default value is 0x04000000, which is 64 MB. To support 128 MB of RAM, change the value to 0x8000000.
Build i486oal.lib with the following minimal set of commands.
cd %_WINCEROOT%\Public\Common\OAK\CSP\i486\Oal
build -c
sysgen i486oal
Build the platform with the following commands.
cd %_TARGETPLATROOT%\Kernel\Buildexe
set WINCEREL=1
build –c
makeimg
依葫芦画瓢还是有人被M$搞蒙了,为啥?咱就不罗嗦了,提几点供参考:
1. 除非你真的要搞一个超级大的OS Image,否则别开启“Enable Images Larger than 32MB”,因为这个会缺省将IMGRAM64搞成1!(下面以此为前提)
2. 只要不人为设置上一步的Option,也不要在Environment中增加IMGRAM32等其它设置,那么系统就满足M$在HOWTO里的假设,当然反之就不满足了,废话~~
3. 需要修改的地方只有:
i. %_WINCEROOT%\Public\Common\Oak\Csp\i486\Inc\Pc.h
把:
#define CEPC_EXTRA_RAM_START 0x81C00000 //28MB免检查(Config.bib)
#define CEPC_EXTRA_RAM_SIZE 0x02400000 //另外有36MB(共64MB)
改成:
#define CEPC_EXTRA_RAM_START 0x84000000 //64MB(系统可缺省支持)
#define CEPC_EXTRA_RAM_SIZE 0x03C00000 //另有60MB(共124MB)
ii. %_WINCEROOT%\Public\Common\Oak\Csp\i486\Oal\OEMInit.asm
按如下设置_OEMAddressTable:
dd 80000000h, 0, 07C00000h
这里,也就是124MB,128MB减去了用于显存的4MB。
4. 切记:上述修改只有在按M$提供的命令行方式编译并产生新的lib文件后才有效!进命令行的方式是:PB->Build->Open Build Release Directory,或者你自己用其它方式设置环境变量。命令PB帮助文档列了,这里就不再列举了。生成的lib文件为:
%_WINCEROOT%\Public\Common\Oak\LIB\X86\RETAIL\i486oal.lib,可检查一下。
5. 编译了,自己试试~~J
这个话题让很多高人说烂了,微软也着实在上面做了些功夫。我要说的只有几句:
1. 用CE 4.2自身的Hive-Based Registry就可以建立永久注册表保存了;
2. 想启用Hive-Based Registry,需要做的只是下面两步:
a) 把这个支持加到你的定制里,如图:
b) 手工在Environment里加一个环境变量BSP_ENABLE_FSREGHIVE,如图:
3. 另外,还可以再改改注册表,至于这些,还是好好看看PB的帮助文档吧。
为什么还要提Registry Save的问题?原因只有一个:M$的文档什么都说了,就是没说BSP_ENABLE_FSREGHIVE一定要自己手动设(或者在某个隐蔽的地方说了也不一定L)!
关于SQLCE和OLEDB的支持,M$耍了一些花枪~~
先到M$的技术支持网站msdn.microsoft.com去找到KB825393,下下来其中的附件:ssceoledb.exe,解压出来ssceoledb.h,把它加到你的SDK里去,如何加自己看PB文档,加在哪个目录看你的喜好J,或者你干脆偷懒,作为一个额外文件随SDK附送也是一样的L。
建SDK并非难事,记得一点:如果要在SDK中包含自己定制的EMULATOR(往往包含的支持跟你硬件上跑的OS Image一样啊),则一定要在你的PB里同时编译好这两个KERNEL~~
上面已经说到了,要把自己搞的SDK跟Standard SDK 4.2一样,还带一个emulator,就要在你的Platform中同时有Emulator支持包和你的硬件支持包,记得要把两个KERNEL都编译出来哦~~
这已经超出CE.Net 4.2定制范围了,顺便提提,因为用C#开发CE程序还是蛮爽的。
你需要一个包:Windows CE .NET Utilities for Visual Studio NET 2003,到M$网站去download。装上,再顺道看看帮助(有篇技术文章:“用于 Visual Studio .NET 2003 的 Windows CE 实用工具的自述文件 v1.1”),就晓得了J。