系统时间的掉电保存


在系统重启(冷启动)时,内核会调用IOCTL_HAL_INIT_RTC来初始化时钟,并传入一个默认时间参数。在WinCE5.0里,IOCTL Code及对应的处理函数定义在g_oalIoCtlTable,相关硬件平台必须实现IOCTL_HAL_INIT_RTC对应的处理函数OALIoCtlHalInitRTC。如果平台具有备用电池的RTC(real-time colock),可以在这个函数内部读取它的时钟并设置CPU内部的RTC,否则的话就是用那个默认时间初始化CPU的RTC,这也就无法保证断电后时钟的准确。与RTC相关的函数还有OEMGetRealTime, OEMSetRealTime和OEMSetAlarmTime,它们都是与硬件平台相关的。

具体到采用PXA27x的平台,因为它的内部有RTC,所以上面三个关于RTC的OEM函数的实现就是设置和读取相应寄存器的值。默认的函数实现在%_WINCEROOT%\PLATFORM\COMMON\SRC\ARM\INTEL\PXA27X\RTC\rtc.c文件中,OALIoCtlHalInitRTC函数也在这个文件中,它只是调用OEMSetRealTime,也就是用内核提供的默认时间来设置RTC。

到这里就该切入重点了,写这篇文章的目的是要实现长时间掉电情况下系统时间信息不丢失。上面基础的框架已经由Microsoft和Intel的兄弟写好了,我们要做的只是加入2、3行代码而已

当然首先你的硬件平台要有一个带备用电池的的实时时钟芯片(如RTC4513),关于这种芯片的驱动请参考相关datasheet。然后修改OEMSetRealTime函数,也就是将系统设置的时间写回到外部的这个时钟芯片里,简单的一句加在Done:之前即可:
RTC4513SetRealTime(pTime);

接下来修改OALIoCtlHalInitRTC函数,保证在系统重启时用外部时钟来初始化系统时间。在rc = OEMSetRealTime(pTime);前加入:
RTC4513GetRealTime(pTime);

当然,这新加入的两个函数需要根据你所采用的时钟芯片来实现,具体实现就不在本文的讨论范围内了。

最后,别忘了在OEMInit函数里添加必要的外部时钟初始化部分,有必要时需要进行时钟校正。

现在知道为什么大多数PDA在断电后需要重新设置系统时间了吧,就是因为他们没有采用带备用电池的外部时钟,所以它的关机按钮也只是关闭屏幕待机而已,当然它不真正的掉电关机还因为Windows CE的数据是保存在RAM而非Flash里,接下来我还会写篇文章专门介绍如何掉电保存注册表和数据文件。

posted on 2007-06-20 14:47  JasonYe  阅读(2078)  评论(1编辑  收藏  举报

导航