Windows Embedded CE嵌入式操作系统支持两种不同的注册表类型:RAM-based注册表和Hive-based注册表。
RAM-based注册表将所有注册表信息保存在对象存储(object store)中,对象存储可以看作是WinCE系统在内存中永久的虚拟RAM磁盘,因此要保存注册表信息,需要把注册表转存到具有掉电保护的RAM介质中,为此CE提供了转存及恢复注册表的底层函数。如果没有对注册表进行这样的转存及恢复,则系统总是使用缺省的注册表。
Hive-based注册表将注册表数据存储为文件,注册表文件可以存储在任何文件系统中。将注册表存储在非易失的存储介质上(比如Flash),就不需要类似RAM-based注册表的备份与恢复操作。
RAM-based注册表通常用在总是使用热启动,很少甚至从不冷启动的系统中,Windows Embedded CE6.0及以后版本,默认采用Hive-based注册表,英创公司的WinCE系列工控主板默认使用Hive-based注册表,注册表文件存储在NandFlash中。
WinCE在系统启动过程中会在注册表里添加信息,最典型的就是在注册表中生成驱动的Active 项,如果是Hive-based注册表,则意味着WinCE在整个启动过程中会不停写盘,在大多数情况下这没有任何问题,但如果系统使用环境供电不稳定,在系统启动过程中频繁断电,则有可能导致注册表损坏。而对RAM-based注册表,每次系统启动时都会将内核中的默认注册表加载到RAM中,系统启动过种中生成的注册表信息也写在RAM中,因此不会有注册表被写坏的问题。所以从启动的可靠性来看,RAM-based的注册表方式优于Hive-based注册表方式。
为了提高主板的可靠性,我们在BSP中增加了支持RAM-based注册表的底层转存及恢复功能。所设计的转存及恢复功能,主要是针对那些在实际的应用中,必须保存的相关信息。比如触摸屏较准参数,网络参数等。为此我们对内核进行了更新,新的内核在采用RAM-based注册表同时,也能保存一些必要的注册表数据。
英创WinCE RAM-based注册表版本内核目前能保存以下注册表信息:
注册表功能 | 注册表 | |
1 | 触摸屏校准参数 | [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH] 'CalibrationData'='' |
2 | 网络1参数 | [HKEY_LOCAL_MACHINE\Comm\ENET1\Parms\TcpIp] 'EnableDHCP'=dword:0 'UseZeroBroadcast'=dword:0 'DefaultGateway'='192.168.201.19' 'IpAddress'='192.168.201.213' 'Subnetmask'='255.255.255.0' 'DNS'='61.139.2.69' |
3 | 网络2参数 | [HKEY_LOCAL_MACHINE\Comm\ENET2\Parms\TcpIp] 'EnableDHCP'=dword:0 'UseZeroBroadcast'=dword:0 'DefaultGateway'='192.168.201.19' 'IpAddress'='192.168.201.213' 'Subnetmask'='255.255.255.0' 'DNS'='61.139.2.69' |
3 | 系统语言设置 | [HKEY_LOCAL_MACHINE\MUI] 'SysLang'=dword:804 [HKEY_LOCAL_MACHINE\MUI] 'DefaultLCID'=dword:804 [HKEY_CURRENT_USER\MUI] 'CurLang'=dword:804 |
表1
使用RAM-based注册表时,无论是由控制面板、远程注册表工具或通过程序代码直接修改了上面例出的注册表项后,都需要调用RegFlushKey函数才能真正保存注册表信息。下面是示例代码:
HKEY hOpenKey;
// 打开任意注册表键
RegOpenKeyEx (HKEY_LOCAL_MACHINE, L'HARDWARE\\DEVICEMAP\\TOUCH', 0, 0, &hOpenKey);
// 调用RegFlushKey会触发系统保存注册表
RegFlushKey( hOpenKey );
// 关闭打开的注册表
RegCloseKey( hOpenKey);
我们将上面代码封装成了一个小工具RegFlushKey,放在系统的控制面板中,方便调试时使用。比如用户通过控制面板的笔针工具较准完触摸屏后,再点击运行一次RegFlushKey,触摸屏较准数据就保存了。
图1
根据用户实际需求,我们会不断添加保存的注册表项,本文档表1也会同步更新。
与hive-based注册表相比,使用RAM-based注册表还有些需要注意的地方,比如“拨号连接”。在hive注册表的系统中,通过控制面板或英创提供的RasEntry程序新建拨号连接后,对应的注册表就已经自动保存了,系统断电重启不会丢失,因此在hive注册表情况下,拨号连接只需要建立一次。而RAM-based注册表不能保存这些信息,所以系统每次启动后都需要新建拨号连接。
成都英创信息技术有限公司 028-8618 0660