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

}

时间: 2025-01-21 10:24:11

vxworks for x86读取bios时间的解决方法的相关文章

时间病毒解决方法

一.为什么时间会自动变化 原因1.由于电脑主板电池没电的原因,导致电脑上的时间出现了错误,也算是回到出厂设置阶段,这时候我们的解决方法就是将主板电池进行更换即可.不过这种情况一般都很少见.如图所示: 原因2.由于中了病毒或者木马,病毒为了防止杀毒软件的查杀,从而更改了电脑时间,导致某些杀毒软件失效,不能正常工作. 二.时间病毒解决方法 我们可以下载一些优化软件,例如优化大师.360安全卫士等,都有对时间保护的设置,我们只需要对其进行具体的设置即可.下面是360安全卫士对系统时间的保护工具,我们点

PHP请求远程地址设置超时时间的解决方法_php技巧

php请求远程地址设置超时时间,主要讲解file_get_contents.fopen.curl这三个简单常用函数设置超时时间的方法,一般情况下建议使用curl,性能最好,效率也最高. 1.file_get_contents 请求超时设置 $timeout = array( 'http'=> array( 'timeout'=>5//设置一个超时时间,单位为秒 ) ); $ctx = stream_context_create($timeout); $text = file_get_conte

php使用fgetcsv读取csv文件乱码解决方法

例子    代码如下 复制代码 function get_csv_contents( $file_target ){  $handle  = fopen( $file_target, 'r');  while ($data = fgetcsv($handle, 1000, ",")) {     $num = count($data);   echo "<p> $num fields in line $row: <br>n";   $row+

PHP中date()函数取得时间错误解决方法

通过date()函数获取时间后,发现小时时间不对,比现在的时间小8个小时,无论用H,还是用h都一样,这个是因为当前获取的是格林威治时间,与北京时间相差8小时. 解决方法如下 : 1.修改php.ini配置文件 打开php.ini文件,一般在php配置根目录下,找到其中的 ;date.timezone,删掉前面的分号,并改为date timezone = PRC.保存,重启Apahce服务即可(有时用restart会有问题,先stop然后start就行了). 2.加上date_default_ti

php读取mssql时间显示格式解决办法

 代码如下 复制代码 while( $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_ASSOC))  {    print_r($row['datetime']);//这个字段是mssql的时间格式 } 结果是 DateTime Object (     [date] => 2011-10-20 00:00:00     [timezone_type] => 3     [timezone] => Asia/Chongqing ) 解决办

PHP读取文件乱码的解决方法

  php 5的流读取函数好像默认编码是UTF-8,以前在php 4里直接file_get_contents()读取gb2312编码的正常,到了5就乱码了.网上的解决办法说抓取后用iconv()转码.看后我就觉 得不对劲:一个是不一定编译了iconv库,更大的问题是编码都跟流转换的时候有关(如果用了iconv实际上php转了两次码:流 -> UTF-8 -> GB2312):这不是白忙乎了吗? 仔细看了下php的文档(不知道大家都是怎么写代码的,其实文档上很清楚啊),上面关于fopen()及f

笔记本电脑系统时间不准解决方法

BIOS里设置时间 我们可以先在BISO里设置正确的时间,看看长时间不开机还有没有这种情况 主板电池没电 这是比较常见的一种情况,在我们的笔记本主板上,有一个纽扣电池,像我们BIOS的密码呀,硬盘光驱的启动程序呀,也都是通过主板电池供电的. 如果在BIOS里设置了正确的时间,但是过一阵还是不准确,那很有可能就是这块小电池没电了.但是笔记本不同于台式机,如果没有经验的读者,我还是建议大 家找专业的维修店更换一块电池,花不了几个钱的.注意:?主板电池没电,石英损坏请找专业拆机,自己会的话自己操作!

win7无法读取dvd光驱的解决方法

  虽然现在很少有人使用光盘来刻录东西了,但是还是有一些使用群体在使用着光盘,比如说在影像店购买的电影光盘.明星的CD,还有就是婚纱店的相册光盘,他们都在使用着光盘.有时就会遇到电脑无法读取光盘的现象,遇到这种情况该怎么办呢?是不是就说明了光盘坏了,还是电脑没有配备光驱呢?下面小编就来为大家罗列几个电脑无法读取光盘的原因吧!大家赶紧去排查一下! 其实这个问题早在Vista系统时代就已经存在了,造成这个问题的原因也很简单,因为系统中的某个功能被开启而导致了无法识别光盘文件.下面咱们具体介绍一下解决

XP下不能更改系统时间的解决方法

  单击xp系统托盘中的时间图标时,系统弹出"您没有适当的特权级,所以无法更改'系统时间'"的提示,不能修改系统时间. 这可能是因为当前所使用的账户的更改系统时间的权限受限制了,此时可通过下面的步骤进行解决. 第1步:以系统管理员的账户登录系统,依次执行"开始"-"运行"命令,在"运行"对话框中输入"gpedit.nisc"后单击"确定"按钮,打开"组策略"窗口. 第