哪位高手在VxWorks里设置过系统时间吗?我想得到准确时间,是先读BIOS时间,然后再将BIOS时间设为实时时间,我的BIOS时间是读对了,但我再用clock_settime设置系统时间后,但随后读出来的时间就是SUN FEB 06 06:28:15 2106,一直没有变过,不知道是什么原因?我的程序是用论坛上网友的系统时间设置程序,程序是在Pentium目标机上运行的,程序代码如下:
#include "vxWorks.h"
#include <taskLib.h>
#include <stdio.h>
#include <stdlib.h>
#include <sysLib.h>
#include <time.h>
/**************************************************************************
rtc
把RTC配置成功后,更改vxworks的系统时间。
1。首先读取rtc的时间。时,分,秒。。。,
2。利用clock_settime设置系统时间
下面是x86体系读取bios时间的例子。类似你可以读取rtc中的时间:)
系统时间与bsp有关,在vzworks for x86系列的目标没有直接读取
RTC(实时时钟控制器)的函数,用time.h中的函数读到的始时间是
0: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);
我们在系统初始化时读取bios时间一次,然后修改系统时钟:
用
clock_settime(..)
以后我们得到的时间就都是当前的正确时间
***************************************************************************/
time_t GetBIOSTime(void)
{
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 );
printf( "tm_sec = %d\n", ahora.tm_sec );
sysOutByte( 0x70, 0x02 );/*minut*/
cMin = sysInByte( 0x71 );
ahora.tm_min = ( cMin & 0x0F ) + 10 * ( ( cMin & 0xF0 ) >> 4 );
printf( "tm_min = %d\n", ahora.tm_min );
sysOutByte( 0x70, 0x04 );/*hour*/
cHour = sysInByte( 0x71 );
ahora.tm_hour = ( cHour & 0x0F ) + 10 * ( ( cHour & 0xF0 ) >> 4 );
printf( "tm_hour = %d\n", ahora.tm_hour );
sysOutByte( 0x70, 0x07 );/*day*/
cDay = sysInByte( 0x71 );
ahora.tm_mday = ( cDay & 0x0F ) + 10 * ( ( cDay & 0xF0 ) >> 4 );
printf( "tm_mday = %d\n", ahora.tm_mday );
sysOutByte( 0x70, 0x08 );/*month*/
cMonth = sysInByte( 0x71 );
ahora.tm_mon = ( cMonth & 0x0F ) + 10 * ( ( cMonth & 0xF0 ) >>4 );
printf( "tm_mon = %d\n", ahora.tm_mon );
sysOutByte( 0x70, 0x09 );/*year*/
cYear = sysInByte( 0x71 );
ahora.tm_year = ( cYear & 0x0F ) + 10 * ( ( cYear & 0xF0 ) >> 4 );
printf( "tm_year = %d\n", ahora.tm_year );
return mktime( &ahora );
}
/*****************************************************************************
//
// 函数名: SetRTCTime()
// 函数功能:设置当前时间为BIOS(实时时钟)时钟时间
// 返回值:
// 正确为0,错误为-1
******************************************************************************/
int SetRTCTime( void )
{
int res;
struct timespec ts;
ts.tv_sec = GetBIOSTime();
ts.tv_nsec = 0;
res = clock_settime( CLOCK_REALTIME, &ts );
return res;
}
void ctime_test(void)
{
struct tm newtime;
time_t cur;
SetRTCTime();
cur=time((time_t*)NULL);
time(&cur);
newtime=*localtime(&cur);
printf("%s\n",asctime(&newtime));
printf("%s\n",ctime(&cur));
printf("current data:%d-%d-%d\n",newtime.tm_mon,newtime.tm_mday,newtime.tm_year);
printf("current data:%02d-%02d\n",newtime.tm_hour,newtime.tm_min);
}
运行结果如下:
-> ctime_test
tm_sec = 43
tm_min = 11
tm_hour = 19
tm_mday = 11
tm_mon = 8
tm_year = 5
SUN FEB 06 06:28:15 2106
current data:1-6-206
current data:06-28
value = 19 = 0x13
请哪位高手指点一下错误原因!谢谢!