tickLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* tickLib.c - clock tick support library */
  2. /* Copyright 1984-1994 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01q,22may02,jgn  add tick64Get() interface - SPR #70255
  8. 01p,24jun96,sbs  made windview instrumentation conditionally compiled
  9. 01o,24jan94,smb  added instrumentation macros
  10. 01n,10dec93,smb  added instrumentation
  11. 01m,20jan93,jdi  documentation cleanup for 5.1.
  12. 01l,04jul92,jcf  private header files.
  13. 01k,26may92,rrr  the tree shuffle
  14. 01j,04oct91,rrr  passed through the ansification filter
  15.                   -changed functions to ansi style
  16.   -changed VOID to void
  17.   -changed copyright notice
  18. 01i,30mar91,jdi  documentation cleanup; doc review by jcf.
  19. 01h,29aug90,jcf  documentation.
  20. 01g,10jul90,jcf  changed to support 64 bit internal tick count.
  21. 01f,26jun90,jcf  removed queue overflow stuff.
  22. 01e,28aug89,jcf  modified to support version 2.0 of wind.
  23. 01d,23sep88,gae  documentation touchup.
  24. 01c,23aug88,gae  documentation.
  25. 01b,12aug88,jcf  clean up.
  26. 01a,19jan87,jcf  written.
  27. */
  28. /*
  29. DESCRIPTION
  30. This library is the interface to the VxWorks kernel routines that announce a
  31. clock tick to the kernel, get the current time in ticks, and set the
  32. current time in ticks.
  33. Kernel facilities that rely on clock ticks include taskDelay(), wdStart(),
  34. kernelTimeslice(), and semaphore timeouts.  In each case, the specified
  35. timeout is relative to the current time, also referred to as "time to fire."
  36. Relative timeouts are not affected by calls to tickSet(), which only changes
  37. absolute time.  The routines tickSet() and tickGet() keep track of absolute
  38. time in isolation from the rest of the kernel.
  39. Time-of-day clocks or other auxiliary time bases are preferable for lengthy
  40. timeouts of days or more.  The accuracy of such time bases is greater, and
  41. some external time bases even calibrate themselves periodically.
  42. INTERNAL:
  43. WINDVIEW INSTRUMENTATION
  44. Level 1:
  45. N/A
  46. Level 2:
  47. N/A
  48. Level 3:
  49. tickAnnounce() causes EVENT_TICKANNOUNCE
  50. INCLUDE FILES: tickLib.h
  51. SEE ALSO: kernelLib, taskLib, semLib, wdLib,
  52. .pG "Basic OS"
  53. */
  54. #include "vxWorks.h"
  55. #include "tickLib.h"
  56. #include "taskLib.h"
  57. #include "private/windLibP.h"
  58. #include "private/workQLibP.h"
  59. #include "private/eventP.h"
  60. /* globals */
  61. ULONG vxTicks; /* current time in ticks */
  62. UINT64 vxAbsTicks; /* absolute time since power on in ticks */
  63. /*******************************************************************************
  64. *
  65. * tickAnnounce - announce a clock tick to the kernel
  66. *
  67. * This routine informs the kernel of the passing of time.  It should be
  68. * called from an interrupt service routine that is connected to the system
  69. * clock.  The most common frequencies are 60Hz or 100Hz.  Frequencies in
  70. * excess of 600Hz are an inefficient use of processor power because the
  71. * system will spend most of its time advancing the clock.  By default,
  72. * this routine is called by usrClock() in usrConfig.c.
  73. *
  74. * RETURNS: N/A
  75. *
  76. * SEE ALSO: kernelLib, taskLib, semLib, wdLib,
  77. * .pG "Basic OS"
  78. */
  79. void tickAnnounce (void)
  80.     {
  81. #ifdef WV_INSTRUMENTATION
  82.     /* windview - level 3 event */
  83.     EVT_CTX_0 (EVENT_TICKANNOUNCE);
  84. #endif
  85.     if (kernelState) /* defer work if in kernel */
  86. workQAdd0 ((FUNCPTR)windTickAnnounce);
  87.     else
  88. {
  89. kernelState = TRUE; /* KERNEL_ENT */
  90. windTickAnnounce (); /* advance tick queue */
  91. windExit (); /* KERNEL_EXIT */
  92. }
  93.     }
  94. /*******************************************************************************
  95. *
  96. * tickSet - set the value of the kernel's tick counter
  97. *
  98. * This routine sets the internal tick counter to a specified value in
  99. * ticks.  The new count will be reflected by tickGet(), but will not change
  100. * any delay fields or timeouts selected for any tasks.  For example, if a
  101. * task is delayed for ten ticks, and this routine is called to advance time,
  102. * the delayed task will still be delayed until ten tickAnnounce() calls have
  103. * been made.
  104. *
  105. * RETURNS: N/A
  106. *
  107. * SEE ALSO: tickGet(), tickAnnounce()
  108. *
  109. * INTERNAL
  110. * The routine locks interrupts while obtaining the copy of the 64 value to
  111. * prevent an interrupt from splitting what is unlikely to be an atomic operation
  112. * on a 32 bit CPU.
  113. */
  114. void tickSet
  115.     (
  116.     ULONG ticks         /* new time in ticks */
  117.     )
  118.     {
  119.     int key = intLock(); /* INTERRUPTS LOCKED */
  120.     vxAbsTicks = ticks; /* effectively zero the upper bits */
  121.     intUnlock(key); /* INTERRUPTS UNLOCKED */
  122.     }
  123. /*******************************************************************************
  124. *
  125. * tickGet - get the value of the kernel's tick counter
  126. *
  127. * This routine returns the current value of the tick counter.
  128. * This value is set to zero at startup, incremented by tickAnnounce(),
  129. * and can be changed using tickSet().
  130. *
  131. * RETURNS: The most recent tickSet() value, plus all tickAnnounce() calls since.
  132. *
  133. * SEE ALSO: tickSet(), tickAnnounce()
  134. *
  135. * INTERNAL
  136. * There should be no need to lock interrupts on this one; the compiler should
  137. * only generate a read from one half of the UINT64 which means that the read
  138. * can never be interrupted.
  139. */
  140. ULONG tickGet (void)
  141.     {
  142.     return (ULONG) (vxAbsTicks & 0xFFFFFFFFull);
  143.     }
  144. /*******************************************************************************
  145. *
  146. * tick64Set - set the value of the kernel's tick counter in 64 bits
  147. *
  148. * This routine sets the internal tick counter to a specified value in
  149. * ticks.  The new count will be reflected by tick64Get() and tickGet() (only
  150. * the lower 32 bits), but will not change any delay fields or timeouts selected
  151. * for any tasks.  For example, if a task is delayed for ten ticks, and this
  152. * routine is called to advance time, the delayed task will still be delayed
  153. * until ten tickAnnounce() calls have been made.
  154. *
  155. * RETURNS: N/A
  156. *
  157. * SEE ALSO: tick64Get(), tickGet(), tickSet(), tickAnnounce()
  158. *
  159. * INTERNAL
  160. * The routine locks interrupts while obtaining the copy of the 64 value to
  161. * prevent an interrupt from splitting what is unlikely to be an atomic operation
  162. * on a 32 bit CPU.
  163. *
  164. * NOMANUAL
  165. */
  166. void tick64Set
  167.     (
  168.     UINT64 ticks         /* new time in ticks */
  169.     )
  170.     {
  171.     int key = intLock(); /* INTERRUPTS LOCKED */
  172.     vxAbsTicks = ticks;
  173.     intUnlock (key); /* INTERRUPTS UNLOCKED */
  174.     }
  175. /*******************************************************************************
  176. *
  177. * tick64Get - get the value of the kernel's tick counter as a 64 bit value
  178. *
  179. * This routine returns the current value of the 64 bit absolute tick counter.
  180. * This value is set to zero at startup, incremented by tickAnnounce(),
  181. * and can be changed using tickSet() or tick64Set().
  182. *
  183. * RETURNS: The most recent tickSet()/tick64Set() value, plus all
  184. * tickAnnounce() calls since.
  185. *
  186. * SEE ALSO: tickGet(), tick64Set(), tickSet(), tickAnnounce()
  187. *
  188. * INTERNAL
  189. * The routine locks interrupts while obtaining the copy of the 64 value to
  190. * prevent an interrupt from splitting what is unlikely to be an atomic operation
  191. * on a 32 bit CPU.
  192. *
  193. * NOMANUAL
  194. */
  195. UINT64 tick64Get (void)
  196.     {
  197.     UINT64 ret;
  198.     int key = intLock(); /* INTERRUPTS LOCKED */
  199.     ret = vxAbsTicks;
  200.     intUnlock (key); /* INTERRUPTS UNLOCKED */
  201.     return ret;
  202.     }