From 4b48ece07d4aef3d43cf1865944f0cd1ca4a7b6c Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 22 Jul 2013 10:21:03 +0200 Subject: score: Create watchdog implementation header Move implementation specific parts of watchdog.h and watchdog.inl into new header file watchdogimpl.h. The watchdog.h contains now only the application visible API. --- cpukit/score/include/rtems/score/watchdog.h | 243 +----------- cpukit/score/include/rtems/score/watchdogimpl.h | 476 ++++++++++++++++++++++++ 2 files changed, 492 insertions(+), 227 deletions(-) create mode 100644 cpukit/score/include/rtems/score/watchdogimpl.h (limited to 'cpukit/score/include') diff --git a/cpukit/score/include/rtems/score/watchdog.h b/cpukit/score/include/rtems/score/watchdog.h index 6dd0b5d0ce..b67e5ca28c 100644 --- a/cpukit/score/include/rtems/score/watchdog.h +++ b/cpukit/score/include/rtems/score/watchdog.h @@ -20,6 +20,12 @@ #ifndef _RTEMS_SCORE_WATCHDOG_H #define _RTEMS_SCORE_WATCHDOG_H +#include + +#ifdef __cplusplus +extern "C" { +#endif + /** * @defgroup ScoreWatchdog Watchdog Handler * @@ -33,20 +39,6 @@ */ /**@{*/ -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Control block used to manage intervals. - * - * The following type defines the control block used to manage - * intervals. - */ -#define WATCHDOG_MAXIMUM_INTERVAL ((Watchdog_Interval) 0xffffffff) - /** * @brief Type is used to specify the length of intervals. * @@ -54,15 +46,6 @@ extern "C" { */ typedef uint32_t Watchdog_Interval; -/** - * @brief Pointer to the BSP plugin to obtain the number - * of nanoseconds since the last clock tick. - * - * This type defines a pointer to the BSP plugin to obtain the number - * of nanoseconds since the last clock tick. - */ -typedef uint32_t (*Watchdog_Nanoseconds_since_last_tick_routine)(void); - /** * @brief Return type from a Watchdog Service Routine. * @@ -80,6 +63,15 @@ typedef Watchdog_Service_routine ( *Watchdog_Service_routine_entry )( void * ); +/** + * @brief Pointer to the BSP plugin to obtain the number + * of nanoseconds since the last clock tick. + * + * This type defines a pointer to the BSP plugin to obtain the number + * of nanoseconds since the last clock tick. + */ +typedef uint32_t (*Watchdog_Nanoseconds_since_last_tick_routine)(void); + /** * @brief The constant for indefinite wait. * @@ -110,22 +102,6 @@ typedef enum { WATCHDOG_REMOVE_IT } Watchdog_States; -/** - * @brief the manner in which a watchdog chain may - * be adjusted by the @ref _Watchdog_Adjust routine. - * - * The following enumerated type details the manner in which - * a watchdog chain may be adjusted by the @ref _Watchdog_Adjust - * routine. The direction indicates a movement FORWARD - * or BACKWARD in time. - */ -typedef enum { - /** adjust delta value forward */ - WATCHDOG_FORWARD, - /** adjust delta value backward */ - WATCHDOG_BACKWARD -} Watchdog_Adjust_directions; - /** * @brief The control block used to manage each watchdog timer. * @@ -157,198 +133,11 @@ typedef struct { void *user_data; } Watchdog_Control; -/** - * @brief Watchdog synchronization level. - * - * This used for synchronization purposes - * during an insert on a watchdog delta chain. - */ -SCORE_EXTERN volatile uint32_t _Watchdog_Sync_level; - -/** - * @brief Watchdog synchronization count. - * - * This used for synchronization purposes - * during an insert on a watchdog delta chain. - */ -SCORE_EXTERN volatile uint32_t _Watchdog_Sync_count; - -/** - * @brief The number of ticks since the system was booted. - * - * This contains the number of ticks since the system was booted. - */ - -SCORE_EXTERN volatile Watchdog_Interval _Watchdog_Ticks_since_boot; - -/** - * @brief The number of nanoseconds since the last clock tick. - * - * This is a pointer to the optional BSP plugin to obtain the number - * of nanoseconds since the last clock tick. - */ -extern Watchdog_Nanoseconds_since_last_tick_routine - _Watchdog_Nanoseconds_since_tick_handler; - -/** - * @brief Watchdog chain which is managed at ticks. - * - * This is the watchdog chain which is managed at ticks. - */ -SCORE_EXTERN Chain_Control _Watchdog_Ticks_chain; - -/** - * @brief Watchdog chain which is managed at second boundaries. - * - * This is the watchdog chain which is managed at second boundaries. - */ -SCORE_EXTERN Chain_Control _Watchdog_Seconds_chain; - -/** - * @brief Initialize the watchdog handler. - * - * This routine initializes the watchdog handler. The watchdog - * synchronization flag is initialized and the watchdog chains are - * initialized and emptied. - */ -void _Watchdog_Handler_initialization( void ); - -/** - * @brief Removes @a the_watchdog from the watchdog chain. - * - * This routine removes @a the_watchdog from the watchdog chain on which - * it resides and returns the state @a the_watchdog timer was in. - * - * @param[in] the_watchdog will be removed - * @retval the state in which @a the_watchdog was in when removed - */ -Watchdog_States _Watchdog_Remove ( - Watchdog_Control *the_watchdog -); - -/** - * @brief Adjusts the @a header watchdog chain in the forward - * or backward @a direction for @a units ticks. - * - * This routine adjusts the @a header watchdog chain in the forward - * or backward @a direction for @a units ticks. - * - * @param[in] header is the watchdog chain to adjust - * @param[in] direction is the direction to adjust @a header - * @param[in] units is the number of units to adjust @a header - */ -void _Watchdog_Adjust ( - Chain_Control *header, - Watchdog_Adjust_directions direction, - Watchdog_Interval units -); - -/** - * @brief Adjusts the @a header watchdog chain in the forward - * @a direction for @a units_arg ticks. - * - * This routine adjusts the @a header watchdog chain in the forward - * @a direction for @a units_arg ticks. - * - * @param[in] header is the watchdog chain to adjust - * @param[in] units_arg is the number of units to adjust @a header - * @param[in] to_fire is a pointer to an initialized Chain_Control to which - * all watchdog instances that are to be fired will be placed. - * - * @note This always adjusts forward. - */ -void _Watchdog_Adjust_to_chain( - Chain_Control *header, - Watchdog_Interval units_arg, - Chain_Control *to_fire - -); - -/** - * @brief Inserts @a the_watchdog into the @a header watchdog chain - * for a time of @a units. - * - * This routine inserts @a the_watchdog into the @a header watchdog chain - * for a time of @a units. - * Update the delta interval counters. - * - * @param[in] header is @a the_watchdog list to insert @a the_watchdog on - * @param[in] the_watchdog is the watchdog to insert - */ -void _Watchdog_Insert ( - Chain_Control *header, - Watchdog_Control *the_watchdog -); - -/** - * @brief This routine is invoked at appropriate intervals to update - * the @a header watchdog chain. - * - * This routine is invoked at appropriate intervals to update - * the @a header watchdog chain. - * This routine decrements the delta counter in response to a tick. - * - * @param[in] header is the watchdog chain to tickle - */ -void _Watchdog_Tickle ( - Chain_Control *header -); - -/** - * @brief Report information on a single watchdog instance. - * - * This method prints a one line report on the watchdog instance - * provided. The @a name may be used to identify the watchdog and - * a space will be printed after @a name if it is not NULL. - * - * @param[in] name is a string to prefix the line with. If NULL, - * nothing is printed. - * @param[in] watch is the watchdog instance to be printed. - * - * @note This is a debug routine. It uses printk() and prudence should - * exercised when using it. - */ -void _Watchdog_Report( - const char *name, - Watchdog_Control *watch -); - -/** - * @brief Report information on a watchdog chain. - * - * This method prints report on the watchdog chain provided. - * The @a name may be used to identify the watchdog chain and - * a space will be printed after @a name if it is not NULL. - * - * @param[in] name is a string to prefix the line with. If NULL, - * nothing is printed. - * @param[in] header is the watchdog chain to be printed. - * - * @note This is a debug routine. It uses printk() and prudence should - * exercised when using it. It also disables interrupts so the - * chain can be traversed in a single atomic pass. - */ -void _Watchdog_Report_chain( - const char *name, - Chain_Control *header -); - -/** - * @brief Handler for default nanoseconds since last tick. - * - * @retval 0 Always. - */ -uint32_t _Watchdog_Nanoseconds_since_tick_default_handler( void ); - -#ifndef __RTEMS_APPLICATION__ -#include -#endif +/**@}*/ #ifdef __cplusplus } #endif -/**@}*/ - #endif /* end of include file */ diff --git a/cpukit/score/include/rtems/score/watchdogimpl.h b/cpukit/score/include/rtems/score/watchdogimpl.h new file mode 100644 index 0000000000..e0324ff257 --- /dev/null +++ b/cpukit/score/include/rtems/score/watchdogimpl.h @@ -0,0 +1,476 @@ +/** + * @file + * + * @brief Inlined Routines in the Watchdog Handler + * + * This file contains the static inline implementation of all inlined + * routines in the Watchdog Handler. + */ + +/* + * COPYRIGHT (c) 1989-2004. + * 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_SCORE_WATCHDOGIMPL_H +#define _RTEMS_SCORE_WATCHDOGIMPL_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup ScoreWatchdog + * @{ + */ + +/** + * @brief Control block used to manage intervals. + * + * The following type defines the control block used to manage + * intervals. + */ +#define WATCHDOG_MAXIMUM_INTERVAL ((Watchdog_Interval) 0xffffffff) + +/** + * @brief the manner in which a watchdog chain may + * be adjusted by the @ref _Watchdog_Adjust routine. + * + * The following enumerated type details the manner in which + * a watchdog chain may be adjusted by the @ref _Watchdog_Adjust + * routine. The direction indicates a movement FORWARD + * or BACKWARD in time. + */ +typedef enum { + /** adjust delta value forward */ + WATCHDOG_FORWARD, + /** adjust delta value backward */ + WATCHDOG_BACKWARD +} Watchdog_Adjust_directions; + +/** + * @brief Watchdog synchronization level. + * + * This used for synchronization purposes + * during an insert on a watchdog delta chain. + */ +SCORE_EXTERN volatile uint32_t _Watchdog_Sync_level; + +/** + * @brief Watchdog synchronization count. + * + * This used for synchronization purposes + * during an insert on a watchdog delta chain. + */ +SCORE_EXTERN volatile uint32_t _Watchdog_Sync_count; + +/** + * @brief The number of ticks since the system was booted. + * + * This contains the number of ticks since the system was booted. + */ + +SCORE_EXTERN volatile Watchdog_Interval _Watchdog_Ticks_since_boot; + +/** + * @brief The number of nanoseconds since the last clock tick. + * + * This is a pointer to the optional BSP plugin to obtain the number + * of nanoseconds since the last clock tick. + */ +extern Watchdog_Nanoseconds_since_last_tick_routine + _Watchdog_Nanoseconds_since_tick_handler; + +/** + * @brief Watchdog chain which is managed at ticks. + * + * This is the watchdog chain which is managed at ticks. + */ +SCORE_EXTERN Chain_Control _Watchdog_Ticks_chain; + +/** + * @brief Watchdog chain which is managed at second boundaries. + * + * This is the watchdog chain which is managed at second boundaries. + */ +SCORE_EXTERN Chain_Control _Watchdog_Seconds_chain; + +/** + * @brief Initialize the watchdog handler. + * + * This routine initializes the watchdog handler. The watchdog + * synchronization flag is initialized and the watchdog chains are + * initialized and emptied. + */ +void _Watchdog_Handler_initialization( void ); + +/** + * @brief Removes @a the_watchdog from the watchdog chain. + * + * This routine removes @a the_watchdog from the watchdog chain on which + * it resides and returns the state @a the_watchdog timer was in. + * + * @param[in] the_watchdog will be removed + * @retval the state in which @a the_watchdog was in when removed + */ +Watchdog_States _Watchdog_Remove ( + Watchdog_Control *the_watchdog +); + +/** + * @brief Adjusts the @a header watchdog chain in the forward + * or backward @a direction for @a units ticks. + * + * This routine adjusts the @a header watchdog chain in the forward + * or backward @a direction for @a units ticks. + * + * @param[in] header is the watchdog chain to adjust + * @param[in] direction is the direction to adjust @a header + * @param[in] units is the number of units to adjust @a header + */ +void _Watchdog_Adjust ( + Chain_Control *header, + Watchdog_Adjust_directions direction, + Watchdog_Interval units +); + +/** + * @brief Adjusts the @a header watchdog chain in the forward + * @a direction for @a units_arg ticks. + * + * This routine adjusts the @a header watchdog chain in the forward + * @a direction for @a units_arg ticks. + * + * @param[in] header is the watchdog chain to adjust + * @param[in] units_arg is the number of units to adjust @a header + * @param[in] to_fire is a pointer to an initialized Chain_Control to which + * all watchdog instances that are to be fired will be placed. + * + * @note This always adjusts forward. + */ +void _Watchdog_Adjust_to_chain( + Chain_Control *header, + Watchdog_Interval units_arg, + Chain_Control *to_fire + +); + +/** + * @brief Inserts @a the_watchdog into the @a header watchdog chain + * for a time of @a units. + * + * This routine inserts @a the_watchdog into the @a header watchdog chain + * for a time of @a units. + * Update the delta interval counters. + * + * @param[in] header is @a the_watchdog list to insert @a the_watchdog on + * @param[in] the_watchdog is the watchdog to insert + */ +void _Watchdog_Insert ( + Chain_Control *header, + Watchdog_Control *the_watchdog +); + +/** + * @brief This routine is invoked at appropriate intervals to update + * the @a header watchdog chain. + * + * This routine is invoked at appropriate intervals to update + * the @a header watchdog chain. + * This routine decrements the delta counter in response to a tick. + * + * @param[in] header is the watchdog chain to tickle + */ +void _Watchdog_Tickle ( + Chain_Control *header +); + +/** + * @brief Report information on a single watchdog instance. + * + * This method prints a one line report on the watchdog instance + * provided. The @a name may be used to identify the watchdog and + * a space will be printed after @a name if it is not NULL. + * + * @param[in] name is a string to prefix the line with. If NULL, + * nothing is printed. + * @param[in] watch is the watchdog instance to be printed. + * + * @note This is a debug routine. It uses printk() and prudence should + * exercised when using it. + */ +void _Watchdog_Report( + const char *name, + Watchdog_Control *watch +); + +/** + * @brief Report information on a watchdog chain. + * + * This method prints report on the watchdog chain provided. + * The @a name may be used to identify the watchdog chain and + * a space will be printed after @a name if it is not NULL. + * + * @param[in] name is a string to prefix the line with. If NULL, + * nothing is printed. + * @param[in] header is the watchdog chain to be printed. + * + * @note This is a debug routine. It uses printk() and prudence should + * exercised when using it. It also disables interrupts so the + * chain can be traversed in a single atomic pass. + */ +void _Watchdog_Report_chain( + const char *name, + Chain_Control *header +); + +/** + * @brief Handler for default nanoseconds since last tick. + * + * @retval 0 Always. + */ +uint32_t _Watchdog_Nanoseconds_since_tick_default_handler( void ); + +/** + * This routine initializes the specified watchdog. The watchdog is + * made inactive, the watchdog id and handler routine are set to the + * specified values. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Initialize( + Watchdog_Control *the_watchdog, + Watchdog_Service_routine_entry routine, + Objects_Id id, + void *user_data +) +{ + the_watchdog->state = WATCHDOG_INACTIVE; + the_watchdog->routine = routine; + the_watchdog->id = id; + the_watchdog->user_data = user_data; +} + +/** + * This routine returns true if the watchdog timer is in the ACTIVE + * state, and false otherwise. + */ + +RTEMS_INLINE_ROUTINE bool _Watchdog_Is_active( + Watchdog_Control *the_watchdog +) +{ + + return ( the_watchdog->state == WATCHDOG_ACTIVE ); + +} + +/** + * This routine activates THE_WATCHDOG timer which is already + * on a watchdog chain. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Activate( + Watchdog_Control *the_watchdog +) +{ + + the_watchdog->state = WATCHDOG_ACTIVE; + +} + +/** + * This routine deactivates THE_WATCHDOG timer which will remain + * on a watchdog chain. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( + Watchdog_Control *the_watchdog +) +{ + + the_watchdog->state = WATCHDOG_REMOVE_IT; + +} + +/** + * This routine is invoked at each clock tick to update the ticks + * watchdog chain. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_ticks( void ) +{ + + _Watchdog_Tickle( &_Watchdog_Ticks_chain ); + +} + +/** + * This routine is invoked at each clock tick to update the seconds + * watchdog chain. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_seconds( void ) +{ + + _Watchdog_Tickle( &_Watchdog_Seconds_chain ); + +} + +/** + * This routine inserts THE_WATCHDOG into the ticks watchdog chain + * for a time of UNITS ticks. The INSERT_MODE indicates whether + * THE_WATCHDOG is to be activated automatically or later, explicitly + * by the caller. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Insert_ticks( + Watchdog_Control *the_watchdog, + Watchdog_Interval units +) +{ + + the_watchdog->initial = units; + + _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); + +} + +/** + * This routine inserts THE_WATCHDOG into the seconds watchdog chain + * for a time of UNITS seconds. The INSERT_MODE indicates whether + * THE_WATCHDOG is to be activated automatically or later, explicitly + * by the caller. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Insert_seconds( + Watchdog_Control *the_watchdog, + Watchdog_Interval units +) +{ + + the_watchdog->initial = units; + + _Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog ); + +} + +/** + * This routine adjusts the seconds watchdog chain in the forward + * or backward DIRECTION for UNITS seconds. This is invoked when the + * current time of day is changed. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_seconds( + Watchdog_Adjust_directions direction, + Watchdog_Interval units +) +{ + + _Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units ); + +} + +/** + * This routine adjusts the ticks watchdog chain in the forward + * or backward DIRECTION for UNITS ticks. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_ticks( + Watchdog_Adjust_directions direction, + Watchdog_Interval units +) +{ + + _Watchdog_Adjust( &_Watchdog_Ticks_chain, direction, units ); + +} + +/** + * This routine resets THE_WATCHDOG timer to its state at INSERT + * time. This routine is valid only on interval watchdog timers + * and is used to make an interval watchdog timer fire "every" so + * many ticks. + */ + +RTEMS_INLINE_ROUTINE void _Watchdog_Reset( + Watchdog_Control *the_watchdog +) +{ + + (void) _Watchdog_Remove( the_watchdog ); + + _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); + +} + +/** + * This routine returns a pointer to the watchdog timer following + * THE_WATCHDOG on the watchdog chain. + */ + +RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Next( + Watchdog_Control *the_watchdog +) +{ + + return ( (Watchdog_Control *) the_watchdog->Node.next ); + +} + +/** + * This routine returns a pointer to the watchdog timer preceding + * THE_WATCHDOG on the watchdog chain. + */ + +RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Previous( + Watchdog_Control *the_watchdog +) +{ + + return ( (Watchdog_Control *) the_watchdog->Node.previous ); + +} + +/** + * This routine returns a pointer to the first watchdog timer + * on the watchdog chain HEADER. + */ + +RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First( + Chain_Control *header +) +{ + + return ( (Watchdog_Control *) _Chain_First( header ) ); + +} + +/** + * This routine returns a pointer to the last watchdog timer + * on the watchdog chain HEADER. + */ + +RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Last( + Chain_Control *header +) +{ + + return ( (Watchdog_Control *) _Chain_Last( header ) ); + +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ -- cgit v1.2.3