source: rtems/cpukit/rtems/src/rtclock.c @ 03f2154e

4.104.114.84.95
Last change on this file since 03f2154e was 03f2154e, checked in by Joel Sherrill <joel.sherrill@…>, on 04/22/97 at 17:20:27

headers updated to reflect new style copyright notice as part
of switching to the modified GNU GPL.

  • Property mode set to 100644
File size: 3.6 KB
RevLine 
[ac7d5ef0]1/*
2 *  Clock Manager
3 *
[03f2154e]4 *  COPYRIGHT (c) 1989-1997.
[ac7d5ef0]5 *  On-Line Applications Research Corporation (OAR).
[03f2154e]6 *  Copyright assigned to U.S. Government, 1994.
[ac7d5ef0]7 *
[03f2154e]8 *  The license and distribution terms for this file may in
9 *  the file LICENSE in this distribution or at
10 *  http://www.OARcorp.com/rtems/license.html.
[ac7d5ef0]11 *
12 *  $Id$
13 */
14
15#include <rtems/system.h>
[3a4ae6c]16#include <rtems/rtems/status.h>
17#include <rtems/rtems/clock.h>
[5e9b32b]18#include <rtems/score/isr.h>
19#include <rtems/score/thread.h>
20#include <rtems/score/tod.h>
21#include <rtems/score/watchdog.h>
[ac7d5ef0]22
23/*PAGE
24 *
25 *  rtems_clock_get
26 *
27 *  This directive returns the current date and time.  If the time has
28 *  not been set by a tm_set then an error is returned.
29 *
30 *  Input parameters:
31 *    option      - which value to return
32 *    time_buffer - pointer to output buffer (a time and date structure
33 *                  or an interval)
34 *
35 *  Output parameters:
36 *    time_buffer      - output filled in
37 *    RTEMS_SUCCESSFUL - if successful
38 *    error code       - if unsuccessful
39 */
40
41rtems_status_code rtems_clock_get(
42  rtems_clock_get_options  option,
43  void                    *time_buffer
44)
45{
46  ISR_Level      level;
47  rtems_interval tmp;
48
49  switch ( option ) {
50    case RTEMS_CLOCK_GET_TOD:
[7fea679b]51      if ( !_TOD_Is_set )
[3a4ae6c]52        return RTEMS_NOT_DEFINED;
[ac7d5ef0]53
54      *(rtems_time_of_day *)time_buffer = _TOD_Current;
[3a4ae6c]55      return RTEMS_SUCCESSFUL;
[ac7d5ef0]56
57    case RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH:
[7fea679b]58      if ( !_TOD_Is_set )
[3a4ae6c]59        return RTEMS_NOT_DEFINED;
[ac7d5ef0]60
61      *(rtems_interval *)time_buffer = _TOD_Seconds_since_epoch;
[3a4ae6c]62      return RTEMS_SUCCESSFUL;
[ac7d5ef0]63
64    case RTEMS_CLOCK_GET_TICKS_SINCE_BOOT:
[5e7b6272]65      *(rtems_interval *)time_buffer = _Watchdog_Ticks_since_boot;
[3a4ae6c]66      return RTEMS_SUCCESSFUL;
[ac7d5ef0]67
68    case RTEMS_CLOCK_GET_TICKS_PER_SECOND:
69      *(rtems_interval *)time_buffer = _TOD_Ticks_per_second;
[3a4ae6c]70      return RTEMS_SUCCESSFUL;
[ac7d5ef0]71
72    case RTEMS_CLOCK_GET_TIME_VALUE:
[7fea679b]73      if ( !_TOD_Is_set )
[3a4ae6c]74        return RTEMS_NOT_DEFINED;
[ac7d5ef0]75
76      _ISR_Disable( level );
77        ((rtems_clock_time_value *)time_buffer)->seconds =
78          _TOD_Seconds_since_epoch;
79        tmp = _TOD_Current.ticks;
80      _ISR_Enable( level );
81
[3a4ae6c]82      tmp *= _TOD_Microseconds_per_tick;
[ac7d5ef0]83      ((rtems_clock_time_value *)time_buffer)->microseconds = tmp;
84
[3a4ae6c]85      return RTEMS_SUCCESSFUL;
[ac7d5ef0]86  }
87
[3a4ae6c]88  return RTEMS_INTERNAL_ERROR;   /* should never get here */
[ac7d5ef0]89
90}
91
92/*PAGE
93 *
94 *  rtems_clock_set
95 *
96 *  This directive sets the date and time for this node.
97 *
98 *  Input parameters:
99 *    time_buffer - pointer to the time and date structure
100 *
101 *  Output parameters:
102 *    RTEMS_SUCCESSFUL - if successful
103 *    error code        - if unsuccessful
104 */
105
106rtems_status_code rtems_clock_set(
107  rtems_time_of_day *time_buffer
108)
109{
[3a4ae6c]110  rtems_interval     seconds;
[ac7d5ef0]111
[3a4ae6c]112  if ( _TOD_Validate( time_buffer ) ) {
[ac7d5ef0]113    seconds = _TOD_To_seconds( time_buffer );
114    _Thread_Disable_dispatch();
115      _TOD_Set( time_buffer, seconds );
116    _Thread_Enable_dispatch();
[3a4ae6c]117    return RTEMS_SUCCESSFUL;
[ac7d5ef0]118  }
[3a4ae6c]119  return RTEMS_INVALID_CLOCK;
[ac7d5ef0]120}
121
122/*PAGE
123 *
124 *  rtems_clock_tick
125 *
126 *  This directive notifies the executve that a tick has occurred.
127 *  When the tick occurs the time manager updates and maintains
128 *  the calendar time, timeslicing, and any timeout delays.
129 *
130 *  Input parameters:  NONE
131 *
132 *  Output parameters:
133 *    RTEMS_SUCCESSFUL - always succeeds
134 *
135 *  NOTE: This routine only works for leap-years through 2099.
136 */
137
138rtems_status_code rtems_clock_tick( void )
139{
140  _TOD_Tickle_ticks();
141
142  _Watchdog_Tickle_ticks();
143
144  _Thread_Tickle_timeslice();
145
146  if ( _Thread_Is_context_switch_necessary() &&
147       _Thread_Is_dispatching_enabled() )
148    _Thread_Dispatch();
149
[3a4ae6c]150  return RTEMS_SUCCESSFUL;
[ac7d5ef0]151}
Note: See TracBrowser for help on using the repository browser.