source: rtems/c/src/exec/rtems/src/clock.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
Line 
1/*
2 *  Clock Manager
3 *
4 *  COPYRIGHT (c) 1989-1997.
5 *  On-Line Applications Research Corporation (OAR).
6 *  Copyright assigned to U.S. Government, 1994.
7 *
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.
11 *
12 *  $Id$
13 */
14
15#include <rtems/system.h>
16#include <rtems/rtems/status.h>
17#include <rtems/rtems/clock.h>
18#include <rtems/score/isr.h>
19#include <rtems/score/thread.h>
20#include <rtems/score/tod.h>
21#include <rtems/score/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 = _Watchdog_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 *= _TOD_Microseconds_per_tick;
83      ((rtems_clock_time_value *)time_buffer)->microseconds = tmp;
84
85      return RTEMS_SUCCESSFUL;
86  }
87
88  return RTEMS_INTERNAL_ERROR;   /* 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_interval     seconds;
111
112  if ( _TOD_Validate( time_buffer ) ) {
113    seconds = _TOD_To_seconds( time_buffer );
114    _Thread_Disable_dispatch();
115      _TOD_Set( time_buffer, seconds );
116    _Thread_Enable_dispatch();
117    return RTEMS_SUCCESSFUL;
118  }
119  return RTEMS_INVALID_CLOCK;
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
150  return RTEMS_SUCCESSFUL;
151}
Note: See TracBrowser for help on using the repository browser.