x86平台上vxworks取日历时间
发布:much | 发布时间: 2008年5月26日
在vxworks里取的系统时间是从开机到现在的时间,如果想取到日历时间的话只能借助外界的硬件支持了。在X86系统里,可以通过读取71端口来读取日历时间.
验证过的代码:
/* test.c */
#include<stdio.h>
#include<stdlib.h>
#include<syslib.h>
#include<time.h>
time_t biostime()
{
struct tm mark;
unsigned char cHour,cMin,cSec;
unsigned char cDay,cMonth,cYear;
sysOutByte(0x70,0x00);
cSec=sysInByte(0x71);
mark.tm_sec=(cSec&0x0F)+10*((cSec&0x0F0)>>4);
sysOutByte(0x70,0x02);
cMin=sysInByte(0x71);
mark.tm_min=(cMin&0x0F)+10*((cMin&0x0F0)>>4);
sysOutByte(0x70,0x04);
cHour=sysInByte(0x71);
mark.tm_hour=(cHour&0x0F)+10*((cHour&0x0F0)>>4);
sysOutByte(0x70,0x07);
cDay=sysInByte(0x71);
mark.tm_mday=(cDay&0x0F)+10*((cDay&0x0F0)>>4);
sysOutByte(0x70,0x08);
cMonth=sysInByte(0x71);
mark.tm_mon=(cMonth&0xF0)+10*((cMonth&0x0F0)>>4)-1;
sysOutByte(0x70,0x09);
cYear=sysInByte(0x71);
mark.tm_year=100+(cYear&0xF0)+10*((cYear&0x0F)>>4);
fprintf(stdout,"sec=%d\n",mark.tm_sec);
fprintf(stdout,"min=%d\n",mark.tm_min);
fprintf(stdout,"hour=%d\n",mark.tm_hour);
fprintf(stdout,"day=%d\n",mark.tm_mday);
fprintf(stdout,"mon=%d\n",mark.tm_mon);
fprintf(stdout,"year=%d\n",mark.tm_year);
/* write */
sysOutByte(0x70,0x00);
sysOutByte(0x71,0x30);
cSec=sysInByte(0x71);
mark.tm_sec=(cSec&0x0F)+10*((cSec&0x0F0)>>4);
sysOutByte(0x70,0x02);
sysOutByte(0x71,0x30);
cMin=sysInByte(0x71);
mark.tm_min=(cMin&0x0F)+10*((cMin&0x0F0)>>4);
sysOutByte(0x70,0x04);
sysOutByte(0x71,0x30);
cHour=sysInByte(0x71);
mark.tm_hour=(cHour&0x0F)+10*((cHour&0x0F0)>>4);
sysOutByte(0x70,0x07);
sysOutByte(0x71,0x06);
cDay=sysInByte(0x71);
mark.tm_mday=(cDay&0x0F)+10*((cDay&0x0F0)>>4);
sysOutByte(0x70,0x08);
sysOutByte(0x71,0x06);
cMonth=sysInByte(0x71);
mark.tm_mon=(cMonth&0xF0)+10*((cMonth&0x0F0)>>4)-1;
sysOutByte(0x70,0x09);
sysOutByte(0x71,0x06);
cYear=sysInByte(0x71);
mark.tm_year=100+(cYear&0xF0)+10*((cYear&0x0F)>>4);
fprintf(stdout,"sec=%d\n",mark.tm_sec);
fprintf(stdout,"min=%d\n",mark.tm_min);
fprintf(stdout,"hour=%d\n",mark.tm_hour);
fprintf(stdout,"day=%d\n",mark.tm_mday);
fprintf(stdout,"mon=%d\n",mark.tm_mon);
fprintf(stdout,"year=%d\n",mark.tm_year);
return mktime(&mark);
}
void inittime()
{
int res;
struct timespec ts;
struct tm daytime;
time_t systime;
ts.tv_sec=biostime();
ts.tv_nsec=0;
res=clock_settime(CLOCK_REALTIME,&ts);
systime=time(NULL);
daytime=*localtime(&systime);
fprintf(stdout,"The current time is %s\n",asctime(&daytime));
}
STATUS test(void)
{
unsigned char sec;
unsigned char i=0,j=0;
sysOutByte(0x70,0x00);
sec=sysInByte(0x71);
i=(sec&0x0F)+10*((sec&0x0F0)>>4);
fprintf(stdout,"i= %d \n",i);
sysOutByte(0x70,0x00);
sec=sysInByte(0x71);
j=(sec&0x0F)+10*((sec&0x0F0)>>4);
fprintf(stdout,"j= %d \n",j);
fprintf(stdout,"j-i= %d \n",(j-i));
}
STATUS t(void)
{
if (taskSpawn("t0", 100, 0, 10000,(FUNCPTR) test, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) == ERROR)
{
perror ("taskSpawn");
}
else
{
fprintf(stdout,"\nTaskSpawn tcpClient0 successful!\n");
}
}
- 相关文章:
vxWorks编程指南 (2008-3-25 17:59:9)
vxworks测试题及解答 (2008-3-25 17:48:48)
5.5重启的问题终于得以解决! (2008-2-15 15:20:57)
在VPC中从硬盘启动bootrom两种方法 (2008-1-17 23:21:2)
在VMWare上安装VxWorks操作系统的视频录相 (2008-1-14 19:58:6)
发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。





