simPcTimer.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* simPcTimer.c - Windows simulator timer library */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01b,13sep01,hbh  Fixed SPR 63532 to be able to modify the system clock rate.
  7.  Code cleanup.
  8. 01a,07jul98,cym  written.
  9. */
  10. /*
  11. DESCRIPTION
  12. This driver exposes windows timer objects in a vxWorks way, allowing
  13. them to be used as the system and auxiliary clocks.  Windows timers are cyclic,
  14. and can be set to the millisecond.  All timers send the WM_TIMER message/
  15. interrupt, which also passes in a timer ID.  This driver's multiplexer then
  16. calls the appropriate driver function based on the ID.
  17. The macros SYS_CLK_RATE_MIN, SYS_CLK_RATE_MAX, AUX_CLK_RATE_MIN, and
  18. AUX_CLK_RATE_MAX must be defined to provide parameter checking for the
  19. sys[Aux]ClkRateSet() routines.
  20. INCLUDES:
  21. win_Lib.h
  22. intLib.h
  23. */
  24. /* includes */
  25. #include "win_Lib.h"
  26. #include "intLib.h"
  27. /* defines */
  28. #define TIMER_VEC 0x0113 /* from windows headers */
  29. /* locals */
  30. LOCAL FUNCPTR clockRoutines[2]; /* Handler for SYS/AUX clock */
  31. LOCAL int  clockArgs[2]; /* Args for SYS/AUX handler */
  32. LOCAL int  clockRate[2] = {60,60}; /* Rate for SYS/AUX clock */
  33. LOCAL int  clockEnable[2]; /* Enable flag for SYS/AUX */
  34. /***************************************************************************
  35. *
  36. * sysClkInt - interrupt level processing for system clock
  37. *
  38. * This routine handles a clock interrupt.  It demultiplexes the interrupt,
  39. * and calls the routine installed by sysClkConnect() for that timer.
  40. */
  41. LOCAL void sysClkInt
  42.     (
  43.     int zero, /* ignore the parameter */
  44.     int timerId /* 1 = sysClk 2 = sysAuxClk */
  45.     )
  46.     {
  47.     if (timerId == 1) clockRoutines[0](clockArgs[0]);
  48.     if (timerId == 2) clockRoutines[1](clockArgs[1]);
  49.     }
  50. /***************************************************************************
  51. *
  52. * sysClkConnect - connect a routine to the system clock interrupt
  53. *
  54. * This routine specifies the interrupt service routine to be called at each
  55. * clock interrupt from the system timer.  Normally, it is called from usrRoot()
  56. * in usrConfig.c to connect usrClock() to the system clock interrupt.
  57. *
  58. * RETURN: OK, or ERROR if the routine cannot be connected to the interrupt.
  59. *
  60. * SEE ALSO: intConnect(), usrClock(), sysClkEnable()
  61. */
  62. STATUS sysClkConnect
  63.     (
  64.     FUNCPTR routine,
  65.     int arg
  66.     )
  67.     {
  68.     int key = intLock (); /* INTERRUPTS LOCKED */
  69.  
  70.     clockRoutines[0] = routine;
  71.     clockArgs[0] = arg;
  72.     intUnlock (key);
  73.     intConnect ((VOIDFUNCPTR *)TIMER_VEC, (VOIDFUNCPTR)sysClkInt, 0);
  74.     return(0);
  75.     }
  76. /***************************************************************************
  77. *
  78. * sysClkDisable - turn off system clock interrupts
  79. *
  80. * This routine disables system clock interrupts.
  81. *
  82. * RETURNS: N/A
  83. *
  84. * SEE ALSO: sysClkEnable()
  85. */
  86. void sysClkDisable(void)
  87.     {
  88.     int key = intLock (); /* INTERRUPTS LOCKED */
  89.     clockEnable[0] = 0;
  90.     win_KillTimer (1);
  91.     intUnlock (key);
  92.     }
  93. /***************************************************************************
  94. *
  95. * sysClkEnable - turn on system clock interrupts
  96. *
  97. * This routine enables system clock interrupts.
  98. *
  99. * RETURNS: N/A
  100. *
  101. * SEE ALSO: sysClkConnect(), sysClkDisable(), sysClkRateSet()
  102. */
  103. void sysClkEnable(void)
  104.     {
  105.     int key = intLock(); /* INTERRUPTS LOCKED */
  106.     clockEnable[0] = 1;
  107.     win_SetTimer (1, 1000 / clockRate[0]);
  108.     intUnlock (key);
  109.     }
  110. /***************************************************************************
  111. *
  112. * sysClkRateGet - get the system clock rate
  113. *
  114. * This routine returns the system clock rate.
  115. *
  116. * RETURNS: The number of ticks per second of the system clock.
  117. *
  118. * SEE ALSO: sysClkEnable(), sysClkRateSet()
  119. */
  120. int sysClkRateGet(void)
  121.     {
  122.     return (clockRate[0]);
  123.     }
  124. /***************************************************************************
  125. *
  126. * sysClkRateSet - set the system clock rate
  127. *
  128. * This routine sets the interrupt rate of the system clock.
  129. * It is called by usrRoot() in usrConfig.c.
  130. *
  131. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  132. *
  133. * SEE ALSO: sysClkEnable(), sysClkRateGet()
  134. */
  135. STATUS sysClkRateSet
  136.     (
  137.     int rate
  138.     )
  139.     {
  140.     if ( (rate < SYS_CLK_RATE_MIN) || (rate > SYS_CLK_RATE_MAX) )
  141.         return (ERROR);
  142.     clockRate[0] = rate;
  143.     if (clockEnable[0])
  144.         {
  145.         win_KillTimer (1);
  146.         win_SetTimer (1, 1000 / clockRate[0]);
  147.         }
  148.     return (OK);
  149.     }
  150. /***************************************************************************
  151. *
  152. * sysAuxClkConnect - connect a routine to the auxiliary clock interrupt
  153. *
  154. * This routine specifies the interrupt service routine to be called at each
  155. * auxiliary clock interrupt.  It does not enable auxiliary clock interrupts.
  156. *
  157. * RETURNS: OK, or ERROR if the routine cannot be connected to the interrupt.
  158. *
  159. * SEE ALSO: intConnect(), sysAuxClkEnable()
  160. */
  161. STATUS sysAuxClkConnect
  162.     (
  163.     FUNCPTR routine,
  164.     int  arg
  165.     )
  166.     {
  167.     int key = intLock(); /* INTERRUPTS LOCKED */
  168.     clockRoutines[1] = routine;
  169.     clockArgs[1] = arg;
  170.     intUnlock (key);
  171.     intConnect ((VOIDFUNCPTR *)TIMER_VEC, (VOIDFUNCPTR)sysClkInt, 0);
  172.     return (0);
  173.     }
  174. /***************************************************************************
  175. *
  176. * sysAuxClkDisable - turn off auxiliary clock interrupts
  177. *
  178. * This routine disables auxiliary clock interrupts.
  179. *
  180. * RETURNS: N/A
  181. *
  182. * SEE ALSO: sysAuxClkEnable()
  183. */
  184. void sysAuxClkDisable (void)
  185.     {
  186.     int key = intLock(); /* INTERRUPTS LOCKED */
  187.     clockEnable[1] = 0;
  188.     win_KillTimer (2);
  189.     intUnlock (key);
  190.     }
  191. /***************************************************************************
  192. *
  193. * sysAuxClkEnable - turn on auxiliary clock interrupts
  194. *
  195. * This routine enables auxiliary clock interrupts.
  196. *
  197. * RETURNS: N/A
  198. *
  199. * SEE ALSO: sysAuxClkConnect(), sysAuxClkDisable(), sysAuxClkRateSet()
  200. */
  201. void sysAuxClkEnable (void)
  202.     {
  203.     int key = intLock(); /* INTERRUPTS LOCKED */
  204.     clockEnable[1] = 1;
  205.     win_SetTimer (2, 1000 / clockRate[1]);
  206.     intUnlock (key);
  207.     }
  208. /***************************************************************************
  209. *
  210. * sysAuxClkRateGet - get the auxiliary clock rate
  211. *
  212. * This routine returns the interrupt rate of the auxiliary clock.
  213. *
  214. * RETURNS: The number of ticks per second of the auxiliary clock.
  215. *
  216. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateSet()
  217. */
  218. int sysAuxClkRateGet (void)
  219.     {
  220.     return (clockRate[1]);
  221.     }
  222. /***************************************************************************
  223. *
  224. * sysAuxClkRateSet - set the auxiliary clock rate
  225. *
  226. * This routine sets the interrupt rate of the auxiliary clock.  It does not
  227. * enable auxiliary clock interrupts.
  228. *
  229. * RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.
  230. *
  231. * SEE ALSO: sysAuxClkEnable(), sysAuxClkRateGet()
  232. */
  233. STATUS sysAuxClkRateSet
  234.     (
  235.     int rate
  236.     )
  237.     {
  238.     if ( (rate < AUX_CLK_RATE_MIN) || (rate > AUX_CLK_RATE_MAX) )
  239.         return(ERROR);
  240.     clockRate[1] = rate;
  241.     if (clockEnable[1])
  242.         {
  243.         win_KillTimer (2);
  244.         win_SetTimer (2, 1000 / clockRate[1]);
  245.         }
  246.     return (OK);
  247.     }