wince的系统时钟问题

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

回复评论 (20)

是的。


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

这时系统很卡,不过把时间改到 2003 年后就不卡了。
点赞  2009-3-23 15:15
你的没有电池吗?

我的没有备用电池的时候时间不准也没有出现过你说的卡的现象哦,也是2440
点赞  2009-3-23 15:32
噢!有这样的问题,没有遇到过。
LZ可以建议驱动人员或系统人员给系统设置一个默认的时间,如1977年。
点赞  2009-3-23 15:36
我用外接电源接到RTC电池处,外接3V代替电池,电压保持不变,开机后比如系统显示为5:33,过几分钟后系统时间就变成0:00,只要不打开时间设置界面就不会卡,但是只要一打开就变得很卡,时间设置对也是一样卡!哎,让人想发疯!
点赞  2009-3-23 15:37
只要不打开时间设置界面就不会卡,但是只要一打开就变得很卡--难道底层RTC函数有错误?

没电的接个外接电源设置一下重启就好了。
点赞  2009-3-23 15:54
呵呵,你那使用的是外部RTC吧
并且外部RTC驱动没有做好
时间应该读内部RTC,而不是外部RTC,也许你是通过I2C来读的外部RTC来代替读内部RTC
我以前做也遇到这个情况
点赞  2009-3-23 15:59
卡是正常的,重启就没有问题了
点赞  2009-3-23 21:45
这个问题原来就没有,我是将主频由300M提高到400M后发现这个问题的,如果RTC驱动有问题,原来也应该有问题啊!实在让人搞不懂!各位再帮忙想想!
点赞  2009-3-24 08:16
主频升高后可能时钟的clock变了,你查查看,或者手动跳到2003看看?
点赞  2009-3-24 09:49
MARK
点赞  2009-3-24 10:01
看起來是你外部的 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
点赞  2009-3-24 11:06
检测RTC 实际上可能是RTC初始化寄存器发生错误 比如向寄存器写入了非法的值,出错的时候 你把RTC寄存器的值打印出来看看。
点赞  2009-3-24 11:50
在2440上面也遇到过这个问题,当时好象是由于没有接电池导致的,装上电池后就正常了,觉得应该是跟RTC有关
点赞  2009-3-24 13:41
mark
我以前遇到的情况是时间不走。呵呵。结果是硬件上做的时候把RTC断开了。。。呵呵。郁闷了一段时间
点赞  2009-3-24 14:30
大家看看我的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;
}
点赞  2009-3-24 17:28
在 OEMSetRealTime 中, 又去呼叫了 OEMGetRealTime, 不幸地, 在 OEMGetRealTime 倒數第 2 行中, s2440RTC->rRTCCON = 0;

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

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

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

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


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

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

点赞  2009-3-24 21:26
谢谢各位帮忙,我再看看我的代码!
另外,各位有没有遇见过这样的问题,我用TCPMP播放视频的时候,尤其是稍大一点的AVI格式文件时,会一卡一卡的,并且隔几秒就会有嘟嘟声,但是只要选择不输出音频就不卡了,我测量过采样频率,和我在软件中设置的一样,没有问题,不知道是什么原因造成的!有人说是中断线程反应过慢?小弟不知该怎么使中断线程反应加快!大虾们看看!
点赞  2009-3-25 08:17
在OEMSetRealTime 里设了RTCCON,会使OEMSetRealTime相应设定出现exception啊,我们同事之前试过  
点赞  2009-3-25 09:06
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复