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