在系统重启(冷启动)时,内核会调用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行代码而已
![emsmilep.gif](https://www.cnblogs.com/CuteSoft_Client/CuteEditor/images/emsmilep.gif)
当然首先你的硬件平台要有一个带备用电池的的实时时钟芯片(如RTC4513),关于这种芯片的驱动请参考相关datasheet。然后修改OEMSetRealTime函数,也就是将系统设置的时间写回到外部的这个时钟芯片里,简单的一句加在Done:之前即可:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
接下来修改OALIoCtlHalInitRTC函数,保证在系统重启时用外部时钟来初始化系统时间。在rc = OEMSetRealTime(pTime);前加入:
![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
当然,这新加入的两个函数需要根据你所采用的时钟芯片来实现,具体实现就不在本文的讨论范围内了。
最后,别忘了在OEMInit函数里添加必要的外部时钟初始化部分,有必要时需要进行时钟校正。
现在知道为什么大多数PDA在断电后需要重新设置系统时间了吧,就是因为他们没有采用带备用电池的外部时钟,所以它的关机按钮也只是关闭屏幕待机而已,当然它不真正的掉电关机还因为Windows CE的数据是保存在RAM而非Flash里,接下来我还会写篇文章专门介绍如何掉电保存注册表和数据文件。