/** * @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.org/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 Watchdog initializer for static initialization. * * @see _Watchdog_Initialize(). */ #define WATCHDOG_INITIALIZER( routine, id, user_data ) \ { \ { NULL, NULL }, \ WATCHDOG_INACTIVE, \ 0, 0, 0, 0, \ ( routine ), ( id ), ( user_data ) \ } /** * @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 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 ); /** * 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 */