/* ratemon.h
*
* This include file contains all the constants, structures, and
* prototypes associated with the Rate Monotonic Manager. This manager
* provides facilities to implement tasks which execute in a periodic fashion.
*
* Directives provided are:
*
* + create a rate monotonic timer
* + cancel a period
* + delete a rate monotonic timer
* + conclude current and start the next period
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
* All rights assigned to U.S. Government, 1994.
*
* This material may be reproduced by or for the U.S. Government pursuant
* to the copyright license under the clause at DFARS 252.227-7013. This
* notice must appear in all copies of this file and its derivatives.
*
* $Id$
*/
#ifndef __RTEMS_RATE_MONOTONIC_h
#define __RTEMS_RATE_MONOTONIC_h
#ifdef __cplusplus
extern "C" {
#endif
#include <rtems/object.h>
#include <rtems/thread.h>
#include <rtems/watchdog.h>
/*
* The following enumerated type defines the states in which a
* period may be.
*/
typedef enum {
RATE_MONOTONIC_INACTIVE, /* off chain, never initialized */
RATE_MONOTONIC_ACTIVE, /* on chain, running continuously */
RATE_MONOTONIC_EXPIRED /* off chain, will be reset by next rm_period */
} Rate_Monotonic_Period_states;
/*
* The following constant is the interval passed to the rate_monontonic_period
* directive to obtain status information.
*/
#define RTEMS_PERIOD_STATUS RTEMS_NO_TIMEOUT
/*
* The following structure defines the control block used to manage
* each period.
*/
typedef struct {
Objects_Control Object;
Watchdog_Control Timer;
Rate_Monotonic_Period_states state;
Thread_Control *owner;
} Rate_monotonic_Control;
EXTERN Objects_Information _Rate_monotonic_Information;
/*
* _Rate_monotonic_Manager_initialization
*
* DESCRIPTION:
*
* This routine performs the initialization necessary for this manager.
*/
void _Rate_monotonic_Manager_initialization(
unsigned32 maximum_periods
);
/*
* rtems_rate_monotonic_create
*
* DESCRIPTION:
*
* This routine implements the rate_monotonic_create directive. The
* period will have the name name. It returns the id of the
* created period in ID.
*/
rtems_status_code rtems_rate_monotonic_create(
Objects_Name name,
Objects_Id *id
);
/*
* rtems_rate_monotonic_ident
*
* DESCRIPTION:
*
* This routine implements the rtems_rate_monotonic_ident directive.
* This directive returns the period ID associated with name.
* If more than one period is named name, then the period
* to which the ID belongs is arbitrary.
*/
rtems_status_code rtems_rate_monotonic_ident(
Objects_Name name,
Objects_Id *id
);
/*
* rtems_rate_monotonic_cancel
*
* DESCRIPTION:
*
* This routine implements the rtems_rate_monotonic_cancel directive. This
* directive stops the period associated with ID from continuing to
* run.
*/
rtems_status_code rtems_rate_monotonic_cancel(
Objects_Id id
);
/*
* rtems_rate_monotonic_delete
*
* DESCRIPTION:
*
* This routine implements the rtems_rate_monotonic_delete directive. The
* period indicated by ID is deleted.
*/
rtems_status_code rtems_rate_monotonic_delete(
Objects_Id id
);
/*
* rtems_rate_monotonic_period
*
* DESCRIPTION:
*
* This routine implements the rtems_rate_monotonic_period directive. When
* length is non-zero, this directive initiates the period associated with
* ID from continuing for a period of length. If length is zero, then
* result is set to indicate the current state of the period.
*/
rtems_status_code rtems_rate_monotonic_period(
Objects_Id id,
rtems_interval length
);
/*
* _Rate_monotonic_Allocate
*
* DESCRIPTION:
*
* This function allocates a period control block from
* the inactive chain of free period control blocks.
*/
STATIC INLINE Rate_monotonic_Control *_Rate_monotonic_Allocate( void );
/*
* _Rate_monotonic_Free
*
* DESCRIPTION:
*
* This routine allocates a period control block from
* the inactive chain of free period control blocks.
*/
STATIC INLINE void _Rate_monotonic_Free (
Rate_monotonic_Control *the_period
);
/*
* _Rate_monotonic_Get
*
* DESCRIPTION:
*
* This function maps period IDs to period control blocks.
* If ID corresponds to a local period, then it returns
* the_period control pointer which maps to ID and location
* is set to OBJECTS_LOCAL. Otherwise, location is set
* to OBJECTS_ERROR and the_period is undefined.
*/
STATIC INLINE Rate_monotonic_Control *_Rate_monotonic_Get (
Objects_Id id,
Objects_Locations *location
);
/*
* _Rate_monotonic_Set_state
*
* DESCRIPTION:
*
* This function blocks the calling task so that it is waiting for
* a period to expire. It returns TRUE if the task was successfully
* blocked, and FALSE otherwise.
*/
boolean _Rate_monotonic_Set_state(
Rate_monotonic_Control *the_period
);
/*
* _Rate_monotonic_Timeout
*
* DESCRIPTION:
*
* This routine is invoked when the period represented
* by ID expires. If the task which owns this period is blocked
* waiting for the period to expire, then it is readied and the
* period is restarted. If the owning task is not waiting for the
* period to expire, then the period is placed in the EXPIRED
* state and not restarted.
*/
void _Rate_monotonic_Timeout (
Objects_Id id,
void *ignored
);
/*
* _Rate_monotonic_Is_active
*
* DESCRIPTION:
*
* This function returns TRUE if the_period is in the ACTIVE state,
* and FALSE otherwise.
*/
STATIC INLINE boolean _Rate_monotonic_Is_active (
Rate_monotonic_Control *the_period
);
/*
* _Rate_monotonic_Is_inactive
*
* DESCRIPTION:
*
* This function returns TRUE if the_period is in the ACTIVE state,
* and FALSE otherwise.
*/
STATIC INLINE boolean _Rate_monotonic_Is_inactive (
Rate_monotonic_Control *the_period
);
/*
* _Rate_monotonic_Is_expired
*
* DESCRIPTION:
*
* This function returns TRUE if the_period is in the EXPIRED state,
* and FALSE otherwise.
*/
STATIC INLINE boolean _Rate_monotonic_Is_expired (
Rate_monotonic_Control *the_period
);
/*
* _Rate_monotonic_Is_null
*
* DESCRIPTION:
*
* This function returns TRUE if the_period is NULL and FALSE otherwise.
*/
STATIC INLINE boolean _Rate_monotonic_Is_null (
Rate_monotonic_Control *the_period
);
#include <rtems/ratemon.inl>
#ifdef __cplusplus
}
#endif
#endif
/* end of include file */