SysTimeM.nc
上传用户:joranyuan
上传日期:2022-06-23
资源大小:3306k
文件大小:3k
源码类别:

网络

开发平台:

Others

  1. /*
  2.  * Copyright (c) 2003, Vanderbilt University
  3.  * All rights reserved.
  4.  *
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice, the following
  8.  * two paragraphs and the author appear in all copies of this software.
  9.  * 
  10.  * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT
  13.  * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  * 
  15.  * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20.  *
  21.  * Author: Miklos Maroti
  22.  * Date last modified: 12/07/03
  23.  */
  24. /**
  25.  * This module provides a 921.6 KHz timer on the MICA2 platform,
  26.  * and 500 KHz timer on the MICA2DOT platform. We use 1/8 prescaling.
  27.  */
  28. module SysTimeM
  29. {
  30. provides 
  31. {
  32. interface StdControl;
  33. interface SysTime;
  34. }
  35. }
  36. implementation
  37. {
  38. // this field holds the high 16 bits of the current time
  39. uint16_t currentTime;
  40. union time_u
  41. {
  42. struct
  43. {
  44. uint16_t low;
  45. uint16_t high;
  46. };
  47. uint32_t full;
  48. };
  49. async command uint16_t SysTime.getTime16()
  50. {
  51. return __inw_atomic(TCNT3L);
  52. }
  53. async command uint32_t SysTime.getTime32()
  54. {
  55. register union time_u time;
  56. atomic
  57. {
  58. time.low = __inw(TCNT3L);
  59. time.high = currentTime;
  60. // maybe there was a pending interrupt
  61. if( bit_is_set(ETIFR, TOV3) && ((int16_t)time.low) >= 0 )
  62. ++time.high;
  63. }
  64. return time.full;
  65. }
  66. async command uint32_t SysTime.castTime16(uint16_t time16)
  67. {
  68. uint32_t time = call SysTime.getTime32();
  69. time += (int16_t)time16 - (int16_t)time;
  70. return time;
  71. }
  72. // Use SIGNAL instead of INTERRUPT to get atomic update of time
  73. TOSH_SIGNAL(SIG_OVERFLOW3)
  74. {
  75. ++currentTime;
  76. }
  77. command result_t StdControl.init()
  78. {
  79. uint8_t etimsk;
  80. outp(0x00, TCCR3A);
  81. outp(0x00, TCCR3B);
  82. atomic
  83. {
  84. etimsk = inp(ETIMSK);
  85. etimsk &= (1<<OCIE1C);
  86. etimsk |= (1<<TOIE3);
  87. outp(etimsk, ETIMSK);
  88. }
  89. return SUCCESS;
  90. }
  91. command result_t StdControl.start()
  92. {
  93. // start the timer with 1/8 prescaler, 921.6 KHz on MICA2
  94. outp(0x02, TCCR3B);
  95. return SUCCESS;
  96. }
  97. command result_t StdControl.stop()
  98. {
  99. // stop the timer
  100. outp(0x00, TCCR3B);
  101. return SUCCESS;
  102. }
  103. }