各位大虾,小弟这几天调试ARM板,发现一个问题,本来开机后系统运行的很流畅,过一会后发现系统时间变成0:00了,于是小弟打开了时间设置界面进行时间设置,发现系统变得极卡无比,关机开机后也运行的很卡,不知道有没有人遇见这种问题,请各位大虾帮忙!我用的是wince4.2+s3c2440!
是的。
当开发板上的电池没电后,系统一启动,时间就是 1753年 时间也不对;
这时系统很卡,不过把时间改到 2003 年后就不卡了。
你的没有电池吗?
我的没有备用电池的时候时间不准也没有出现过你说的卡的现象哦,也是2440
噢!有这样的问题,没有遇到过。
LZ可以建议驱动人员或系统人员给系统设置一个默认的时间,如1977年。
我用外接电源接到RTC电池处,外接3V代替电池,电压保持不变,开机后比如系统显示为5:33,过几分钟后系统时间就变成0:00,只要不打开时间设置界面就不会卡,但是只要一打开就变得很卡,时间设置对也是一样卡!哎,让人想发疯!
只要不打开时间设置界面就不会卡,但是只要一打开就变得很卡--难道底层RTC函数有错误?
没电的接个外接电源设置一下重启就好了。
呵呵,你那使用的是外部RTC吧
并且外部RTC驱动没有做好
时间应该读内部RTC,而不是外部RTC,也许你是通过I2C来读的外部RTC来代替读内部RTC
我以前做也遇到这个情况
这个问题原来就没有,我是将主频由300M提高到400M后发现这个问题的,如果RTC驱动有问题,原来也应该有问题啊!实在让人搞不懂!各位再帮忙想想!
主频升高后可能时钟的clock变了,你查查看,或者手动跳到2003看看?
看起來是你外部的 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
检测RTC 实际上可能是RTC初始化寄存器发生错误 比如向寄存器写入了非法的值,出错的时候 你把RTC寄存器的值打印出来看看。
在2440上面也遇到过这个问题,当时好象是由于没有接电池导致的,装上电池后就正常了,觉得应该是跟RTC有关
mark
我以前遇到的情况是时间不走。呵呵。结果是硬件上做的时候把RTC断开了。。。呵呵。郁闷了一段时间
大家看看我的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;
}
在 OEMSetRealTime 中, 又去呼叫了 OEMGetRealTime, 不幸地, 在 OEMGetRealTime 倒數第 2 行中, s2440RTC->rRTCCON = 0;
所以在 OEMSetRealTime 最後幾行設定 rBCDDAY, rBCDMON, rBCDYEAR, 可能會 exception, 也可能會.................
基本上, Samsung 的 BSP 其軟體工程是做的非常差地, 只看它的 CODE, 你的軟體寫作功力是會退步地.
不過, 這份 code 好像跟 reference board 的不一樣, 所以也可能是被後人改壞的.
Paul, Chao @ Techware
引用: 引用 12 楼 xajhuang 的回复:
检测RTC 实际上可能是RTC初始化寄存器发生错误 比如向寄存器写入了非法的值,出错的时候 你把RTC寄存器的值打印出来看看。
赞同,很有可能是你向寄存器写了非法的值。该向哪个寄存器写哪个值一定要对应好。
还有不知道你有没有在系统起来的时候设个初始值?OALIoCtlHalInitRTC此函数有实现在启动os的时候对rtc初始化。
谢谢各位帮忙,我再看看我的代码!
另外,各位有没有遇见过这样的问题,我用TCPMP播放视频的时候,尤其是稍大一点的AVI格式文件时,会一卡一卡的,并且隔几秒就会有嘟嘟声,但是只要选择不输出音频就不卡了,我测量过采样频率,和我在软件中设置的一样,没有问题,不知道是什么原因造成的!有人说是中断线程反应过慢?小弟不知该怎么使中断线程反应加快!大虾们看看!
在OEMSetRealTime 里设了RTCCON,会使OEMSetRealTime相应设定出现exception啊,我们同事之前试过