WinCE系统时间年份不准的问题(记录)

WinCE系统时间年份不准的问题(记录)

近来发现一个奇怪问题,我们WinCE设备的系统时间年份不准。具体情况是:过了2010年之后,系统时间每当到了整分的时候,年份会跳变到2016,然后马上又跳回2010。而且更恶劣的是,双击右下角的时间图标,打开“日期/时间属性”对话框查看,是发现不到这个现象的。为此我编写了一段小代码,在代码中获取系统时间,然后将时间显示到一个Static控件上。这样就能够很容易发现这个现象。如果人为的将系统时间2010改为2011年,则现象就变为了2011跳变到2017再跳回2011。这个小小的跳变将导致很多应用程序出错。

后来打开\KERNEL\HAL\ARM下的timer.c文件。出现上述问题的代码段已经被找到:


view plaincopy to clipboardprint?

[cope]

近来发现一个奇怪问题,我们WinCE设备的系统时间年份不准。具体情况是:过了2010年之后,系统时间每当到了整分的时候,年份会跳变到2016,然后马上又跳回2010。而且更恶劣的是,双击右下角的时间图标,打开“日期/时间属性”对话框查看,是发现不到这个现象的。为此我编写了一段小代码,在代码中获取系统时间,然后将时间显示到一个Static控件上。这样就能够很容易发现这个现象。如果人为的将系统时间2010改为2011年,则现象就变为了2011跳变到2017再跳回2011。这个小小的跳变将导致很多应用程序出错。

后来打开\KERNEL\HAL\ARM下的timer.c文件。出现上述问题的代码段已经被找到:


view plaincopy to clipboardprint?

  • lpst->wSecond    = FROM_BCD(s2440RTC->rBCDSEC & 0x7f);  

  • lpst->wMinute       = FROM_BCD(s2440RTC->rBCDMIN & 0x7f);  

  • lpst->wHour   = FROM_BCD(s2440RTC->rBCDHOUR& 0x3f);  

  • lpst->wDayOfWeek = (s2440RTC->rBCDDATE - 1);  

  • lpst->wDay    = FROM_BCD(s2440RTC->rBCDDAY & 0x3f);  

  • lpst->wMonth = FROM_BCD(s2440RTC->rBCDMON & 0x1f);  

  • // lpst->wYear = (2000 + s2440RTC->rBCDYEAR) ; 

  • lpst->wYear    = FROM_BCD(s2440RTC->rBCDYEAR) + 2000 ;   

  • if ( lpst->wSecond == 0 )  

  • {  

  •        lpst->wSecond    = FROM_BCD(s2440RTC->rBCDSEC & 0x7f);  

  •        lpst->wMinute       = FROM_BCD(s2440RTC->rBCDMIN & 0x7f);  

  •        lpst->wHour          = FROM_BCD(s2440RTC->rBCDHOUR& 0x3f);  

  •        lpst->wDayOfWeek = (s2440RTC->rBCDDATE - 1);  

  •        lpst->wDay           = FROM_BCD(s2440RTC->rBCDDAY & 0x3f);  

  •        lpst->wMonth = FROM_BCD(s2440RTC->rBCDMON & 0x1f);  

  •        lpst->wYear = (2000 + s2440RTC->rBCDYEAR) ;   

  • }  

lpst->wSecond    = FROM_BCD(s2440RTC->rBCDSEC & 0x7f);lpst->wMinute       = FROM_BCD(s2440RTC->rBCDMIN & 0x7f);lpst->wHour   = FROM_BCD(s2440RTC->rBCDHOUR& 0x3f);lpst->wDayOfWeek = (s2440RTC->rBCDDATE - 1);lpst->wDay    = FROM_BCD(s2440RTC->rBCDDAY & 0x3f);lpst->wMonth = FROM_BCD(s2440RTC->rBCDMON & 0x1f);// lpst->wYear = (2000 + s2440RTC->rBCDYEAR) ; lpst->wYear    = FROM_BCD(s2440RTC->rBCDYEAR) + 2000 ; if ( lpst->wSecond == 0 ){       lpst->wSecond    = FROM_BCD(s2440RTC->rBCDSEC & 0x7f);       lpst->wMinute       = FROM_BCD(s2440RTC->rBCDMIN & 0x7f);       lpst->wHour          = FROM_BCD(s2440RTC->rBCDHOUR& 0x3f);       lpst->wDayOfWeek = (s2440RTC->rBCDDATE - 1);       lpst->wDay           = FROM_BCD(s2440RTC->rBCDDAY & 0x3f);       lpst->wMonth = FROM_BCD(s2440RTC->rBCDMON & 0x1f);       lpst->wYear = (2000 + s2440RTC->rBCDYEAR) ; } 

很容看出为什么会是到了整分的时候才会发生这种怪现象?因为是if ( lpst->wSecond == 0 )这个条件判断的原因。看来这个if语句中执行的代码可能存在问题。其中年份的一句代码:lpst->wYear = (2000 + s2440RTC->rBCDYEAR) ; 更改成:
lpst->wYear
= 2000 + FROM_BCD(s2440RTC->rBCDYEAR);问题就好了。
根据别人的指示这个问题解决了。这个BSP包是离职同事在其他BSP包的基础上修改的。还存在一个问题就是SetTimer不准的问题。现在自己还没有能力解决,先记录到这。

[/cope]



lpst->wSecond    = FROM_BCD(s2440RTC->rBCDSEC & 0x7f);lpst->wMinute       = FROM_BCD(s2440RTC->rBCDMIN & 0x7f);lpst->wHour   = FROM_BCD(s2440RTC->rBCDHOUR& 0x3f);lpst->wDayOfWeek = (s2440RTC->rBCDDATE - 1);lpst->wDay    = FROM_BCD(s2440RTC->rBCDDAY & 0x3f);lpst->wMonth = FROM_BCD(s2440RTC->rBCDMON & 0x1f);// lpst->wYear = (2000 + s2440RTC->rBCDYEAR) ; lpst->wYear    = FROM_BCD(s2440RTC->rBCDYEAR) + 2000 ; if ( lpst->wSecond == 0 ){       lpst->wSecond    = FROM_BCD(s2440RTC->rBCDSEC & 0x7f);       lpst->wMinute       = FROM_BCD(s2440RTC->rBCDMIN & 0x7f);       lpst->wHour          = FROM_BCD(s2440RTC->rBCDHOUR& 0x3f);       lpst->wDayOfWeek = (s2440RTC->rBCDDATE - 1);       lpst->wDay           = FROM_BCD(s2440RTC->rBCDDAY & 0x3f);       lpst->wMonth = FROM_BCD(s2440RTC->rBCDMON & 0x1f);       lpst->wYear = (2000 + s2440RTC->rBCDYEAR) ; } 

很容看出为什么会是到了整分的时候才会发生这种怪现象?因为是if ( lpst->wSecond == 0 )这个条件判断的原因。看来这个if语句中执行的代码可能存在问题。其中年份的一句代码:lpst->wYear = (2000 + s2440RTC->rBCDYEAR) ; 更改成:
lpst->wYear
= 2000 + FROM_BCD(s2440RTC->rBCDYEAR);问题就好了。
根据别人的指示这个问题解决了。这个BSP包是离职同事在其他BSP包的基础上修改的。还存在一个问题就是SetTimer不准的问题。现在自己还没有能力解决,先记录到这。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值