From e90b1dfdda68f467c66445502afc092ec687b520 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 23 Jul 2013 13:51:08 +0200 Subject: rtems: Create timer implementation header Move implementation specific parts of timer.h and timer.inl into new header file timerimpl.h. The timer.h contains now only the application visible API. --- cpukit/rtems/include/rtems/rtems/timer.h | 118 +------------ cpukit/rtems/include/rtems/rtems/timerimpl.h | 239 +++++++++++++++++++++++++++ 2 files changed, 242 insertions(+), 115 deletions(-) create mode 100644 cpukit/rtems/include/rtems/rtems/timerimpl.h (limited to 'cpukit/rtems/include/rtems/rtems') diff --git a/cpukit/rtems/include/rtems/rtems/timer.h b/cpukit/rtems/include/rtems/rtems/timer.h index f27f958d9a..a8ebb7f2a4 100644 --- a/cpukit/rtems/include/rtems/rtems/timer.h +++ b/cpukit/rtems/include/rtems/rtems/timer.h @@ -41,29 +41,13 @@ #ifndef _RTEMS_RTEMS_TIMER_H #define _RTEMS_RTEMS_TIMER_H -/** - * @brief Instantiate RTEMS Timer Data - * - * 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_TIMER_EXTERN -#define RTEMS_TIMER_EXTERN extern -#endif +#include +#include #ifdef __cplusplus extern "C" { #endif -#include -#include -#include -#include -#include -#include - /** * @defgroup ClassicTimer Timers * @@ -141,98 +125,6 @@ typedef struct { Timer_Classes the_class; } Timer_Control; -typedef struct Timer_server_Control Timer_server_Control; - -/** - * @brief Method used to schedule the insertion of task based timers. - */ -typedef void (*Timer_server_Schedule_operation)( - Timer_server_Control *timer_server, - Timer_Control *timer -); - -typedef struct { - /** - * @brief This watchdog that will be registered in the system tick mechanic - * for timer server wake-up. - */ - Watchdog_Control System_watchdog; - - /** - * @brief Chain for watchdogs which will be triggered by the timer server. - */ - Chain_Control Chain; - - /** - * @brief Last known time snapshot of the timer server. - * - * The units may be ticks or seconds. - */ - Watchdog_Interval volatile last_snapshot; -} Timer_server_Watchdogs; - -struct Timer_server_Control { - /** - * @brief Timer server thread. - */ - Thread_Control *thread; - - /** - * @brief The schedule operation method of the timer server. - */ - Timer_server_Schedule_operation schedule_operation; - - /** - * @brief Interval watchdogs triggered by the timer server. - */ - Timer_server_Watchdogs Interval_watchdogs; - - /** - * @brief TOD watchdogs triggered by the timer server. - */ - Timer_server_Watchdogs TOD_watchdogs; - - /** - * @brief Chain of timers scheduled for insert. - * - * This pointer is not @c NULL whenever the interval and TOD chains are - * processed. After the processing this list will be checked and if - * necessary the processing will be restarted. Processing of these chains - * can be only interrupted through interrupts. - */ - Chain_Control *volatile insert_chain; - - /** - * @brief Indicates that the timer server is active or not. - * - * The server is active after the delay on a system watchdog. The activity - * period of the server ends when no more watchdogs managed by the server - * fire. The system watchdogs must not be manipulated when the server is - * active. - */ - bool volatile active; -}; - -/** - * @brief Pointer to default timer server control block. - * - * This value is @c NULL when the default timer server is not initialized. - */ -RTEMS_TIMER_EXTERN Timer_server_Control *volatile _Timer_server; - -/** - * The following defines the information control block used to manage - * this class of objects. - */ -RTEMS_TIMER_EXTERN Objects_Information _Timer_Information; - -/** - * @brief Timer Manager Initialization - * - * This routine performs the initialization necessary for this manager. - */ -void _Timer_Manager_initialization(void); - /** * @brief RTEMS Create Timer * @@ -454,15 +346,11 @@ rtems_status_code rtems_timer_get_information( rtems_timer_information *the_info ); -#ifndef __RTEMS_APPLICATION__ -#include -#endif +/**@}*/ #ifdef __cplusplus } #endif -/**@}*/ - #endif /* end of include file */ diff --git a/cpukit/rtems/include/rtems/rtems/timerimpl.h b/cpukit/rtems/include/rtems/rtems/timerimpl.h new file mode 100644 index 0000000000..c22658d99b --- /dev/null +++ b/cpukit/rtems/include/rtems/rtems/timerimpl.h @@ -0,0 +1,239 @@ +/** + * @file + * + * @ingroup ClassicTimerImpl + * + * @brief Classic Timer Implementation + */ + +/* + * COPYRIGHT (c) 1989-2011. + * 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_TIMER_INL +#define _RTEMS_RTEMS_TIMER_INL + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ClassicTimerImpl Classic Timer Implementation + * + * @ingroup ClassicTimer + * + * @{ + */ + +/** + * @brief Instantiate RTEMS Timer Data + * + * 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_TIMER_EXTERN +#define RTEMS_TIMER_EXTERN extern +#endif + +typedef struct Timer_server_Control Timer_server_Control; + +/** + * @brief Method used to schedule the insertion of task based timers. + */ +typedef void (*Timer_server_Schedule_operation)( + Timer_server_Control *timer_server, + Timer_Control *timer +); + +typedef struct { + /** + * @brief This watchdog that will be registered in the system tick mechanic + * for timer server wake-up. + */ + Watchdog_Control System_watchdog; + + /** + * @brief Chain for watchdogs which will be triggered by the timer server. + */ + Chain_Control Chain; + + /** + * @brief Last known time snapshot of the timer server. + * + * The units may be ticks or seconds. + */ + Watchdog_Interval volatile last_snapshot; +} Timer_server_Watchdogs; + +struct Timer_server_Control { + /** + * @brief Timer server thread. + */ + Thread_Control *thread; + + /** + * @brief The schedule operation method of the timer server. + */ + Timer_server_Schedule_operation schedule_operation; + + /** + * @brief Interval watchdogs triggered by the timer server. + */ + Timer_server_Watchdogs Interval_watchdogs; + + /** + * @brief TOD watchdogs triggered by the timer server. + */ + Timer_server_Watchdogs TOD_watchdogs; + + /** + * @brief Chain of timers scheduled for insert. + * + * This pointer is not @c NULL whenever the interval and TOD chains are + * processed. After the processing this list will be checked and if + * necessary the processing will be restarted. Processing of these chains + * can be only interrupted through interrupts. + */ + Chain_Control *volatile insert_chain; + + /** + * @brief Indicates that the timer server is active or not. + * + * The server is active after the delay on a system watchdog. The activity + * period of the server ends when no more watchdogs managed by the server + * fire. The system watchdogs must not be manipulated when the server is + * active. + */ + bool volatile active; +}; + +/** + * @brief Pointer to default timer server control block. + * + * This value is @c NULL when the default timer server is not initialized. + */ +RTEMS_TIMER_EXTERN Timer_server_Control *volatile _Timer_server; + +/** + * The following defines the information control block used to manage + * this class of objects. + */ +RTEMS_TIMER_EXTERN Objects_Information _Timer_Information; + +/** + * @brief Timer Manager Initialization + * + * This routine performs the initialization necessary for this manager. + */ +void _Timer_Manager_initialization(void); + +/** + * @brief Timer_Allocate + * + * This function allocates a timer control block from + * the inactive chain of free timer control blocks. + */ +RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Allocate( void ) +{ + return (Timer_Control *) _Objects_Allocate( &_Timer_Information ); +} + +/** + * @brief Timer_Free + * + * This routine frees a timer control block to the + * inactive chain of free timer control blocks. + */ +RTEMS_INLINE_ROUTINE void _Timer_Free ( + Timer_Control *the_timer +) +{ + _Objects_Free( &_Timer_Information, &the_timer->Object ); +} + +/** + * @brief Timer_Get + * + * This function maps timer IDs to timer control blocks. + * If ID corresponds to a local timer, then it returns + * the timer control pointer which maps to ID and location + * is set to OBJECTS_LOCAL. Otherwise, location is set + * to OBJECTS_ERROR and the returned value is undefined. + */ +RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get ( + Objects_Id id, + Objects_Locations *location +) +{ + return (Timer_Control *) + _Objects_Get( &_Timer_Information, id, location ); +} + +/** + * @brief Timer_Is_interval_class + * + * This function returns TRUE if the class is that of an INTERVAL + * timer, and FALSE otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Timer_Is_interval_class ( + Timer_Classes the_class +) +{ + return (the_class == TIMER_INTERVAL) || (the_class == TIMER_INTERVAL_ON_TASK); +} + +/** + * @brief Timer_Is_time_of_day_class + * + * This function returns TRUE if the class is that of an INTERVAL + * timer, and FALSE otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Timer_Is_timer_of_day_class ( + Timer_Classes the_class +) +{ + return ( the_class == TIMER_TIME_OF_DAY ); +} + +/** + * @brief Timer_Is_dormant_class + * + * This function returns TRUE if the class is that of a DORMANT + * timer, and FALSE otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Timer_Is_dormant_class ( + Timer_Classes the_class +) +{ + return ( the_class == TIMER_DORMANT ); +} + +/** + * @brief Timer_Is_null + * + * This function returns TRUE if the_timer is NULL and FALSE otherwise. + */ +RTEMS_INLINE_ROUTINE bool _Timer_Is_null ( + Timer_Control *the_timer +) +{ + return ( the_timer == NULL ); +} + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ -- cgit v1.2.3