Установить и получить системное время на VxWorks RTP

Я пытаюсь установить и получить системное время на архитектуре Intel, которая работает под управлением VxWorks 7.

Я могу установить время, используя DKM (загружаемый модуль ядра) с кодом выше.

#include "vxWorks.h"
#include "time.h"
#include "stdio.h"
#include "memLib.h"
#include "sysLib.h"

#define RTCDEBUG  /* define to get debug output */

STATUS timeTest (void)
{
    int i;
    time_t myTime1;
    struct tm *myTime2;

    unsigned int month_array[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    unsigned int current_second_bcd;
    unsigned int current_minute_bcd;
    unsigned int current_hour_bcd;
    unsigned int current_day_of_week_bcd;
    unsigned int current_date_bcd;
    unsigned int current_month_bcd;
    unsigned int current_year_bcd;
    unsigned int current_century_bcd;
    unsigned int second;
    unsigned int minute;
    unsigned int hour;
    unsigned int day;
    unsigned int date;
    unsigned int month;
    unsigned int year;
    unsigned int yday;
    unsigned int century;
    struct timespec mytimespec;

    /* displays VxWorks uninitialized time = THU JAN 01 00:00:01 1970*/

    myTime1 = time (0);
    myTime2 = localtime (&myTime1);

#ifdef RTCDEBUG
    printf ("\ncurrent vxWorks Time = %s", asctime (myTime2));
#endif

    /* reads PC real time clock maintained in CMOS RAM */
    /* RTC CMOS RAM contents are accessed by writes and reads from */
    /* I/O addresses 0x70 and 0x71 respectively */
    sysOutByte (0x70, 0x0);
    current_second_bcd = sysInByte (0x71);
    sysOutByte (0x70, 0x2);
    current_minute_bcd = sysInByte (0x71);
    sysOutByte (0x70, 0x4);
    current_hour_bcd = sysInByte (0x71);
    sysOutByte (0x70, 0x6);
    current_day_of_week_bcd = sysInByte (0x71);
    sysOutByte (0x70, 0x7);
    current_date_bcd = sysInByte (0x71);
    sysOutByte (0x70, 0x8);
    current_month_bcd = sysInByte (0x71);
    sysOutByte (0x70, 0x9);
    current_year_bcd = sysInByte (0x71);
    sysOutByte (0x70, 0x32);
    current_century_bcd = sysInByte (0x71);

    /* displays PC real time clock BCD data*/
#ifdef RTCDEBUG

    printf ("\nsecond = %02X \nminute = %02X \nhour = %02X \nday = %02X \ndate = %02X ",
        current_second_bcd, current_minute_bcd, current_hour_bcd, current_day_of_week_bcd,
        current_date_bcd);
    printf ("\nmonth = %02X \nyear = %02X \ncentury = %02X", current_month_bcd,
        current_year_bcd, current_century_bcd);
#endif
    /* convert PC real time clock BCD data to decimal for entry */
    /* into tm structure, see /WIND_BASE/target/h/time.h */

    second = ((current_second_bcd & 0xF0) >> 4) * 10;
    second = second + (current_second_bcd & 0x0F);

    minute = ((current_minute_bcd & 0xF0) >> 4) * 10;
    minute = minute + (current_minute_bcd & 0x0F);

    hour = ((current_hour_bcd & 0xF0) >> 4) * 10;
    hour = hour + (current_hour_bcd & 0x0F);

    day = ((current_day_of_week_bcd & 0xF0) >> 4) * 10;
    day = day + (current_day_of_week_bcd & 0x0F);

    date = ((current_date_bcd & 0xF0) >> 4) * 10;
    date = date + (current_date_bcd & 0x0F);

    month = ((current_month_bcd & 0xF0) >> 4) * 10;
    month = month + (current_month_bcd & 0x0F);

    year = ((current_year_bcd & 0xF0) >> 4) * 10;
    year = year + (current_year_bcd & 0x0F);

    century = ((current_century_bcd & 0xF0) >> 4) * 10;
    century = century + (current_century_bcd & 0x0F);
    century = century * 100;

    year = century + year;
    year = year - 1900;

    for (i = 0; i < month; i++)
        yday = yday + month_array[i];
    yday = yday + date;

    /* display converted data*/
#ifdef RTCDEBUG
    printf ("\n\nsecond = %d minute = %d hour = %d ",
        second, minute, hour);
    printf ("\ndate = %d month = %d year = %d day = %d yday = %d", date, month, year, day, yday);
#endif
    /* initialize tm structure with converted data */

    myTime2->tm_sec = second;
    myTime2->tm_min = minute;
    myTime2->tm_hour = hour;
    myTime2->tm_mday = date;
    myTime2->tm_mon = month-1; /* months are 0-11 */
    myTime2->tm_year = year;
    myTime2->tm_wday = day;
    myTime2->tm_yday = yday;
    myTime2->tm_isdst = 1;       /* daylight savings time in effect (does nothing)*/

    /* convert tm structure to seconds */
    myTime1 = mktime (myTime2);

    /* initialize VxWorks time with new value */
    mytimespec.tv_sec = myTime1;
    mytimespec.tv_nsec = 0;

    clock_settime(CLOCK_REALTIME, &mytimespec);

    /* test to make sure time update took */
    myTime1 = time(0);
    myTime2 = localtime(&myTime1);

#ifdef RTCDEBUG
    printf("\n\nnew vxWorks Time = %s", asctime(myTime2));
#endif

    return (OK);
}

int main()
{
    timeTest();

    return 0;
}

Что я хочу сделать, это использовать этот код для работы на RTP пользователя. Когда я компилирую код в проекте RTP, он выдает код ошибки, говорящий о том, что он не может найти функцию sysOutByte в sysLib.h. Когда я смотрю на ядро ​​sysLib.h, все в порядке, функция там, где она должна быть. Но для пользовательского пространства RTP sysLib.h нет вызова функции sysOutByte.

Это потому, что мне не разрешено вызывать системные функции для чтения и записи часов реального времени в пространстве пользователя RTP?

Или есть ли другие способы установить и получить системное время на RTP и читать метки времени?

1 ответ

Решение

Кажется, что достаточно один раз установить функцию usrAppInit.c следующим образом.

1) Скопируйте и вставьте код в другой файл.c в том же каталоге модуля ядра Projcet. (Например, myRtcWrapper.c)

2) Вызовите timeTest () в usrAppInit.c

void usrAppInit (void)
{
    #ifdef  USER_APPL_INIT
        USER_APPL_INIT;     
    #endif  
        timeTest();
    ...
}

3) Когда система перезагружается с новым образом, она автоматически получает последнее время. (Нужно изменить расчеты в соответствии с настройками своего часового пояса)

4) Итак, чтобы вызвать его из RTP, просто добавьте этот кусок кода

time_t myTime1; 
struct tm *myTime2; 

myTime1 = time(0); 
myTime2 = localtime(&myTime1); 

printf("\nTime is = %s now!\n", asctime(myTime2));

или более простой способ читать как секунды, просто используйте следующее:

struct timespec seconds;

if (clock_gettime(CLOCK_REALTIME, &seconds) == OK)
{
    printf("%d, seconds.tv_sec);
}

Удачного кодирования...

Другие вопросы по тегам