usrTime.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* usrTime.c - associate POSIX clock, ANSI time and a Real-Time Clock device */
  2. /* Copyright 1997 Wind River Systems Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01c,01may97,leo  derived from older RTC driver
  7. */
  8. /*
  9. DESCRIPTION
  10. This module should be included from usrConfig.c and called somewhere from
  11. usrRoot() in order to associate and synchronize between POSIX clock of the
  12. kernel and a Real-Time Clock chip found on some boards.
  13. INTERNAL
  14. Due to the way the POSIX clock is currently implementedm it was not really
  15. feasible to perform gradual clock adjustment, i.e. slightly modify the clock
  16. resolution to compensate for inaccuracy of the system clock frequency.
  17. */
  18. /* includes */
  19. #include "vxWorks.h"
  20. #include "stdio.h"
  21. #include "time.h"
  22. #include "timers.h"
  23. #include "sysLib.h"
  24. #include "taskLib.h"
  25. #include "stdlib.h"
  26. #include "logLib.h"
  27. #include "private/timerLibP.h"
  28. /* globals */
  29. BOOL usrTimeDebug = FALSE ;
  30. /* forward declaration - should be moved to sysLib.h someday */
  31. extern STATUS sysRtcGet ( struct tm *tm);
  32. extern STATUS sysRtcSet ( const struct tm *tm);
  33. /******************************************************************************
  34. *
  35. * usrTimeSync - synchronize the system clock with an RTC
  36. *
  37. * This function should be called upon system initialization, after
  38. * sysClkEnable(), or any time after that repeatedly.
  39. *
  40. * NOTE:
  41. * If accurate time keeping is needed, every so often the clock resolution
  42. * can be subtly changed to reflect possible inaccuracy of the System
  43. * Clock interrupt generator, and keep the wall clock in sync with the RTC.
  44. *
  45. */
  46. STATUS usrTimeSync (void)
  47.     {
  48.     struct timespec tv ;
  49.     struct tm tm ;
  50.     sysRtcGet( &tm ) ;
  51.     tv.tv_sec = mktime( &tm );
  52.     tv.tv_nsec = 0;
  53.     clock_settime( CLOCK_REALTIME, &tv );
  54.     tv.tv_sec = 0;
  55.     tv.tv_nsec = 1000000000 / sysClkRateGet() ;
  56.     clock_setres( CLOCK_REALTIME, &tv );
  57.     return OK ;
  58.     }
  59. #if 0
  60. /******************************************************************************
  61. *
  62. * date - set or display current time and date
  63. *
  64. * A simple date and time manipulator similar to "date" command on Unix.
  65. * If the argument is 0 (or NULL), it will display the date and time
  66. * according to the Real Time Chip. If the argument is -1, this command
  67. * will display the date and time according to VxWorks  REALTIME_CLOCK.
  68. * Otherwise the argument can be a string of the following form
  69. * to set the RTC and system date and time manually:
  70. *
  71. *    "YYMMDDhhmmss"
  72. *
  73. * where "YY" stands for last two digits of the year, and so forth.
  74. *
  75. * RETURNS: N/A
  76. *
  77. * SEE ALSO
  78. *
  79. * ansiTime(1), clockLib(1)
  80. */
  81. void date
  82.     (
  83.     const char *str
  84.     )
  85.     {
  86.     struct tm tm ;
  87.     struct timespec tv ;
  88.     char buf[60];
  89.     size_t i = sizeof(buf);
  90.     time_t t ;
  91.     if ((int)str == -1)
  92. {
  93. t = time (NULL);
  94. localtime_r( &t, &tm);
  95. asctime_r( &tm, buf, &i );
  96. printf("%s", buf );
  97. }
  98.     else if (str != NULL)
  99. {
  100. /* Set the time */
  101. tm.tm_sec = (str[10] -'0')*10 + str[11] - '0' ;
  102. tm.tm_min = (str[8] -'0')*10 + str[9] - '0' ;
  103. tm.tm_hour = (str[6] -'0')*10 + str[7] - '0' ;
  104. tm.tm_mday = (str[4] -'0')*10 + str[5] - '0' ;
  105. tm.tm_mon = (str[2] -'0')*10 + str[3] - '0' - 1; /* Jan == 0 */
  106. tm.tm_year = (str[0] -'0')*10 + str[1] - '0' ;
  107. tm.tm_wday = 0 ;
  108. tm.tm_yday = 0 ;
  109. tm.tm_isdst = 0 ;
  110. /* correction for y2k */
  111. if (tm.tm_year < 80 )
  112.     tm.tm_year += 100 ;
  113. tv.tv_sec = mktime( &tm );
  114. tv.tv_nsec = 0;
  115. sysRtcSet( &tm );
  116. clock_settime( CLOCK_REALTIME, &tv );
  117. asctime_r( &tm, buf, &i );
  118. printf("%s", buf );
  119. }
  120.     else
  121. {
  122. /* Print the date and time of the RTC */
  123. sysRtcGet( &tm );
  124. asctime_r( &tm, buf, &i );
  125. printf("%s", buf );
  126. }
  127. #ifdef LOCAL_DEBUG
  128.     printf(" tm.tm_sec %dn", tm.tm_sec);
  129.     printf(" tm.tm_min %dn", tm.tm_min);
  130.     printf(" tm.tm_hour %dn", tm.tm_hour);
  131.     printf(" tm.tm_mday %dn", tm.tm_mday);
  132.     printf(" tm.tm_mon %dn", tm.tm_mon);
  133.     printf(" tm.tm_year %dn", tm.tm_year);
  134.     printf(" tm.tm_wday %dn", tm.tm_wday);
  135.     printf(" tm.tm_yday %dn", tm.tm_yday);
  136.     printf(" tm.tm_isdst %dn", tm.tm_isdst);
  137. #endif
  138.     }
  139. /******************************************************************************
  140. *
  141. * usrTimeAdj - routinely adjust system time with the Real-Time Clock
  142. *
  143. */
  144. STATUS usrTimeAdj( int interval )
  145.     {
  146.     static time_t lastFreq, lastTime, lastPeriod ;
  147.     FAST time_t freq, t, t1;
  148.     long  dif;
  149.     struct tm tm ;
  150.     struct timespec tv ;
  151.     if( interval == 0)
  152. interval = 120 ;
  153.     freq = sysClkRateGet();
  154.     FOREVER
  155. {
  156. /* sleep until the next iteration */
  157. taskDelay( interval * freq );
  158. taskLock() ;
  159. sysRtcGet( &tm );
  160. freq = sysClkRateGet();
  161. t = time (NULL);
  162. taskUnlock();
  163. if( t == ERROR )
  164.     {
  165.     char buf[48]; int i=sizeof(buf);
  166.     asctime_r( &tm, buf, &i );
  167.     logMsg("mktime error %s", (int) buf, 0,0,0,0,0);
  168.     }
  169. t1 = mktime( &tm );
  170. dif = t1 - t; /* how many seconds skew */
  171. /* logMsg("t=%d t1=%d dif=%dn", t, t1, dif, 0,0,0); */
  172. /* if there is a serious difference, do a step adjustment */
  173. if ((abs(dif) > 1) || (freq != lastFreq) )
  174.     {
  175.     if(usrTimeDebug)
  176. {
  177. char buf[48]; int i=sizeof(buf);
  178. asctime_r( &tm, buf, &i );
  179. logMsg("syncing clock %s", (int) buf, 0,0,0,0,0);
  180. }
  181.     usrTimeSync();
  182.     /* update statics for next iteration */
  183.     lastFreq = freq ;
  184.     lastPeriod  = tv.tv_nsec = 1000000000 / freq ;
  185.     lastTime = time(NULL) ;
  186.     }
  187. #ifdef __XXX__
  188. else if( dif != 0)
  189.     {
  190.     FAST time_t tmp ;
  191.     /* otherwise, gradually adjust clock to RTC speed */
  192.     tv.tv_sec = 0;
  193.     /* this expression must be carefully ordered, not to
  194.      * get involved with 64-bit arithmetic which is
  195.      * incomplete in the current version's library.
  196.      */
  197.     tmp = lastPeriod / ((t - lastTime)*freq);
  198.     tv.tv_nsec += tmp * dif ;
  199.     clock_setres( CLOCK_REALTIME, &tv );
  200.     if(usrTimeDebug)
  201. logMsg("dif %d old period %d ns, new period %d ns, interval %dn",
  202. dif, lastPeriod, tv.tv_nsec, t - lastTime, 0, 0 );
  203.     /* update statics for next iteration */
  204.     lastFreq = freq ;
  205.     lastPeriod  = tv.tv_nsec ;
  206.     lastTime = t ;
  207.     }
  208. #endif /*__XXX__*/
  209. } /* FOREVER */
  210.     }
  211. /******************************************************************************
  212. *
  213. * usrTimeInit - init system time and Real-Time Clock
  214. *
  215. */
  216. void usrTimeInit(void)
  217.     {
  218.     usrTimeSync();
  219.     taskSpawn("tTimeSync", 255, 0, 4096, usrTimeAdj, 60,
  220. 0,0,0,0,0,0,0,0,0);
  221.     }
  222. #endif
  223. /* End Of File */