这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 有关VxWorks系统时间设置问题?

共18条 1/2 1 2 跳转至

有关VxWorks系统时间设置问题?

菜鸟
2005-08-12 04:39:43     打赏

哪位高手在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
请哪位高手指点一下错误原因!谢谢!




关键词: 有关     VxWorks     系统     时间     设置     问题     ah    

菜鸟
2005-08-12 22:30:00     打赏
2楼
顶一下,请高手帮帮忙啊!

菜鸟
2005-08-13 17:10:00     打赏
3楼
再顶一下!

菜鸟
2005-08-14 16:55:00     打赏
4楼
再顶一下!

菜鸟
2005-08-15 23:50:00     打赏
5楼

我是个新手,我为了得到相对时间,用过tickGet()来得到开机后系统时钟的个数,然后根据系统时钟的频率,一般是60hz,来计算时间。

不知道对你有没有用

呵呵


菜鸟
2005-08-16 00:41:00     打赏
6楼
luoboqiang兄弟,你这样只能得到相对的时间间隔,不能得到具体的时间吧(某年某月某日某时某分)。

菜鸟
2005-08-17 07:43:00     打赏
7楼
哪位高手能发表一下观点啊!

菜鸟
2005-08-17 19:22:00     打赏
8楼

Kj2714兄弟,我按照你的方法试了一下,还是不行啊,还请你多多指教一下,谢谢了。

其它程序没有变,我就是按照你说的改了一下:


int SetRTCTime( void )
{
struct timespec ts;
ts.tv_sec = GetBIOSTime();
ts.tv_nsec = 0;
if(clock_settime(CLOCK_REALTIME, &ts) == ERROR)
{
printf("clock_settime err\n");
}
tickSet((ULONG)0);
}

但运行结果和以前一模一样。


菜鸟
2005-08-21 08:20:00     打赏
9楼
我按照你上面说的加了延时之后,系统时间竟然变成了默认时间1970.01.01,不知道究竟是怎么回事?

菜鸟
2005-08-23 04:52:00     打赏
10楼
再顶一下!

共18条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]