7105|20

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince的系统时钟问题 [复制链接]

各位大虾,小弟这几天调试ARM板,发现一个问题,本来开机后系统运行的很流畅,过一会后发现系统时间变成0:00了,于是小弟打开了时间设置界面进行时间设置,发现系统变得极卡无比,关机开机后也运行的很卡,不知道有没有人遇见这种问题,请各位大虾帮忙!我用的是wince4.2+s3c2440!

最新回复

我在TCC7801上也遇到过这种情况,是OEMSetRealTime函数的问题.  详情 回复 发表于 2009-3-25 11:55
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
是的。


当开发板上的电池没电后,系统一启动,时间就是 1753年 时间也不对;

这时系统很卡,不过把时间改到 2003 年后就不卡了。
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的没有电池吗?

我的没有备用电池的时候时间不准也没有出现过你说的卡的现象哦,也是2440
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 
噢!有这样的问题,没有遇到过。
LZ可以建议驱动人员或系统人员给系统设置一个默认的时间,如1977年。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
我用外接电源接到RTC电池处,外接3V代替电池,电压保持不变,开机后比如系统显示为5:33,过几分钟后系统时间就变成0:00,只要不打开时间设置界面就不会卡,但是只要一打开就变得很卡,时间设置对也是一样卡!哎,让人想发疯!
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

6
 
只要不打开时间设置界面就不会卡,但是只要一打开就变得很卡--难道底层RTC函数有错误?

没电的接个外接电源设置一下重启就好了。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
呵呵,你那使用的是外部RTC吧
并且外部RTC驱动没有做好
时间应该读内部RTC,而不是外部RTC,也许你是通过I2C来读的外部RTC来代替读内部RTC
我以前做也遇到这个情况
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(初级)

8
 
卡是正常的,重启就没有问题了
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 
这个问题原来就没有,我是将主频由300M提高到400M后发现这个问题的,如果RTC驱动有问题,原来也应该有问题啊!实在让人搞不懂!各位再帮忙想想!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
主频升高后可能时钟的clock变了,你查查看,或者手动跳到2003看看?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
MARK
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
看起來是你外部的 RTC 的讀寫卡住了, 若是改變時脈後才發生, 原因可能是你原來用的 delay function 是用指令集迴圈來模擬, 時脈變快後, 迴圈執行時變短, 所以就會不穩定.
Solution:
  1. 重寫該 OEMGetRealTime & OEMSetRealTime functions.
  2. 在該 RTC access code 內加入 timeout 或是 retry times 的限制, 試幾次不行就將上一次讀到的值傳回去, 過個幾秒再讀可能就又可以了.
  3. 將該 delay function 再加長.
  4. 開機時, 將 CPU 內部 RTC 與外部 RTC 同步, 以後讀內部, 再定時同步外部的.

不保證哪一個一定可以, 或許上面 4 個全部都要, 試試看吧.
RD = Retry to Die

Paul, Chao
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

13
 
检测RTC 实际上可能是RTC初始化寄存器发生错误 比如向寄存器写入了非法的值,出错的时候 你把RTC寄存器的值打印出来看看。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

14
 
在2440上面也遇到过这个问题,当时好象是由于没有接电池导致的,装上电池后就正常了,觉得应该是跟RTC有关
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

15
 
mark
我以前遇到的情况是时间不走。呵呵。结果是硬件上做的时候把RTC断开了。。。呵呵。郁闷了一段时间
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

16
 
大家看看我的OEMSetRealTime和OEMGetRealTime函数有没有问题?
BOOL
OEMGetRealTime(LPSYSTEMTIME lpst)
{
        volatile RTCreg *s2440RTC;

        s2440RTC = (RTCreg *)RTC_BASE;
   
        // enable RTC control
        s2440RTC->rRTCCON = 0x1;
        lpst->wMilliseconds = 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         = 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 +FROM_BCD(s2440RTC->rBCDYEAR) ;
        }
        // disable RTC control
        s2440RTC->rRTCCON = 0;

        return TRUE;
       
}

BOOL
OEMSetRealTime(LPSYSTEMTIME lpst)
{
        volatile RTCreg *s2440RTC = (RTCreg *)RTC_BASE;
        static int firsttime = 0;

        // enable RTC control
        s2440RTC->rRTCCON =  0x1;

        s2440RTC->rBCDSEC  = (unsigned char)TO_BCD(lpst->wSecond );
        s2440RTC->rBCDMIN  = (unsigned char)TO_BCD(lpst->wMinute );
        s2440RTC->rBCDHOUR = (unsigned char)TO_BCD(lpst->wHour   );

        s2440RTC->rBCDDATE = (unsigned char)(lpst->wDayOfWeek + 1);
// 取消冷启动初次设置时的自动值
        if ( firsttime == 0 )
        {
                if((lpst->wYear<2000)||(lpst->wYear>2100)||(lpst->wDay>31)||(lpst->wMonth>12))
                {
                lpst->wYear = 2009;        lpst->wMonth = 1;        lpst->wDay = 1;
                }
                OEMGetRealTime(lpst) ;
                firsttime = 1;
        }

        s2440RTC->rBCDDAY  = (unsigned char)TO_BCD(lpst->wDay    );
        s2440RTC->rBCDMON  = (unsigned char)TO_BCD(lpst->wMonth  );
        s2440RTC->rBCDYEAR = (unsigned char)TO_BCD((lpst->wYear % 100));

        // disable RTC control
        s2440RTC->rRTCCON = 0; //&= ~0x1;
       
        //OEMSetAlarmTime( lpst );
        // Just certify heart bit
//        timer_cnt = 0;

        return TRUE;
}
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

17
 
在 OEMSetRealTime 中, 又去呼叫了 OEMGetRealTime, 不幸地, 在 OEMGetRealTime 倒數第 2 行中, s2440RTC->rRTCCON = 0;

所以在 OEMSetRealTime 最後幾行設定 rBCDDAY, rBCDMON, rBCDYEAR, 可能會 exception, 也可能會.................

基本上, Samsung 的 BSP 其軟體工程是做的非常差地, 只看它的 CODE, 你的軟體寫作功力是會退步地.

不過, 這份 code 好像跟 reference board 的不一樣, 所以也可能是被後人改壞的.

Paul, Chao @ Techware
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 12 楼 xajhuang 的回复:
检测RTC 实际上可能是RTC初始化寄存器发生错误 比如向寄存器写入了非法的值,出错的时候 你把RTC寄存器的值打印出来看看。


赞同,很有可能是你向寄存器写了非法的值。该向哪个寄存器写哪个值一定要对应好。

还有不知道你有没有在系统起来的时候设个初始值?OALIoCtlHalInitRTC此函数有实现在启动os的时候对rtc初始化。

 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

19
 
谢谢各位帮忙,我再看看我的代码!
另外,各位有没有遇见过这样的问题,我用TCPMP播放视频的时候,尤其是稍大一点的AVI格式文件时,会一卡一卡的,并且隔几秒就会有嘟嘟声,但是只要选择不输出音频就不卡了,我测量过采样频率,和我在软件中设置的一样,没有问题,不知道是什么原因造成的!有人说是中断线程反应过慢?小弟不知该怎么使中断线程反应加快!大虾们看看!
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

20
 
在OEMSetRealTime 里设了RTCCON,会使OEMSetRealTime相应设定出现exception啊,我们同事之前试过  
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表