Установить и получить системное время на 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);
}
Удачного кодирования...