WINCE本身是一个完全在内存中运行的系统。每次启动都需要把NK.BIN拷贝到内存中相对应的地址。这样的系统就不需要了系统维护,但是如何“永久”的保存设置就成了问题。本文将介绍如何在Wince中实现设置的永久保存。
关键字:
WINCE、嵌入式操作系统、Hive-based Registry
作者
Tony
Email:gzci@163.com
Windows CE .NET是Windows CE 3.0的后继产品。Windows CE .NET为嵌入式市场从新设计,为快速建立下一代智能移动和小内存占用的设备提供了一个健壮的实时操作系统。Windows CE .NET具备完整的操作系统特性集包和端对端开发环境,它包括了创建一个基于Windows CE的定制设备所需的一切,例如:强大的联网能力、强劲的实时性和小内存体积占用以及丰富的多媒体和Web浏览功能。
WINCE本身是一个完全在内存中运行的系统。每次启动都需要把NK.BIN拷贝到内存中相对应的地址。关机之后内存中的数据将都“消失”。这样的系统就不需要了系统维护,但是如何“永久”的保存设置就成了问题。通过查找资料找到了一个微软提供的解决办法。具体实现方法如下:
第一步:在PB的Catalog里面将Hive-based Registry加入到我们的Platform之中。
第二步:在Platform.reg中修改[HKEY_LOCAL_MACHINE\init\BootVars]下面的设置为:
"SystemHive"=""
"Start DevMgr"=dword:
在我们系统中是从CF卡中直接启动,相当于Windows系统的C盘,所以具体更改如下:"SYSTEMHIVE"="Documents and Settings\\system.hv"
"PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:1
SYSTEMHIVE是system.hv文件保存的路径。Start DevMgr是选择是否启动设备管理器(Device Manager),启动设备管理器的目的是为了启动一些Hive-based Registry所必须的设备。(Start DevMgr is a Boolean value indicating whether or not to start the Device Manager so it can start the drivers necessary to reach the registry hives. A value of 1 causes the Device Manager to start; 0 keeps the Device Manager from starting. The only case in which the Device Manager should not start is if you want to store the hives in the object store, which causes the hives to be lost on a cold boot. Typically, the hives are stored outside RAM, so it is necessary to start the Device Manager.)
第三步:在Platform.reg中修改[HKEY_LOCAL_MACHINE\init\BootVars]下面的"DefaultUser"=""设置,以确定调用哪个默认用户的Hive-based Registry。如果不是多用户可以不做设置。
第四步:确定一下Platform.reg和Common.reg当中所有的启动驱动程序的注册项是否设置。你可以在Platform.reg和Common.reg中搜索
; HIVE BOOT SECTION
; END HIVE BOOT SECTION
这样的字段。有许多项需要设置,包括IRQ、IO、PCI等,不过一般的如果你没有修改过,系统默认的就可以了。这些设置是告诉ROM registry builder需要把什么加入到boot hive中。
第五步:启动必须在第一启动阶段启动的驱动程序。我们先看一下下面的关于第一启动阶段的描述:
很显然的Filesys是必须在第一启动阶段启动的。在common.reg中找到相关的文件系统的设置,添加"Flags"=dword:1000,我们用的fat文件系统,具体设置如图:
第六步:设置MountFlags的注册值为DWORD:2。在Common.reg中的:
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\ \]
设置: "MountFlags"=dword:2
第七步:确定是否需要注册表刷新机制。一般情况下在OS挂起或者重启动等软起动的时候系统会自动的刷新保存注册表;但是当系统突然掉电的话,注册表是不会保存的。所以就需要在更改了设置之后对注册表进行刷新。一般的解决方案是在用户进行了设置之后运行保存设置程序(调用RegFlushKey)进行设置的保存;不要定时的刷新注册表,这样会是整个系统变的很慢。
第八步:完全的重新build,make image,重新生成nk.bin。
通过以上的设置Wince系统中就可以实现设置的永久保存了。
参考文献:
Microsoft Windows CE .NET 4.2 HELP VERSION 4.0
下面分享一下我在WINCE5。0下做好保存设置的方法(用的ARMSYS2440平台,很简单哦,理论的东西就不多说了,上面两篇文章讲得比较清楚了):
第(1)步,在当前Platform下加入Hive-based Registry的支持;
第 (2)步,在注册表platform.reg中查找“; HIVE BOOT SECTION”,有两处,在第二处(原来是:IF BSP_NONANDFS !的地方),将; HIVE BOOT SECTION 和 ; END HIVE BOOT SECTION之间的内容替换成:
[HKEY_LOCAL_MACHINE\init\BootVars]
"SystemHive"="system.hv"
"Start DevMgr"=dword:1
"RegistryFlags"=dword:1
[HKEY_LOCAL_MACHINE\init\BootVars]
"DefaultUser"="default"
IF BSP_NONANDFS !
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\SMFLASH]
"DriverPath"="Drivers\\BuiltIn\\SMFLASH"
; LoadFlags 0x01 == load synchronously
"LoadFlags"=dword:1
"BootPhase"=dword:0
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SMFLASH]
"Prefix"="DSK"
"Dll"="smflash.dll"
"Index"=dword:1
"Order"=dword:0
"Profile"="SMFLASH"
"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
"Flags"= dword:1000 ;;;;;;;;;;
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH]
"DefaultFileSystem"="BINFS"
"AutoPart"=dword:1
"AutoMount"=dword:1
"PartitionDriver"="mspart.dll"
"Name"="Microsoft Flash Disk"
"Folder"="ResidentFlash"
"BootPhase"=dword:0
"MountFlags"=dword:2
"Flags"= dword:1000 ;;;;;;;;;;
; Keep FATFS from trying to shadow \Windows
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH\FATFS]
"Flags"=dword:14
"FormatTfat"=dword:1
"CheckForFormat"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
"Flags"=dword:00000014 ;FATFS_TFAT_ALWAYS|FATFS_FORCE_TFAT
"MountFlags"=dword:0
ENDIF ; BSP_NONANDFS
; END HIVE BOOT SECTION
第(3)步,最后一步,重新Sysgen(要选择clean before building),最后build BSP,makeimg。