WinCE系统掉电丢失设置的问题的分析

出处:http://yymcu2010.s240.804.cn/a/TechDocu/WinCE/2010/1106/6377.html


描述:

在改变设置之后回到主界面,短时间内拔掉电池或者按复位键,再次开机后所修改的设置都丢失了。

分析:

Windows Mobile的设置基本上是保存在注册表文件里面的,Windows Mobile 的注册表多数采用Hive-Based 。设置修改之后临时保存在RAM当中,文件系统按照一定的规则将这些设置Flush到永久存储器当中。Flush的这个过程不是一定在设置修改之后立即进行的(参照OEM文档Flush-On-Close Registry Flushing,如果[HKEY_LOCAL_MACHINE\init\BootVars] 中的"RegistryFlags"设置为1的时候,每次调用RegCloseKey都会调用RegFlushKey进行一次Flush;如果没有设置的话,Flush是不确定性的。)

所以,当设置改变而短时间内还没有Flush到永久存储器上的时候,拔掉电池或者硬件复位都会导致这段时间内的设置丢失。

Flush的控制选择项主要是由以下注册表位置决定的:

[HKEY_LOCAL_MACHINE\System\ ObjectStore\RegFlush]

"ActivityThreshold"= dword: 1   ;//表示注册表变化的次数阀值

"ActivityName"= "$*@RegChanged#%&"  ;//表示注册表变化的事件的名称

在RegistryFlags不设置的情况下,调用RegFlushKey的主要因素就是系统每隔一分钟会更新以下键值[HKEY_LOCAL_MACHINE\ System\State\ DateTime\Time] 使注册表每分钟至少修改一次,加上设置修改引起的这次注册表改动共2次,超过了ActivityThreshold定义的次数阀值1触发RegChanged事件。所以表现出来就是一般情况下设置修改之后在一分钟之后才能保存,在一分钟之内拔掉电池或者硬件复位就会丢失。

 

解决方案选择:

(1) 采用Aggressive Flushing,设置RegistryFlags为1。

有效性:这种做法可以保证任何情况下设置及时保存。

副作用:Aggressive Flushing频繁的调用RegFlushKey会导致系统系统性能严重下降,并会影响应用程序的运行。所以不建议在支持永久存储的设备上使用。

 

(2) 使能Lazy FlushSet PRJ_ENABLE_REGFLUSH_THREAD=1

可以从环境变量改变前后的reginit.ini当中看到在 HIVE BOOT SECTION 增加如下一段注册表:

------------------------------------------ 我是无辜的分割线 -------------------------------------

[HKEY_LOCAL_MACHINE\System\ObjectStore\RegFlush]

; To monitor the flushing from an external process add "ActivityName" registry value.

; The activity name is a global named event that filesystem will signal on Registry Activity.

;   "ActivityName"=""

; Create an thread in filesys to perform flushing

    "SpawnThread"=dword:1

; Make the thread IDLE priority

    "FlushPriority256"=dword:FF

; ActivityThreshold specifies the # of reg activity before we force a flush

    "ActivityThreshold"=dword:100

; Timeout period for a flush (flush occurs if there have been some changes during this period)

"FlushPeriod"=dword:3E8

------------------------------------------ 我是无辜的分割线 -------------------------------------

 

这个增加的部分在前述注册表位置之前,所以设置环境变量之后最终的注册表如下:

[HKEY_LOCAL_MACHINE\System\ObjectStore\RegFlush]

    "ActivityThreshold"= dword: 1   ;//表示注册表变化的次数阀值

    "ActivityName"= "$*@RegChanged#%&"  ;//表示注册表变化的事件的名称

    "SpawnThread"=dword:1

    "FlushPriority256"=dword:FF

    "FlushPeriod"=dword:3E8

 

新增的三行只有环境变量PRJ_ENABLE_REGFLUSH_THREAD被设置为1时才会出现并加入到HIVE BOOT SECTION,表示按照SpawnThread创建一个优先级为FlushPriority256的线程,以 FlushPeriod (默认为0x3E8即1000ms=1s)为周期检查是否有注册表改变,并将改变Flush到永久存储器中。

    有效性 :这种做法可以保证用户操作的情况下设置及时保存;当FlushPeriod较大时,不能保证设置完成立即掉电能保存设置。

    副作用 :虽然Lazy Flush要比Aggressive Flushing对性能的影响要小的多,但是还是存在的,不过不会影响应用程序。要减小这种副作用需要适当修改默认的FlushPeriod。

(录入编辑:yymcu)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值