5776|11

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

GetLocalTime()函数返回的时间值的年份有误 [复制链接]

问题如上所述。我使用的WINCE5.0系统,当系统出现秒数等于0的时候,会出现获取到的年份不对,如下:

15:38:05.875 系统时间:2010年2月1日 15:37:59
15:38:05.938 系统时间:2016年2月1日 15:38:0

这里看到当秒数从59变为0以后,系统时间年份就开始变为2016了。这个并不是偶然的,而是每次都如此。网上说是2010问题,认为是BSP的函数OEMGetRealTime()的bug所导致的。于是找到这个函数,可是并没有发现网上所说的问题,关键部分如下:

    pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);
    do {
        data = INPORT32(&pRTCReg->BCDSEC) & 0x7f;
        seconds = FROM_BCD(data);
        data = INPORT32(&pRTCReg->BCDYEAR);
        pTime->wYear = FROM_BCD(data) + RTC_YEAR_DATUM;
        data = INPORT32(&pRTCReg->BCDMON) & 0x1f;
        pTime->wMonth = FROM_BCD(data);
        data = INPORT32(&pRTCReg->BCDDAY) & 0x3f;
        pTime->wDay = FROM_BCD(data);
        pTime->wDayOfWeek = (WORD)INPORT32(&pRTCReg->BCDDATE) - 1;
        data = INPORT32(&pRTCReg->BCDHOUR) & 0x3f;
        pTime->wHour = FROM_BCD(data);
        data = INPORT32(&pRTCReg->BCDMIN) & 0x7f;
        pTime->wMinute = FROM_BCD(data);
        data = INPORT32(&pRTCReg->BCDSEC) & 0x7f;
        pTime->wSecond = FROM_BCD(data);
        pTime->wMilliseconds = 0;
    } while (pTime->wSecond != seconds);

无可奈何之下,我只好做了一些投机的办法,就是当读取到秒数为0的时候,则不获取时间值。可是,随后我发现,在分钟跳变的时候,也会出现年份的异常,虽然概率要比秒数为0的少了很多,如下:

17:11:06.094 [GetTime]系统时间:2010-2-1 17:10:59
17:11:07.594 [GetTime]系统时间:2016-2-1 17:11:1

17:33:06.109 [GetTime]系统时间:2010-2-1 17:32:59
17:33:07.609 [GetTime]系统时间:2016-2-1 17:33:1

从上面的两部分输出看到跳变都是发生在秒数改变导致分数改变的时候,不过因为我已经过滤了秒数为0的情况,所以概率会很低。我估计了一下,有一段时间是20分钟左右才会出现,因为不是每次跳变都会出现,下面是不会出现的输出,给大家比较一下:
17:30:06.672 [GetTime]系统时间:2010-2-1 17:29:59
17:30:07.609 [GetTime]系统时间:2010-2-1 17:30:1

17:31:06.234 [GetTime]系统时间:2010-2-1 17:30:59
17:31:07.609 [GetTime]系统时间:2010-2-1 17:31:1

17:32:06.234 [GetTime]系统时间:2010-2-1 17:31:59
17:32:07.422 [GetTime]系统时间:2010-2-1 17:32:1

有谁遇到过这个问题的吗?怎么解决的?本人的cpu是三星的2440


最新回复

见上面的回复,已经说明了怎么解决  详情 回复 发表于 2010-3-1 09:37
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
http://blog.eeworld.net/constantine/archive/2008/10/15/3080104.aspx
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 accessysq 的回复:
http://blog.eeworld.net/constantine/archive/2008/10/15/3080104.aspx


学习啦!
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
JOYZML达人研究过这个问题,你可以看一下他的博客,嘻嘻…
网址:JOYZML博客
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个要学习一下,看看我们的有没有这个问题。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 1 楼 accessysq 的回复:
http://blog.eeworld.net/constantine/archive/2008/10/15/3080104.aspx


这个我已经看过了,现在BSP里面的代码已经修改过来了,跟contentine的并不一样。上面我已经贴出了代码。还有其他的原因吗?
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 wolfmvp 的回复:
JOYZML达人研究过这个问题,你可以看一下他的博客,嘻嘻…
网址:JOYZML博客


JOYZML博客的已经拜访过,不过我并没有发现所谓的timer.c文件,因为bsp并不是我建立的。不过我在RTC.c文件中找到了OEMSetRealTime(),这里是对cpu的RTC寄存器进行读取的地方,代码如上面所粘贴。可是,并没有发现这段代码有何问题哦。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
好诡异的问题 学习下
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
我们也有遇到时间不对的情况,但不是每次都发生。怀疑是上层AP有错误设置造成。。

楼主可以加入打印信息看看是否错误调用了OEMSetRealTime,时间被修改了呢?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
问题已经找到,诚如1楼和3楼所说。虽然当初我也看过这两个帖子,不过没有做到很细致。之所以没有找到timer.c文件,是因为找错了BSP包。问题确实是因为年份在second等于0的时候没有做出BCD格式化的原因。感谢1楼和3楼,让我重新细致的检查了一遍!
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

11
 
也碰到了相同的问题,想参考下楼主是怎么解决的额
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
见上面的回复,已经说明了怎么解决
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表