原创 vxworks取日历时间

2006-12-15 22:23 6026 9 7 分类: MCU/ 嵌入式

在vxworks里取的系统时间是从开机到现在的时间,如果想取到日历时间的话只能借助外界的硬件支持了。在X86系统里,可以通过读取71端口来读取日历时间,以下是一个博友给我的C程序,我改了一下发给大家,可以在vxworks下用



#include<stdio.h>


void ReadTime(int* pYear,int* pMonth,int* pDate,int* pDay,int* pHour,int* pMinute,int* pSecond);


void ReadTime(int* pYear,int* pMonth,int* pDate,int* pDay,int* pHour,int* pMinute,int* pSecond)
{
    int OldYear,OldMonth,OldDate,OldDay,OldHour,OldMinute,OldSecond;
    int YearTemp,MonthTemp,DateTemp,DayTemp,HourTemp,MinuteTemp,SecondTemp;
    int Century;


    OldYear="OldMonth"=OldDate=OldDay=OldHour=OldMinute=OldSecond=-1;
    sysOutByte(0x70,0x32);
    Century=(int)sysInByte(0x71);
    for(;;)
    {
        asm pushf;      //Save interrupt enable|disable status
        asm cli;        //Disable interrupt
        sysOutByte(0x70,0xa);
        if((0x80&sysInByte(0x71))!=0)
        {
            asm popf;   //Restore interrupt enable|disable status
            continue;
        }
        sysOutByte(0x70,9);
        YearTemp=(int)sysInByte(0x71);
        sysOutByte(0x70,8);
        MonthTemp=(int)sysInByte(0x71);
        sysOutByte(0x70,7);
        DateTemp=(int)sysInByte(0x71);
        sysOutByte(0x70,6);
        DayTemp=(int)sysInByte(0x71);
        sysOutByte(0x70,4);
        HourTemp=(int)sysInByte(0x71);
        sysOutByte(0x70,2);
        MinuteTemp=(int)sysInByte(0x71);
        sysOutByte(0x70,0);
        SecondTemp=(int)sysInByte(0x71);
        sysOutByte(0x70,0xa);
        if((0x80&sysInByte(0x71))!=0)
        {
            asm popf;   //Restore interrupt enable|disable status
            continue;
        }
        if((OldYear!=YearTemp)||(OldMonth!=MonthTemp)||(OldDate!=DateTemp)
            ||(OldDay!=DayTemp)||(OldHour!=HourTemp)||(OldMinute!=MinuteTemp)
            ||(OldSecond!=SecondTemp))
        {
            OldYear="YearTemp";
            OldMonth="MonthTemp";
            OldDate="DateTemp";
            OldDay="DayTemp";
            OldHour="HourTemp";
            OldMinute="MinuteTemp";
            OldSecond="SecondTemp";
            asm popf;
            continue;
        }
        asm popf;       //Restore interrupt enable|disable status
        break;
    }
    *pYear=(Century>>4)*1000+(Century&0xf)*100+(YearTemp>>4)*10+(YearTemp&0xf);
    *pMonth=(MonthTemp>>4)*10+(MonthTemp&0xf);
    *pDate=(DateTemp>>4)*10+(DateTemp&0xf);
    *pDay=DayTemp;
    *pHour=(HourTemp>>4)*10+(HourTemp&0xf);
    *pMinute=(MinuteTemp>>4)*10+(MinuteTemp&0xf);
    *pSecond=(SecondTemp>>4)*10+(SecondTemp&0xf);
}


void main(void)
{
    int t1,t2,t3,t4,t5,t6,t7;
    ReadTime(&t1,&t2,&t3,&t4,&t5,&t6,&t7);
    printf("%d %d %d %d %d %d %d\n",t1,t2,t3,t4,t5,t6,t7);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /3 下一条