source: rtems/cpukit/rtems/src/rtclock.c @ ea9d7db

4.104.114.84.95
Last change on this file since ea9d7db was ac7d5ef0, checked in by Joel Sherrill <joel.sherrill@…>, on 05/11/95 at 17:39:37

Initial revision

  • Property mode set to 100644
File size: 3.8 KB
Line 
1/*
2 *  Clock Manager
3 *
4 *  COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
5 *  On-Line Applications Research Corporation (OAR).
6 *  All rights assigned to U.S. Government, 1994.
7 *
8 *  This material may be reproduced by or for the U.S. Government pursuant
9 *  to the copyright license under the clause at DFARS 252.227-7013.  This
10 *  notice must appear in all copies of this file and its derivatives.
11 *
12 *  $Id$
13 */
14
15#include <rtems/system.h>
16#include <rtems/clock.h>
17#include <rtems/config.h>
18#include <rtems/isr.h>
19#include <rtems/thread.h>
20#include <rtems/tod.h>
21#include <rtems/watchdog.h>
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:
51      if ( !_TOD_Is_set() )
52        return( RTEMS_NOT_DEFINED );
53
54      *(rtems_time_of_day *)time_buffer = _TOD_Current;
55      return( RTEMS_SUCCESSFUL );
56
57    case RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH:
58      if ( !_TOD_Is_set() )
59        return( RTEMS_NOT_DEFINED );
60
61      *(rtems_interval *)time_buffer = _TOD_Seconds_since_epoch;
62      return( RTEMS_SUCCESSFUL );
63
64    case RTEMS_CLOCK_GET_TICKS_SINCE_BOOT:
65      *(rtems_interval *)time_buffer = _TOD_Ticks_since_boot;
66      return( RTEMS_SUCCESSFUL );
67
68    case RTEMS_CLOCK_GET_TICKS_PER_SECOND:
69      *(rtems_interval *)time_buffer = _TOD_Ticks_per_second;
70      return( RTEMS_SUCCESSFUL );
71
72    case RTEMS_CLOCK_GET_TIME_VALUE:
73      if ( !_TOD_Is_set() )
74        return( RTEMS_NOT_DEFINED );
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
82      tmp *= _Configuration_Table->microseconds_per_tick;
83      ((rtems_clock_time_value *)time_buffer)->microseconds = tmp;
84
85      return( RTEMS_SUCCESSFUL );
86  }
87
88  return( RTEMS_SUCCESSFUL );   /* should never get here */
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{
110  rtems_status_code      local_result;
111  rtems_interval seconds;
112
113  local_result = _TOD_Validate( time_buffer );
114  if ( rtems_is_status_successful( local_result ) ) {
115    seconds = _TOD_To_seconds( time_buffer );
116    _Thread_Disable_dispatch();
117      _TOD_Set( time_buffer, seconds );
118    _Thread_Enable_dispatch();
119
120  }
121  return( local_result );
122}
123
124/*PAGE
125 *
126 *  rtems_clock_tick
127 *
128 *  This directive notifies the executve that a tick has occurred.
129 *  When the tick occurs the time manager updates and maintains
130 *  the calendar time, timeslicing, and any timeout delays.
131 *
132 *  Input parameters:  NONE
133 *
134 *  Output parameters:
135 *    RTEMS_SUCCESSFUL - always succeeds
136 *
137 *  NOTE: This routine only works for leap-years through 2099.
138 */
139
140rtems_status_code rtems_clock_tick( void )
141{
142  _TOD_Tickle_ticks();
143
144  _Watchdog_Tickle_ticks();
145
146  _Thread_Tickle_timeslice();
147
148  if ( _Thread_Is_context_switch_necessary() &&
149       _Thread_Is_dispatching_enabled() )
150    _Thread_Dispatch();
151
152  return( RTEMS_SUCCESSFUL );
153}
Note: See TracBrowser for help on using the repository browser.