diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-07-23 13:13:45 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-07-23 15:12:54 +0200 |
commit | ecdcf01adddae75aaf496e95425ef927aeffca15 (patch) | |
tree | 88e108c8d19f3291772bf85f5cf1a359d013f17e /cpukit/rtems/include/rtems/rtems | |
parent | score: Include <string.h> in basedefs.h (diff) | |
download | rtems-ecdcf01adddae75aaf496e95425ef927aeffca15.tar.bz2 |
rtems: Create ratemon implementation header
Move implementation specific parts of ratemon.h and ratemon.inl into
new header file ratemonimpl.h. The ratemon.h contains now only the
application visible API.
Diffstat (limited to 'cpukit/rtems/include/rtems/rtems')
-rw-r--r-- | cpukit/rtems/include/rtems/rtems/ratemon.h | 167 | ||||
-rw-r--r-- | cpukit/rtems/include/rtems/rtems/ratemonimpl.h | 279 |
2 files changed, 288 insertions, 158 deletions
diff --git a/cpukit/rtems/include/rtems/rtems/ratemon.h b/cpukit/rtems/include/rtems/rtems/ratemon.h index 634889aeeb..942fbaff3d 100644 --- a/cpukit/rtems/include/rtems/rtems/ratemon.h +++ b/cpukit/rtems/include/rtems/rtems/ratemon.h @@ -31,18 +31,16 @@ #ifndef _RTEMS_RTEMS_RATEMON_H #define _RTEMS_RTEMS_RATEMON_H -/** - * This constant is defined to extern most of the time when using - * this header file. However by defining it to nothing, the data - * declared in this header file can be instantiated. This is done - * in a single per manager file. - */ -#ifndef RTEMS_RATEMON_EXTERN -#define RTEMS_RATEMON_EXTERN extern -#endif - +#include <rtems/rtems/types.h> +#include <rtems/rtems/status.h> +#include <rtems/score/thread.h> +#include <rtems/score/watchdog.h> #include <rtems/bspIo.h> +#ifdef __cplusplus +extern "C" { +#endif + /** * @defgroup ClassicRateMon Rate Monotonic Scheduler * @@ -60,10 +58,6 @@ */ /**@{*/ -#ifdef __cplusplus -extern "C" { -#endif - /** * This is the public type used for the rate monotonic timing * statistics. @@ -88,15 +82,6 @@ extern "C" { typedef uint32_t Rate_monotonic_Period_time_t; #endif -#include <rtems/score/object.h> -#include <rtems/score/thread.h> -#include <rtems/score/watchdog.h> -#include <rtems/rtems/status.h> -#include <rtems/rtems/support.h> - -#include <string.h> - - /** * The following enumerated type defines the states in which a * period may be. @@ -265,23 +250,6 @@ typedef struct { } Rate_monotonic_Control; /** - * @brief Rate Monotonic Period Class Management Structure - * - * This instance of Objects_Information is used to manage the - * set of rate monotonic period instances. - */ -RTEMS_RATEMON_EXTERN Objects_Information _Rate_monotonic_Information; - -/** - * @brief Rate Monotonic Manager Initialization - * - * This routine performs the initialization necessary for this manager. - * - * @note The Rate Monotonic Manager is built on top of the Watchdog Handler - */ -void _Rate_monotonic_Manager_initialization(void); - -/** * @brief Create a Period * * Rate Monotonic Manager @@ -443,128 +411,11 @@ rtems_status_code rtems_rate_monotonic_period( rtems_interval length ); -/** - * @brief Rate Monotonic Timeout - * - * This routine is invoked when the period represented - * by ID expires. If the thread which owns this period is blocked - * waiting for the period to expire, then it is readied and the - * period is restarted. If the owning thread is not waiting for the - * period to expire, then the period is placed in the EXPIRED - * state and not restarted. - * - * @param[in] id is the period id - */ -void _Rate_monotonic_Timeout( - rtems_id id, - void *ignored -); - -/** - * @brief _Rate_monotonic_Get_status( - * - * This routine is invoked to compute the elapsed wall time and cpu - * time for a period. - * - * @param[in] the_period points to the period being operated upon. - * @param[out] wall_since_last_period is set to the wall time elapsed - * since the period was initiated. - * @param[out] cpu_since_last_period is set to the cpu time used by the - * owning thread since the period was initiated. - * - * @retval This routine returns true if the status can be determined - * and false otherwise. - */ -bool _Rate_monotonic_Get_status( - Rate_monotonic_Control *the_period, - Rate_monotonic_Period_time_t *wall_since_last_period, - Thread_CPU_usage_t *cpu_since_last_period -); - -/** - * @brief Initiate Rate Monotonic Statistics - * - * This routine is invoked when a period is initiated via an explicit - * call to rtems_rate_monotonic_period for the period's first iteration - * or from _Rate_monotonic_Timeout for period iterations 2-n. - * - * @param[in] the_period points to the period being operated upon. - */ -void _Rate_monotonic_Initiate_statistics( - Rate_monotonic_Control *the_period -); - -/** - * @brief _Rate_monotonic_Reset_wall_time_statistics - * - * This method resets the statistics information for a period instance. - */ -#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ - #define _Rate_monotonic_Reset_wall_time_statistics( _the_period ) \ - do { \ - /* set the minimums to a large value */ \ - _Timestamp_Set( \ - &(_the_period)->Statistics.min_wall_time, \ - 0x7fffffff, \ - 0x7fffffff \ - ); \ - } while (0) -#else - #define _Rate_monotonic_Reset_wall_time_statistics( _the_period ) \ - do { \ - /* set the minimum to a large value */ \ - (_the_period)->Statistics.min_wall_time = 0xffffffff; \ - } while (0) -#endif - -/** - * @brief Rate_monotonic_Reset_cpu_use_statistics - * - * This helper method resets the period CPU usage statistics structure. - */ -#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ - #define _Rate_monotonic_Reset_cpu_use_statistics( _the_period ) \ - do { \ - /* set the minimums to a large value */ \ - _Timestamp_Set( \ - &(_the_period)->Statistics.min_cpu_time, \ - 0x7fffffff, \ - 0x7fffffff \ - ); \ - } while (0) -#else - #define _Rate_monotonic_Reset_cpu_use_statistics( _the_period ) \ - do { \ - /* set the minimum to a large value */ \ - (_the_period)->Statistics.min_cpu_time = 0xffffffff; \ - } while (0) -#endif - -/** - * @brief Rate_monotonic_Reset_statistics - * - * This helper method resets the period wall time statistics structure. - */ -#define _Rate_monotonic_Reset_statistics( _the_period ) \ - do { \ - memset( \ - &(_the_period)->Statistics, \ - 0, \ - sizeof( rtems_rate_monotonic_period_statistics ) \ - ); \ - _Rate_monotonic_Reset_cpu_use_statistics( _the_period ); \ - _Rate_monotonic_Reset_wall_time_statistics( _the_period ); \ - } while (0) - -#ifndef __RTEMS_APPLICATION__ -#include <rtems/rtems/ratemon.inl> -#endif +/**@}*/ #ifdef __cplusplus } #endif -/**@}*/ - #endif /* end of include file */ diff --git a/cpukit/rtems/include/rtems/rtems/ratemonimpl.h b/cpukit/rtems/include/rtems/rtems/ratemonimpl.h new file mode 100644 index 0000000000..584b45ef1e --- /dev/null +++ b/cpukit/rtems/include/rtems/rtems/ratemonimpl.h @@ -0,0 +1,279 @@ +/** + * @file + * + * @ingroup ClassicRateMonImpl + * + * @brief Classic Rate Monotonic Scheduler Implementation + */ + +/* COPYRIGHT (c) 1989-2008. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#ifndef _RTEMS_RTEMS_RATEMONIMPL_H +#define _RTEMS_RTEMS_RATEMONIMPL_H + +#include <rtems/rtems/ratemon.h> + +#include <string.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ClassicRateMonImpl Classic Rate Monotonic Scheduler Implementation + * + * @ingroup ClassicRateMon + * + * @{ + */ + +/** + * This constant is defined to extern most of the time when using + * this header file. However by defining it to nothing, the data + * declared in this header file can be instantiated. This is done + * in a single per manager file. + */ +#ifndef RTEMS_RATEMON_EXTERN +#define RTEMS_RATEMON_EXTERN extern +#endif + +/** + * @brief Rate Monotonic Period Class Management Structure + * + * This instance of Objects_Information is used to manage the + * set of rate monotonic period instances. + */ +RTEMS_RATEMON_EXTERN Objects_Information _Rate_monotonic_Information; + +/** + * @brief Rate Monotonic Manager Initialization + * + * This routine performs the initialization necessary for this manager. + * + * @note The Rate Monotonic Manager is built on top of the Watchdog Handler + */ +void _Rate_monotonic_Manager_initialization(void); + +/** + * @brief Allocates a period control block from + * the inactive chain of free period control blocks. + * + * This function allocates a period control block from + * the inactive chain of free period control blocks. + */ +RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Allocate( void ) +{ + return (Rate_monotonic_Control *) + _Objects_Allocate( &_Rate_monotonic_Information ); +} + +/** + * @brief Allocates a period control block from + * the inactive chain of free period control blocks. + * + * This routine allocates a period control block from + * the inactive chain of free period control blocks. + */ +RTEMS_INLINE_ROUTINE void _Rate_monotonic_Free ( + Rate_monotonic_Control *the_period +) +{ + _Objects_Free( &_Rate_monotonic_Information, &the_period->Object ); +} + +/** + * @brief Maps period IDs to period control blocks. + * + * 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. + */ +RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Get ( + Objects_Id id, + Objects_Locations *location +) +{ + return (Rate_monotonic_Control *) + _Objects_Get( &_Rate_monotonic_Information, id, location ); +} + +/** + * @brief Checks if the_period is in the ACTIVE state. + * + * This function returns TRUE if the_period is in the ACTIVE state, + * and FALSE otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Rate_monotonic_Is_active ( + Rate_monotonic_Control *the_period +) +{ + return (the_period->state == RATE_MONOTONIC_ACTIVE); +} + +/** + * @brief Checks if the_period is in the ACTIVE state. + * + * This function returns TRUE if the_period is in the ACTIVE state, + * and FALSE otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Rate_monotonic_Is_inactive ( + Rate_monotonic_Control *the_period +) +{ + return (the_period->state == RATE_MONOTONIC_INACTIVE); +} + +/** + * @brief Checks if the_period is in the EXPIRED state. + * + * This function returns TRUE if the_period is in the EXPIRED state, + * and FALSE otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Rate_monotonic_Is_expired ( + Rate_monotonic_Control *the_period +) +{ + return (the_period->state == RATE_MONOTONIC_EXPIRED); +} + +/** + * @brief Checks if the_period is NULL. + * + * This function returns TRUE if the_period is NULL and FALSE otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Rate_monotonic_Is_null ( + Rate_monotonic_Control *the_period +) +{ + return (the_period == NULL); +} + +/** + * @brief Rate Monotonic Timeout + * + * This routine is invoked when the period represented + * by ID expires. If the thread which owns this period is blocked + * waiting for the period to expire, then it is readied and the + * period is restarted. If the owning thread is not waiting for the + * period to expire, then the period is placed in the EXPIRED + * state and not restarted. + * + * @param[in] id is the period id + */ +void _Rate_monotonic_Timeout( + rtems_id id, + void *ignored +); + +/** + * @brief _Rate_monotonic_Get_status( + * + * This routine is invoked to compute the elapsed wall time and cpu + * time for a period. + * + * @param[in] the_period points to the period being operated upon. + * @param[out] wall_since_last_period is set to the wall time elapsed + * since the period was initiated. + * @param[out] cpu_since_last_period is set to the cpu time used by the + * owning thread since the period was initiated. + * + * @retval This routine returns true if the status can be determined + * and false otherwise. + */ +bool _Rate_monotonic_Get_status( + Rate_monotonic_Control *the_period, + Rate_monotonic_Period_time_t *wall_since_last_period, + Thread_CPU_usage_t *cpu_since_last_period +); + +/** + * @brief Initiate Rate Monotonic Statistics + * + * This routine is invoked when a period is initiated via an explicit + * call to rtems_rate_monotonic_period for the period's first iteration + * or from _Rate_monotonic_Timeout for period iterations 2-n. + * + * @param[in] the_period points to the period being operated upon. + */ +void _Rate_monotonic_Initiate_statistics( + Rate_monotonic_Control *the_period +); + +/** + * @brief _Rate_monotonic_Reset_wall_time_statistics + * + * This method resets the statistics information for a period instance. + */ +#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ + #define _Rate_monotonic_Reset_wall_time_statistics( _the_period ) \ + do { \ + /* set the minimums to a large value */ \ + _Timestamp_Set( \ + &(_the_period)->Statistics.min_wall_time, \ + 0x7fffffff, \ + 0x7fffffff \ + ); \ + } while (0) +#else + #define _Rate_monotonic_Reset_wall_time_statistics( _the_period ) \ + do { \ + /* set the minimum to a large value */ \ + (_the_period)->Statistics.min_wall_time = 0xffffffff; \ + } while (0) +#endif + +/** + * @brief Rate_monotonic_Reset_cpu_use_statistics + * + * This helper method resets the period CPU usage statistics structure. + */ +#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ + #define _Rate_monotonic_Reset_cpu_use_statistics( _the_period ) \ + do { \ + /* set the minimums to a large value */ \ + _Timestamp_Set( \ + &(_the_period)->Statistics.min_cpu_time, \ + 0x7fffffff, \ + 0x7fffffff \ + ); \ + } while (0) +#else + #define _Rate_monotonic_Reset_cpu_use_statistics( _the_period ) \ + do { \ + /* set the minimum to a large value */ \ + (_the_period)->Statistics.min_cpu_time = 0xffffffff; \ + } while (0) +#endif + +/** + * @brief Rate_monotonic_Reset_statistics + * + * This helper method resets the period wall time statistics structure. + */ +#define _Rate_monotonic_Reset_statistics( _the_period ) \ + do { \ + memset( \ + &(_the_period)->Statistics, \ + 0, \ + sizeof( rtems_rate_monotonic_period_statistics ) \ + ); \ + _Rate_monotonic_Reset_cpu_use_statistics( _the_period ); \ + _Rate_monotonic_Reset_wall_time_statistics( _the_period ); \ + } while (0) + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ |