summaryrefslogblamecommitdiffstats
path: root/cpukit/include/rtems/rtems/timer.h
blob: 0f13c04bdae082feaecd2a41ff8d73fc01baca5f (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11

                                           
   
        
  
                                 
  



                                                          
                                                                                





















                                                                              

   
  




                                                                       
                                  
  




                                                                          
  
                         

   

                                                

                            
 
                   
                             

                               
                                      
 



                  

                                               
   
                                               
  
                           
  
                                                                  
   
 









                                                                       
 





                                                                             

                                   









                                                                           
 
   


                                                                          
   
              
     
                                                                       



                

                                                                               
     
                                               

     

                                                                               
     

                                                        

     

                                                                               
     

                                                   

     

                                                                                 
     

                                                           
                           

                
                                                     
 
   


                                                           
   





























                                                                                 
 
   



                                           
                                     
  


                                                                            
  

                                                      
                                                                     
  



                                                                               
  












                                                                         
   


                                              

  

                                                                 
   



                                                                             
  








                                                                           
  

                                                                             
  
                                                                               
   


                                                               
 
   
                                
  

                                                                           
   


                                                                                               
 
   



                                
                                               
  


                                                                              
  



                                                                               
  

                                                                     
                                                                   



                                                                              

                                                                            


             

                                                                           


                                                                            




                                                     
  













                                                                               
               
   


                                                                      
 
   



                                                

                                             


                                                                              
  
                                                                           

                         







                                                                              




                                                                            
                                                                   


                                                                             











                                                                             
               
   


                                                                     
 
   



                                

                                     

                                                                            


                                                                              
  



                                                                               
  












                                                                         
   


                                                    
 
   



                                

                                     

                                                                         
  





                                                                               


                                                        
            
                                                     
  

                                                                         
  









                                                                               
               
   


                                                    
 
   


                                             
  







                                                                           






                                                                               







                                                                               
  












                                                                         
   




                                             

  

                                                   
   


                                             
  







                                                                           





                                                                              











                                                                               
  












                                                                         
   

                                        
                                              

                                             

  

                                                         
   
                                
  
                                     
  





                                                     



                                                                             














                                                                               

             

                                                                               


















                                                                               
               
   
                                              


                                   

  
                                                           
 
   



                                                                    







                                                                           






                                                                               









                                                                               
  












                                                                         
   







                                                          
 
   
                                
  

                                                                    




                                                                 
  
                                                                           
  





                                                                              













                                                                               
  












                                                                         
   

                                               
                                              

                                             

  






                                               

                                     






                                                                               








                                                                               





                                                                            
               













                                                                         

                                                   




                  
                                 
/* SPDX-License-Identifier: BSD-2-Clause */

/**
 * @file
 *
 * @ingroup RTEMSImplClassicTimer
 *
 * @brief This header file provides the Timer Manager API.
 */

/*
 * Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de)
 * Copyright (C) 1988, 2008 On-Line Applications Research Corporation (OAR)
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * This file is part of the RTEMS quality process and was automatically
 * generated.  If you find something that needs to be fixed or
 * worded better please post a report or patch to an RTEMS mailing list
 * or raise a bug report:
 *
 * https://www.rtems.org/bugs.html
 *
 * For information on updating and regenerating please refer to the How-To
 * section in the Software Requirements Engineering chapter of the
 * RTEMS Software Engineering manual.  The manual is provided as a part of
 * a release.  For development sources please refer to the online
 * documentation at:
 *
 * https://docs.rtems.org
 */

/* Generated from spec:/rtems/timer/if/header */

#ifndef _RTEMS_RTEMS_TIMER_H
#define _RTEMS_RTEMS_TIMER_H

#include <stddef.h>
#include <rtems/rtems/attr.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/types.h>
#include <rtems/score/watchdogticks.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Generated from spec:/rtems/timer/if/group */

/**
 * @defgroup RTEMSAPIClassicTimer Timer Manager
 *
 * @ingroup RTEMSAPIClassic
 *
 * @brief The Timer Manager provides support for timer facilities.
 */

/* Generated from spec:/rtems/timer/if/class-bit-not-dormant */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief This timer class bit indicates that the timer is not dormant.
 */
#define TIMER_CLASS_BIT_NOT_DORMANT 0x4

/* Generated from spec:/rtems/timer/if/class-bit-on-task */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief This timer class bit indicates that the timer routine executes in a
 *   task context.
 */
#define TIMER_CLASS_BIT_ON_TASK 0x2

/* Generated from spec:/rtems/timer/if/class-bit-time-of-day */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief This timer class bit indicates that the timer uses a time of day.
 */
#define TIMER_CLASS_BIT_TIME_OF_DAY 0x1

/* Generated from spec:/rtems/timer/if/classes */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief The timer class indicates how the timer was most recently fired.
 */
typedef enum {
  /**
   * @brief This timer class indicates that the timer was never in use.
   */
  TIMER_DORMANT,

  /**
   * @brief This timer class indicates that the timer is currently in use as an
   *   interval timer which will fire in the context of the clock tick ISR.
   */
  TIMER_INTERVAL = TIMER_CLASS_BIT_NOT_DORMANT,

  /**
   * @brief This timer class indicates that the timer is currently in use as an
   *   interval timer which will fire in the context of the Timer Server task.
   */
  TIMER_INTERVAL_ON_TASK = TIMER_CLASS_BIT_NOT_DORMANT |
    TIMER_CLASS_BIT_ON_TASK,

  /**
   * @brief This timer class indicates that the timer is currently in use as an
   *   time of day timer which will fire in the context of the clock tick ISR.
   */
  TIMER_TIME_OF_DAY = TIMER_CLASS_BIT_NOT_DORMANT |
    TIMER_CLASS_BIT_TIME_OF_DAY,

  /**
   * @brief This timer class indicates that the timer is currently in use as an
   *   time of day timer which will fire in the context of the Timer Server task.
   */
  TIMER_TIME_OF_DAY_ON_TASK = TIMER_CLASS_BIT_NOT_DORMANT |
    TIMER_CLASS_BIT_TIME_OF_DAY |
    TIMER_CLASS_BIT_ON_TASK
} Timer_Classes;

/* Generated from spec:/rtems/timer/if/information */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief The structure contains information about a timer.
 */
typedef struct {
  /**
   * @brief The timer class member indicates how the timer was most recently
   *   fired.
   */
  Timer_Classes the_class;

  /**
   * @brief This member indicates the initial requested interval.
   */
  Watchdog_Interval initial;

  /**
   * @brief This member indicates the time the timer was initially scheduled.
   *
   * The time is in clock ticks since the clock driver initialization or the last
   * clock tick counter overflow.
   */
  Watchdog_Interval start_time;

  /**
   * @brief This member indicates the time the timer was scheduled to fire.
   *
   * The time is in clock ticks since the clock driver initialization or the last
   * clock tick counter overflow.
   */
  Watchdog_Interval stop_time;
} rtems_timer_information;

/* Generated from spec:/rtems/timer/if/get-information */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Gets information about the timer.
 *
 * @param id is the timer identifier.
 *
 * @param[out] the_info is the pointer to an rtems_timer_information object.
 *   When the directive call is successful, the information about the timer
 *   will be stored in this object.
 *
 * This directive returns information about the timer.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``the_info`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no timer associated with the identifier
 *   specified by ``id``.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_timer_get_information(
  rtems_id                 id,
  rtems_timer_information *the_info
);

/* Generated from spec:/rtems/timer/if/server-default-priority */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief This constant represents the default value for the task priority of
 *   the Timer Server.
 *
 * When given this priority, a special high priority not accessible via the
 * Classic API is used.
 */
#define RTEMS_TIMER_SERVER_DEFAULT_PRIORITY ( (rtems_task_priority) -1 )

/* Generated from spec:/rtems/timer/if/service-routine */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief This type defines the return type of routines which can be fired by
 *   directives of the Timer Manager.
 *
 * This type can be used to document timer service routines in the source code.
 */
typedef void rtems_timer_service_routine;

/* Generated from spec:/rtems/timer/if/service-routine-entry */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief This type defines the prototype of routines which can be fired by
 *   directives of the Timer Manager.
 */
typedef rtems_timer_service_routine ( *rtems_timer_service_routine_entry )( rtems_id, void * );

/* Generated from spec:/rtems/timer/if/create */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Creates a timer.
 *
 * @param name is the object name of the timer.
 *
 * @param[out] id is the pointer to an ::rtems_id object.  When the directive
 *   call is successful, the identifier of the created timer will be stored in
 *   this object.
 *
 * This directive creates a timer which resides on the local node.  The timer
 * has the user-defined object name specified in ``name``.  The assigned object
 * identifier is returned in ``id``.  This identifier is used to access the
 * timer with other timer related directives.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_NAME The ``name`` parameter was invalid.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``id`` parameter was NULL.
 *
 * @retval ::RTEMS_TOO_MANY There was no inactive object available to create a
 *   timer.  The number of timers available to the application is configured
 *   through the #CONFIGURE_MAXIMUM_TIMERS application configuration option.
 *
 * @par Notes
 * @parblock
 * The processor used to maintain the timer is the processor of the calling
 * task at some point during the timer creation.
 *
 * For control and maintenance of the timer, RTEMS allocates a TMCB from the
 * local TMCB free pool and initializes it.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may obtain and release the object allocator mutex.  This may
 *   cause the calling task to be preempted.
 *
 * * The number of timers available to the application is configured through
 *   the #CONFIGURE_MAXIMUM_TIMERS application configuration option.
 *
 * * Where the object class corresponding to the directive is configured to use
 *   unlimited objects, the directive may allocate memory from the RTEMS
 *   Workspace.
 * @endparblock
 */
rtems_status_code rtems_timer_create( rtems_name name, rtems_id *id );

/* Generated from spec:/rtems/timer/if/ident */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Identifies a timer by the object name.
 *
 * @param name is the object name to look up.
 *
 * @param[out] id is the pointer to an ::rtems_id object.  When the directive
 *   call is successful, the object identifier of an object with the specified
 *   name will be stored in this object.
 *
 * This directive obtains a timer identifier associated with the timer name
 * specified in ``name``.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``id`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_NAME The ``name`` parameter was 0.
 *
 * @retval ::RTEMS_INVALID_NAME There was no object with the specified name on
 *   the local node.
 *
 * @par Notes
 * @parblock
 * If the timer name is not unique, then the timer identifier will match the
 * first timer with that name in the search order.  However, this timer
 * identifier is not guaranteed to correspond to the desired timer.
 *
 * The objects are searched from lowest to the highest index.  Only the local
 * node is searched.
 *
 * The timer identifier is used with other timer related directives to access
 * the timer.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within any runtime context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_timer_ident( rtems_name name, rtems_id *id );

/* Generated from spec:/rtems/timer/if/cancel */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Cancels the timer.
 *
 * @param id is the timer identifier.
 *
 * This directive cancels the timer specified by ``id``.  This timer will be
 * reinitiated by the next invocation of rtems_timer_reset(),
 * rtems_timer_fire_after(), rtems_timer_fire_when(),
 * rtems_timer_server_fire_after(), or rtems_timer_server_fire_when() with the
 * same timer identifier.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no timer associated with the identifier
 *   specified by ``id``.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_timer_cancel( rtems_id id );

/* Generated from spec:/rtems/timer/if/delete */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Deletes the timer.
 *
 * @param id is the timer identifier.
 *
 * This directive deletes the timer specified by ``id``.  If the timer is
 * running, it is automatically canceled.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no timer associated with the identifier
 *   specified by ``id``.
 *
 * @par Notes
 * The TMCB for the deleted timer is reclaimed by RTEMS.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive may obtain and release the object allocator mutex.  This may
 *   cause the calling task to be preempted.
 *
 * * The calling task does not have to be the task that created the object.
 *   Any local task that knows the object identifier can delete the object.
 *
 * * Where the object class corresponding to the directive is configured to use
 *   unlimited objects, the directive may free memory to the RTEMS Workspace.
 * @endparblock
 */
rtems_status_code rtems_timer_delete( rtems_id id );

/* Generated from spec:/rtems/timer/if/fire-after */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Fires the timer after the interval.
 *
 * @param id is the timer identifier.
 *
 * @param ticks is the interval until the routine is fired in clock ticks.
 *
 * @param routine is the routine to schedule.
 *
 * @param user_data is the argument passed to the routine when it is fired.
 *
 * This directive initiates the timer specified by ``id``.  If the timer is
 * running, it is automatically canceled before being initiated.  The timer is
 * scheduled to fire after an interval of clock ticks has passed specified by
 * ``ticks``.  When the timer fires, the timer service routine ``routine`` will
 * be invoked with the argument ``user_data`` in the context of the clock tick
 * ISR.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_NUMBER The ``ticks`` parameter was 0.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``routine`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no timer associated with the identifier
 *   specified by ``id``.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_timer_fire_after(
  rtems_id                          id,
  rtems_interval                    ticks,
  rtems_timer_service_routine_entry routine,
  void                             *user_data
);

/* Generated from spec:/rtems/timer/if/fire-when */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Fires the timer at the time of day.
 *
 * @param id is the timer identifier.
 *
 * @param wall_time is the time of day when the routine is fired.
 *
 * @param routine is the routine to schedule.
 *
 * @param user_data is the argument passed to the routine when it is fired.
 *
 * This directive initiates the timer specified by ``id``.  If the timer is
 * running, it is automatically canceled before being initiated.  The timer is
 * scheduled to fire at the time of day specified by ``wall_time``.  When the
 * timer fires, the timer service routine ``routine`` will be invoked with the
 * argument ``user_data`` in the context of the clock tick ISR.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_NOT_DEFINED The system date and time was not set.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``routine`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``wall_time`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_CLOCK The time of day was invalid.
 *
 * @retval ::RTEMS_INVALID_ID There was no timer associated with the identifier
 *   specified by ``id``.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_timer_fire_when(
  rtems_id                          id,
  const rtems_time_of_day          *wall_time,
  rtems_timer_service_routine_entry routine,
  void                             *user_data
);

/* Generated from spec:/rtems/timer/if/initiate-server */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Initiates the Timer Server.
 *
 * @param priority is the task priority.
 *
 * @param stack_size is the task stack size in bytes.
 *
 * @param attribute_set is the task attribute set.
 *
 * This directive initiates the Timer Server task.  This task is responsible
 * for executing all timers initiated via the rtems_timer_server_fire_after()
 * or rtems_timer_server_fire_when() directives.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INCORRECT_STATE The Timer Server was already initiated.
 *
 * @retval ::RTEMS_INVALID_PRIORITY The task priority was invalid.
 *
 * @retval ::RTEMS_TOO_MANY There was no inactive task object available to
 *   create the Timer Server task.
 *
 * @retval ::RTEMS_UNSATISFIED There was not enough memory to allocate the task
 *   storage area.  The task storage area contains the task stack, the
 *   thread-local storage, and the floating point context.
 *
 * @retval ::RTEMS_UNSATISFIED One of the task create extensions failed to
 *   create the Timer Server task.
 *
 * @par Notes
 * The Timer Server task is created using the rtems_task_create() directive and
 * must be accounted for when configuring the system.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may obtain and release the object allocator mutex.  This may
 *   cause the calling task to be preempted.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The number of timers available to the application is configured through
 *   the #CONFIGURE_MAXIMUM_TIMERS application configuration option.
 *
 * * Where the object class corresponding to the directive is configured to use
 *   unlimited objects, the directive may allocate memory from the RTEMS
 *   Workspace.
 * @endparblock
 */
rtems_status_code rtems_timer_initiate_server(
  rtems_task_priority priority,
  size_t              stack_size,
  rtems_attribute     attribute_set
);

/* Generated from spec:/rtems/timer/if/server-fire-after */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Fires the timer after the interval using the Timer Server.
 *
 * @param id is the timer identifier.
 *
 * @param ticks is the interval until the routine is fired in clock ticks.
 *
 * @param routine is the routine to schedule.
 *
 * @param user_data is the argument passed to the routine when it is fired.
 *
 * This directive initiates the timer specified by ``id``.  If the timer is
 * running, it is automatically canceled before being initiated.  The timer is
 * scheduled to fire after an interval of clock ticks has passed specified by
 * ``ticks``.  When the timer fires, the timer service routine ``routine`` will
 * be invoked with the argument ``user_data`` in the context of the Timer
 * Server task.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INCORRECT_STATE The Timer Server was not initiated.
 *
 * @retval ::RTEMS_INVALID_NUMBER The ``ticks`` parameter was 0.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``routine`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ID There was no timer associated with the identifier
 *   specified by ``id``.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_timer_server_fire_after(
  rtems_id                          id,
  rtems_interval                    ticks,
  rtems_timer_service_routine_entry routine,
  void                             *user_data
);

/* Generated from spec:/rtems/timer/if/server-fire-when */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Fires the timer at the time of day using the Timer Server.
 *
 * @param id is the timer identifier.
 *
 * @param wall_time is the time of day when the routine is fired.
 *
 * @param routine is the routine to schedule.
 *
 * @param user_data is the argument passed to the routine when it is fired.
 *
 * This directive initiates the timer specified by ``id``.  If the timer is
 * running, it is automatically canceled before being initiated.  The timer is
 * scheduled to fire at the time of day specified by ``wall_time``.  When the
 * timer fires, the timer service routine ``routine`` will be invoked with the
 * argument ``user_data`` in the context of the Timer Server task.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INCORRECT_STATE The Timer Server was not initiated.
 *
 * @retval ::RTEMS_NOT_DEFINED The system date and time was not set.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``routine`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_ADDRESS The ``wall_time`` parameter was NULL.
 *
 * @retval ::RTEMS_INVALID_CLOCK The time of day was invalid.
 *
 * @retval ::RTEMS_INVALID_ID There was no timer associated with the identifier
 *   specified by ``id``.
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_timer_server_fire_when(
  rtems_id                          id,
  const rtems_time_of_day          *wall_time,
  rtems_timer_service_routine_entry routine,
  void                             *user_data
);

/* Generated from spec:/rtems/timer/if/reset */

/**
 * @ingroup RTEMSAPIClassicTimer
 *
 * @brief Resets the timer.
 *
 * @param id is the timer identifier.
 *
 * This directive resets the timer specified by ``id``.  This timer must have
 * been previously initiated with either the rtems_timer_fire_after() or
 * rtems_timer_server_fire_after() directive.  If active the timer is canceled,
 * after which the timer is reinitiated using the same interval and timer
 * service routine which the original rtems_timer_fire_after() or
 * rtems_timer_server_fire_after() directive used.
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_INVALID_ID There was no timer associated with the identifier
 *   specified by ``id``.
 *
 * @retval ::RTEMS_NOT_DEFINED The timer was not of the interval class.
 *
 * @par Notes
 * @parblock
 * If the timer has not been used or the last usage of this timer was by a
 * rtems_timer_fire_when() or rtems_timer_server_fire_when() directive, then
 * the ::RTEMS_NOT_DEFINED error is returned.
 *
 * Restarting a cancelled after timer results in the timer being reinitiated
 * with its previous timer service routine and interval.
 * @endparblock
 *
 * @par Constraints
 * @parblock
 * The following constraints apply to this directive:
 *
 * * The directive may be called from within interrupt context.
 *
 * * The directive may be called from within device driver initialization
 *   context.
 *
 * * The directive may be called from within task context.
 *
 * * The directive will not cause the calling task to be preempted.
 * @endparblock
 */
rtems_status_code rtems_timer_reset( rtems_id id );

#ifdef __cplusplus
}
#endif

#endif /* _RTEMS_RTEMS_TIMER_H */