check_815
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2007-11-03
  • 粉丝0
  • 关注0
  • 积分35分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:3311回复:5

vxworks for x86读取bios时间

楼主#
更多 发布于:2004-05-11 13:34
 系统时间与bsp有关,在vzworks for x86系列的目标没有直接读取RTC(实时时钟控制器)的函数,用time.h中的函数读到的始终是 00:00:00, Jan. 1 1970.
  所以在x86系列的机器中,我们可以从bios中读取当前的时钟。用sysInByte(),sysOutByte(),在70,和71端口读取或写bios里的时间.
  首先要分析bios的内容,找出秒,分,时,天,月,年的存放地址。
他们分别是: 0x00,0x02,0x04,0x07,0x08,0x09
然后从71端口读出相应的值,进行转换。
如:秒
  sysOutByte(0x70,0x00);
  second = sysInByte(0x71);
读出的second进行转换,:
  second = (second &0x0F) + 10*((second &0xF0)>>4);

示例代码:
time_t biostime()
{
  struct tm   ahora;
  unsigned char cHour, cMin, cSec;
  unsigned char cDay, cMonth, cYear;

  sysOutByte(0x70,0x00/*second*/);
  cSec = sysInByte(0x71);
  ahora.tm_sec = (cSec&0x0F) + 10*((cSec&0xF0)>>4);

  sysOutByte(0x70,0x02/*minut*/);
  cMin = sysInByte(0x71);
  ahora.tm_min = (cMin&0x0F) + 10*((cMin&0xF0)>>4);

  sysOutByte(0x70,0x04/*hour*/);
  cHour = sysInByte(0x71);
  ahora.tm_hour = (cHour&0x0F) + 10*((cHour&0xF0)>>4);

 
  sysOutByte(0x70,0x07/*day*/);
  cDay = sysInByte(0x71);
  ahora.tm_mday = (cDay&0x0F) + 10*((cDay&0xF0)>>4);

  sysOutByte(0x70,0x08/*month*/);
  cMonth = sysInByte(0x71);
  ahora.tm_mon = (cMonth&0x0F) + 10*((cMonth&0xF0)>>4) - 1;

  sysOutByte(0x70,0x09/*year*/);
  cYear = sysInByte(0x71);
  ahora.tm_year = 100 + (cYear&0x0F) + 10*((cYear&0xF0)>>4);

  return mktime(&ahora);
}
我们在系统初始化时读取bios时间一次,然后修改系统时钟:

 clock_settime(..)
以后我们得到的时间就都是当前的正确时间
示例:
void inittime()
{
  int res;
  struct timespec ts;
  struct tm daytime;
  time_t stime;

  ts.tv_sec = biostime();
  ts.tv_nsec = 0;
  res = clock_settime(CLOCK_REALTIME, &ts);
 
  stime = time(NULL);
 
  daytime = *localtime(&stime);
  printf ( \"time is :%s\\n\", asctime(&daytime) );

}

aquariuscamus
驱动小牛
驱动小牛
  • 注册日期2004-02-18
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-11 22:11
好哦,学了就共享大家,支持!!给分
我的邮件地址:hwybird@sohu。com,两三天看一次
edward7556
驱动牛犊
驱动牛犊
  • 注册日期2007-07-23
  • 最后登录2008-05-27
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-23 19:00
楼上的兄弟 你那个sysOutByte在那定义的呢?
hwybird
论坛版主
论坛版主
  • 注册日期2006-11-11
  • 最后登录2010-08-31
  • 粉丝0
  • 关注0
  • 积分988分
  • 威望359点
  • 贡献值0点
  • 好评度96点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-08-20 17:00
在for x86的映像库中有定义
wbc515
驱动牛犊
驱动牛犊
  • 注册日期2005-08-22
  • 最后登录2007-12-30
  • 粉丝0
  • 关注0
  • 积分52分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-17 17:27
我把这段代码加到.c文件里,怎么编译不了呢?time_t那里卡住了.
xxllff1
驱动牛犊
驱动牛犊
  • 注册日期2007-08-13
  • 最后登录2008-02-22
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-11-20 15:47
谢谢楼主分享,试试先。
游客

返回顶部