sysDelay.c
上传用户:yingyi0918
上传日期:2022-06-26
资源大小:214k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysDelay.c - BSP microsecond delay routine. */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * This file has been developed or significantly modified by the
  6.  * MIPS Center of Excellence Dedicated Engineering Staff.
  7.  * This notice is as per the MIPS Center of Excellence Master Partner
  8.  * Agreement, do not remove this notice without checking first with
  9.  * WR/Platforms MIPS Center of Excellence engineering management.
  10.  */
  11. /*
  12. modification history
  13. --------------------
  14. 01b,27jun02,d_c  Add polled timer functions
  15. 01a,05mar02,d_c  Make common to all IDT BSPs.
  16. */
  17. /*
  18. DESCRIPTION
  19. This file contains a routine to implement short delays (on the order
  20. of microseconds), as well as functions for implementing polled
  21. timeouts using the CP0 timer.
  22. It is assumed that this file is include by sysLib.c.
  23. */
  24. /* includes */
  25. #include "vxWorks.h"
  26. #include "config.h"
  27. #include "sysLib.h"
  28. IMPORT int      sysCountGet (); /* define in sysALib.s of BSP */
  29. /* defines */
  30. /* Number of CPO timer counts in a microsecond. */
  31. #define COUNTS_PER_USEC  (CPU_CLOCK_RATE*2)/1000000 ;
  32. /* typedefs */
  33. /* globals */
  34. /* locals */
  35. /* forward declarations */
  36. /***************************************************************************
  37. *
  38. * sysUSecDelay - delay for at least a given number of microseconds;
  39. *
  40. * This function polls the CP0 count register for a given number of
  41. * microseconds. It is used to implement very short delays.
  42. *
  43. * Note: The maximum possible delay is 2^32 / (CPU_CLOCK_RATE/1000000)
  44. * microseconds. The minimum possible delay is the time it takes
  45. * to execute this function with uSecs == 0, which is somewhat more
  46. * than zero!
  47. *
  48. * If interrupts are not disabled, it is possible that you will
  49. * delay quite a bit more than the requested time, if a number of interrupts
  50. * occur just before the count register reaches the expiration value.
  51. *
  52. * There is a remote possibility that the count register will get
  53. * reset by the timer module (timer/mipsR4kTimer.c). This could happen
  54. * if anything pre-empts this delay loop and calls sysClkEnable or
  55. * sysClkDisable .
  56. *
  57. * The CP0 Count registers increments at 1/2 the maximum instruction
  58. * issue rate, (which == the CPU_CLOCK_RATE in this case). So the
  59. * the increase in the count register per uSec is computed as:
  60. * (cpu clock rate in cycles/second) / (1000000 uSecs in a second)
  61. *
  62. * RETURNS: N/A
  63. */
  64. void sysUSecDelay 
  65.     (
  66.     UINT32 uSecs /* microseconds to delay */
  67.     )
  68.     {
  69.     UINT32 countsPerUSec;       /* Number of counts in a microsecond */
  70.     UINT32 expired;             /* Normalized count when delay expired */
  71.     UINT32 normalize;           /* Value used to normalize read count */
  72.     UINT32 count;               /* The read count */
  73.     countsPerUSec =   COUNTS_PER_USEC; 
  74.     expired = uSecs * countsPerUSec;
  75.     normalize = (UINT32) sysCountGet ();
  76.     count = 0;
  77.     while (count < expired)
  78.         {
  79.         count = ((UINT32) sysCountGet ()) - normalize;
  80.         }
  81.     return;
  82.     }
  83. /***************************************************************************
  84. *
  85. * sysUSecTimoutStart - start a polled timeout
  86. *
  87. * This routine reads and returns the current value of the CP0 count
  88. * register. This return value is used in subsequent calls to
  89. * sysUSecTimeoutExpired to determine when a given number of
  90. * microseconds have elapsed.
  91. *
  92. * RETURNS: startCount, the current value of the CP0 count register
  93. *
  94. * SEE ALSO: sysUSecTimoutExpired()
  95. */
  96. UINT32 sysUSecTimoutStart (void)
  97.     {
  98.     return (UINT32) sysCountGet ();
  99.     }
  100. /***************************************************************************
  101. *
  102. * sysUSecTimoutExpired - return TRUE when timeout has expired
  103. *
  104. * This routine returns TRUE when at least <uSecs> microseconds have
  105. * elapsed since the corresponding call to sysUSecTimeoutStart().
  106. *
  107. * RETURNS: TRUE when timeout as expired, FALSE othewise
  108. *
  109. * SEE ALSO: sysUSecTimeoutStart()
  110. */
  111. BOOL sysUSecTimoutExpired
  112.     (
  113.     UINT32  startCount,     /* starting count from sysUSecTimeoutStart() */
  114.     UINT32  uSecs           /* timeout in microseconds */
  115.     )
  116.     {
  117.     UINT32  expiredCount;   /* normalized count when delay expired */
  118.     BOOL    expired;        /* TRUE when timeout has expired */
  119.     UINT32 countsPerUSec;       /* Number of counts in a microsecond */
  120.     
  121.     countsPerUSec =  COUNTS_PER_USEC;
  122.     expiredCount = uSecs * countsPerUSec;
  123.     expired = ((( (UINT32) sysCountGet () ) - startCount) > expiredCount) ?
  124.                  TRUE : FALSE;
  125.     return expired;
  126.     }