summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-07-22 10:21:03 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-07-22 16:57:25 +0200
commit4b48ece07d4aef3d43cf1865944f0cd1ca4a7b6c (patch)
treebb37e9f3b6b76d31db394cac5e036900d5cc0cc7 /cpukit/score/include
parentscore: Create chain implementation header (diff)
downloadrtems-4b48ece07d4aef3d43cf1865944f0cd1ca4a7b6c.tar.bz2
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.
Diffstat (limited to 'cpukit/score/include')
-rw-r--r--cpukit/score/include/rtems/score/watchdog.h243
-rw-r--r--cpukit/score/include/rtems/score/watchdogimpl.h476
2 files changed, 492 insertions, 227 deletions
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 <rtems/score/object.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/**
* @defgroup ScoreWatchdog Watchdog Handler
*
@@ -33,20 +39,6 @@
*/
/**@{*/
-#include <rtems/score/object.h>
-
-#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.
*
@@ -55,15 +47,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.
*
* This type defines the return type from a Watchdog Service Routine.
@@ -81,6 +64,15 @@ typedef Watchdog_Service_routine ( *Watchdog_Service_routine_entry )(
);
/**
+ * @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.
*
* This is the constant for indefinite wait. It is actually an
@@ -111,22 +103,6 @@ typedef enum {
} 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.
*
* The following record defines the control block used
@@ -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 <rtems/score/watchdog.inl>
-#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 <rtems/score/watchdog.h>
+#include <rtems/score/chainimpl.h>
+
+#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 */