vxworks for x86读取bios时间的解决方法

简介: <p style="text-indent:2em">vxworks for x86读取bios时间的解决方法</p> <p style="text-indent:2em"> 系统时间与bsp有关,在vzworks for x86系列的目标没有直接读取RTC(实时时钟控制器)的函数,用time.h中的函数读到的始终是 00:00:00, Jan. 1 1970.</p> <p styl

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) );

}

相关文章
|
2月前
|
安全 程序员 开发者
BIOS/DOS功能调用:深入解析与代码实践
BIOS/DOS功能调用:深入解析与代码实践
|
8月前
|
网络协议 安全 Linux
2.2.3开机流程中的BIOS与UEFI开机检测程序
2.2.3开机流程中的BIOS与UEFI开机检测程序
97 0
2.2.3开机流程中的BIOS与UEFI开机检测程序
|
监控 安全
Win系统 - BIOS设置中找不到U盘选项该怎么办?
Win系统 - BIOS设置中找不到U盘选项该怎么办?
324 0
Win系统 - BIOS设置中找不到U盘选项该怎么办?
BIOS里如何设置U盘启动?硬盘怎么设置第一启动项?
查找您当前使用的主板品牌或笔记本品牌的U盘启动快捷键,然后重启电脑。(选择热键前,请先插入启动U盘) (注意:苹果笔记本,开机/重启时按住“option”键[即Alt键]不放,进入选择启动方式。有些笔记本得加上FN键)
1314 0
|
存储 Linux 算法
《操作系统真象还原》——0.20 BIOS中断、DOS中断、Linux中断的区别
BIOS够底层吧?难道它还要依赖别人?是啊,BIOS也是软件,也要有求于别人。首先硬件厂商为了让自己生产的产品易用,肯定事先写好了一组调用接口,必然是越简单越好,直接给接口函数传一个参数,硬件就能返回一个输出,如果不易用的话,厂商肯定倒闭了。
4487 0
|
网络协议 Unix Linux
嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)
Uboot_Kernerl_Add_Watch_Dog:   U-Boot 2010.06 (Nov 01 2013 - 15:28:44) DRAM:  128 MiBCheck spi flash controller v350.
5024 0
|
芯片
BIOS启动过程分析
1        引言 1.1    文档目的 对于电脑用户来说,打开电源启动电脑几乎是每天必做的事情,但计算机在显示这些启动画面的时候在做什么呢?大多数用户都未必清楚了。
1439 0
|
Linux
Linux 磁盘自检介绍
在Linux系统中,有时候重启会耗费非常长的时间,如果你进一步检查细节,就会发现绝大部分时间都耗费在磁盘自检(fsck)上了,有时候遇到时间比较紧急的情况,磁盘自检耗费的时间非常长,真的是让人心焦火急的!如下截图所示        关于磁盘自检,如果是新手,肯定都会有不少疑惑,下面从这几个方面一一讲述,希望能解答你的疑惑。
1376 0
|
存储 缓存 IDE
自制操作系统Antz day04——进入保护模式 (下) 实现内核并从硬盘载入
目前已经完成了MBR的雏形,并且直接操作显卡完成了屏幕的内容显示。接下来我们要改造之前的MBR,做一个大的改进,使MBR可以读取硬盘,因为我们的MBR受限制于512字节大小,在这么小的空间里没法为内核准备好环境,更不要说加载内核到内存中并运行了,所以我们需要在另一个程序中完成初始化环境与加载内核的任务,这个程序我们叫做loader。
1504 0