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

VxWorks

开发平台:

C/C++

  1. /* wvTmrLib.c - timer library (WindView) */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01i,05oct98,jmp  doc: fixed SEE ALSO section.
  8. 01h,28may98,dgp  clean up man pages for WV 2.0 beta release
  9. 01g,15apr98,cjtc WV2.0 i960 port
  10. 01f,03feb95,rhp  docn improvements from last printed man pages
  11. 01e,01feb95,rhp  library man page: add ref to User's Guide
  12. 01d,05apr94,smb  and more documentation changes
  13. 01c,07mar94,smb  more documentation changes
  14. 01b,17jan94,smb  documentation changes
  15. 01a,10dec93,smb  created
  16. */
  17. /*
  18. DESCRIPTION
  19. This library allows a WindView timestamp timer to be registered.  When this
  20. timer is enabled, events are tagged with a timestamp as they are logged.
  21. Seven routines are required: a timestamp routine, a timestamp routine that
  22. guarantees interrupt lockout, a routine that enables the timer driver, a
  23. routine that disables the timer driver, a routine that specifies the
  24. routine to run when the timer hits a rollover, a routine that returns the
  25. period of the timer, and a routine that returns the frequency of the
  26. timer.
  27. INCLUDE FILES:
  28. SEE ALSO: wvLib,
  29. .I WindView User's Guide
  30. */
  31. /* includes */
  32. #include "vxWorks.h"
  33. #include "wvTmrLib.h"
  34. #include "private/eventP.h"
  35. #if CPU_FAMILY == I960
  36. /* locals */
  37. LOCAL FUNCPTR _func_tmrFreqRaw; /* original timestamp freq routine */
  38. /* forward declarations */
  39. LOCAL void  wvI960TmrSelect (void);
  40. LOCAL UINT32  wvI960TmrFreq (void);
  41. #endif
  42. /*******************************************************************************
  43. *
  44. * wvTmrRegister - register a timestamp timer (WindView)
  45. *
  46. * This routine registers a timestamp routine for each of the following: 
  47. * .iP <wvTmrRtn>
  48. * a timestamp routine, which returns a timestamp when called (must be called
  49. * with interrupts locked).
  50. * .iP <wvTmrLockRtn>
  51. * a timestamp routine, which returns a timestamp when called (locks interrupts).
  52. * .iP <wvTmrEnable>
  53. * an enable-timer routine, which enables the timestamp timer.
  54. * .iP <wvTmrDisable>
  55. * a disable-timer routine, which disables the timestamp timer.
  56. * .iP <wvTmrConnect>
  57. * a connect-to-timer routine, which connects a handler to be run when the timer
  58. * rolls over; this routine should return NULL if the system clock tick is to be
  59. * used.
  60. * .iP <wvTmrPeriod>
  61. * a period-of-timer routine, which returns the period of the timer.
  62. * .iP <wvTmrFreq>
  63. * a frequency-of-timer routine, which returns the frequency of the timer.
  64. * .LP
  65. *
  66. * If any of these routines is set to NULL, the behavior of instrumented code 
  67. * is undefined.
  68. *
  69. * RETURNS: N/A
  70. */
  71. void wvTmrRegister 
  72.     (
  73.     UINTFUNCPTR wvTmrRtn, /* timestamp routine */
  74.     UINTFUNCPTR wvTmrLockRtn,  /* locked timestamp routine */
  75.     FUNCPTR wvTmrEnable,  /* enable timer routine */
  76.     FUNCPTR wvTmrDisable, /* disable timer routine */
  77.     FUNCPTR wvTmrConnect, /* connect to timer routine */
  78.     UINTFUNCPTR wvTmrPeriod, /* period of timer routine */
  79.     UINTFUNCPTR wvTmrFreq /* frequency of timer routine */
  80.     )
  81.     {
  82.     /* initialize function pointers for windview timer */
  83.     _func_tmrStamp =     (FUNCPTR) wvTmrRtn;
  84.     _func_tmrStampLock = (FUNCPTR) wvTmrLockRtn;
  85.     _func_tmrEnable =    wvTmrEnable;
  86.     _func_tmrDisable =   wvTmrDisable;
  87.     _func_tmrConnect =   wvTmrConnect;
  88.     _func_tmrFreq =      (FUNCPTR) wvTmrFreq;
  89.     _func_tmrPeriod =    (FUNCPTR) wvTmrPeriod;
  90. #   if CPU_FAMILY==I960
  91. wvI960TmrSelect ();
  92. #   endif
  93.     }
  94. #if CPU_FAMILY==I960
  95. /*******************************************************************************
  96. *
  97. * wvi960I960TmrSelect - select a timestamp frequency function (windView)
  98. *
  99. * This routine is included for I960 targets only.
  100. * Some I960 timestamp drivers only have the ability to return the timestamp
  101. * operating frequency if the timestamp is enabled. Attempting to read the
  102. * timestamp frequency whilst the timestamp is disabled yields an invalid
  103. * result.
  104. *
  105. * In order to determine which type the linked timestamp driver is, this routine
  106. * calls it twice, once disabled, then enabled and compared the results. If the
  107. * results are the same, the timestamp driver can be called as normal. If the 
  108. * results differ, this routine links the pointer _func_tmrFreq to another
  109. * routine which will enable the timestamp before reading its frequency.
  110. *
  111. * RETURNS: N/A
  112. */
  113. LOCAL void wvI960TmrSelect (void)
  114.     {
  115.     UINT32 wvTimestampFreqDisabled;
  116.     UINT32 wvTimestampFreqEnabled;
  117.     (* _func_tmrDisable) ();
  118.     wvTimestampFreqDisabled = (* _func_tmrFreq) ();
  119.     (*_func_tmrEnable) ();
  120.     wvTimestampFreqEnabled = (* _func_tmrFreq) ();
  121.     (* _func_tmrDisable) ();
  122.     if (wvTimestampFreqDisabled != wvTimestampFreqEnabled)
  123. {
  124. /* save old function pointer to link to */
  125. _func_tmrFreqRaw = _func_tmrFreq;
  126. _func_tmrFreq = (FUNCPTR) wvI960TmrFreq;
  127. }
  128.     }
  129. /*******************************************************************************
  130. *
  131. * wvI960TmrFreq - obtain timestamp frequency for i960 targets (windView)
  132. *
  133. * This routine is included for I960 targets only.
  134. * It is linked to by wvI960TmrSelect for i960 targets in which the timestamp
  135. * driver is unable to return a valid timestamp frequency if the timestamp is
  136. * disabled. It will briefly enable the timestamp, collect the frequency then
  137. * disable the timestamp again.
  138. *
  139. * RETURNS: an unsigned integer representing the timestamp frequency in Hz.
  140. */
  141. LOCAL UINT32 wvI960TmrFreq (void)
  142.     {
  143.     UINT32 timestamp;
  144.     (* _func_tmrEnable) ();
  145.     timestamp = (* _func_tmrFreqRaw) ();
  146.     (* _func_tmrDisable) ();
  147.     return (timestamp);
  148.     }
  149. #endif