閱讀89 返回首頁    go 京東網上商城


vxworks for x86讀取bios時間的解決方法

vxworks for x86讀取bios時間的解決方法

 係統時間與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) );

}

最後更新:2017-04-03 12:56:25

  上一篇:go 最近我在學習c++,為android項目做準備。
  下一篇:go flare-spork: 自己維護的Pig on Spark項目