xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
阅读:2104回复:8

wince的时间问题。

楼主#
更多 发布于:2005-05-09 08:48
在我的ARM9开发板上,处理器有一个RTC;为了断电后让时间继续走,加了个DS1337,由电池对DS1337进行供电。在系统启动时,从DS1337读取时间来更新系统时间。
现在的问题是:对于从DS1337读时间来更新当前时间,是针对DS1337写一个驱动程序,在驱动程序初始化进行?还是在OEMSetRealTime函数里来实现?修改时间的话,又是在哪个函数里把修改的时间写到DS1337里去呢?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-09 14:14
只需要实现oemsetrealtime和oemgetrealtime就可以了,驱动和上层应用可以通过setsystemtime和getsystemtime的api来工作。
根据地的兄弟们,团结就是力量
xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-09 14:56
你的意思是说,在函数oemgetrealtime里把ds1337里的时间读出来更新系统时间,在函数oemsetrealtime里把当前的系统时间写到ds1337里去吗?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-09 16:17
对头。
对了,你认为系统时间的来源不是rtc?我认为系统时间(也就是桌面上显示的那个)本身就是从rtc读出来的阿,除非你说的你显示的时间事自己做的。我错了吗?,讨论一下:))
根据地的兄弟们,团结就是力量
xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-10 14:26
我觉得系统时间是来自处理器的RTC,但是处理器的RTC每次上电后就从0开始计时,所以在我的开发板上有一个由电池供电的DS1337,每次上电时就把DS1337里的时间读出来,然后从读出来的时间开始计时,这样系统时间就准了.
xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-10 14:38
系统时间是从处理器的RTC里通过调用oemgetrealtime读出来的.

我是不是应该在InitClock函数里把我的DS1337里的时间读出来,更新处理器的RTC?如果是在oemgetrealtime里去读DS1337里的时间的话,系统时间就是直接从DS1337里去读了,这样很浪费系统资源的,因为DS1337是用I2C总线连接的.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-10 15:53
喔,你是这个意思啊:))

你说的办法都可以,第一,你可以完全不管SOC里面的RTC,而所有的OEMSETREALTIME,OEMGETREALTIME都从外部RTC操作,这样虽然使用的是I2C,但这个操作频率不是很高,不会有太大问题的。第二,你在启动的时候把外部RTC读到内部RTC也是个办法,可以的。
根据地的兄弟们,团结就是力量
xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-10 18:25
我试了三个方法:1专门写一个驱动;2,用OEMSETREALTIME来更新DS1337时间和用EMGETREALTIME函数来从DS1337里取时间更新系统时间;3,在InitClock里从DS1337读取时间来更新系统时间,并用OEMSETREALTIME来更新DS1337时间.
但是三个方法都有问题:
方法1:可以正确更新时间,但是如果要更新DS1337的时间就要专门写一个程序来写DS1337这个设备,否则用户更改的时间无法写道DS1337里去.
方法2:从DS1337读取时间,写时间到DS1337和更新系统时间都会有问题,好像就乱了.
方法3:在InitClock函数里用SetLocalTime函数更新系统时间,但是用PB编译时系统提示错误认不出SetLocalTime函数,而我已经包含了相应的头文件了.真奇怪.

一个简单的问题烦了我这么久,唉,郁闷.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-11 14:36
郁闷啥子喃,眼看革命就要成功了嘛:)))

方法二是标准方式,在检查一下,肯定没问题,这个我确定

方法三你在INITCLOCK利用API?兄弟儿,这个函数在OEMINIT里面喔,内核能用API嘛,肯定不行三,你直接读写硬件就行了
根据地的兄弟们,团结就是力量
游客

返回顶部