RTEMS: Watchdog Handler

| RTEMS 5.4-rc2

Loading...
Searching...
No Matches
Files | Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
Watchdog Handler
Internal » SuperCore

Watchdog Handler. More...

## Files
file | watchdog.h
| Constants and Structures Associated with Watchdog Timers.
file | watchdogimpl.h
| Inlined Routines in the Watchdog Handler.
file | watchdogticks.h
| Constants for the watchdog ticks.
file | watchdoginsert.c
| Watchdog Insert.
file | watchdogremove.c
| Remove Watchdog.
file | watchdogtickssinceboot.c
| Watchdog Ticks Since Boot.

## Data Structures
struct | Watchdog_Header
| The watchdog header to manage scheduled watchdogs. More...
struct | Watchdog_Control
| The control block used to manage each watchdog timer. More...

## Macros
#define | WATCHDOG_INITIALIZER(routine)
| Watchdog initializer for static initialization.
#define | _Watchdog_Tickle(header, first, now, lock, lock_context) _Watchdog_Do_tickle( header, first, now, lock_context )
#define | WATCHDOG_MAXIMUM_TICKS UINT64_MAX
| The maximum watchdog ticks value for the far future.
#define | WATCHDOG_NANOSECONDS_PER_SECOND 1000000000
#define | WATCHDOG_BITS_FOR_1E9_NANOSECONDS 30
| The bits necessary to store 1000000000 (= WATCHDOG_NANOSECONDS_PER_SECOND) nanoseconds.
#define | WATCHDOG_MAX_SECONDS 0x3ffffffff
| The maximum number of seconds representable in the nanoseconds watchdog format.
#define | WATCHDOG_NO_TIMEOUT 0
| Special watchdog ticks value to indicate an infinite wait.
#define | WATCHDOG_TICKS_PER_TIMESLICE_DEFAULT 50
| Default value for the watchdog ticks per timeslice.

## Typedefs
typedef struct Watchdog_Control | Watchdog_Control
typedef void | Watchdog_Service_routine
| Return type from a Watchdog Service Routine.
typedef Watchdog_Service_routine(* | Watchdog_Service_routine_entry) (Watchdog_Control *)
| Pointer to a watchdog service routine.
typedef uint32_t | Watchdog_Interval
| Type is used to specify the length of intervals.

## Enumerations
enum | Watchdog_State { WATCHDOG_SCHEDULED_BLACK , WATCHDOG_SCHEDULED_RED , WATCHDOG_INACTIVE , WATCHDOG_PENDING }
| Watchdog states. More...

## Functions
RTEMS_INLINE_ROUTINE void | _Watchdog_Header_initialize (Watchdog_Header *header)
| Initializes the watchdog header.
RTEMS_INLINE_ROUTINE Watchdog_Control * | _Watchdog_Header_first (const Watchdog_Header *header)
| Returns the first of the watchdog header.
RTEMS_INLINE_ROUTINE void | _Watchdog_Header_destroy (Watchdog_Header *header)
| Destroys the watchdog header.
void | _Watchdog_Tick (struct Per_CPU_Control *cpu)
| Performs a watchdog tick.
RTEMS_INLINE_ROUTINE Watchdog_State | _Watchdog_Get_state (const Watchdog_Control *the_watchdog)
| Gets the state of the watchdog.
RTEMS_INLINE_ROUTINE void | _Watchdog_Set_state (Watchdog_Control *the_watchdog, Watchdog_State state)
| Sets the state of the watchdog.
RTEMS_INLINE_ROUTINE Per_CPU_Control * | _Watchdog_Get_CPU (const Watchdog_Control *the_watchdog)
| Gets the watchdog's cpu.
RTEMS_INLINE_ROUTINE void | _Watchdog_Set_CPU (Watchdog_Control *the_watchdog, Per_CPU_Control *cpu)
| Sets the cpu for the watchdog.
RTEMS_INLINE_ROUTINE void | _Watchdog_Preinitialize (Watchdog_Control *the_watchdog, Per_CPU_Control *cpu)
| Pre-initializes a watchdog.
RTEMS_INLINE_ROUTINE void | _Watchdog_Initialize (Watchdog_Control *the_watchdog, Watchdog_Service_routine_entry routine)
| Initializes a watchdog with a new service routine.
void | _Watchdog_Do_tickle (Watchdog_Header *header, Watchdog_Control *first, uint64_t now, ISR_lock_Context *lock_context)
| Calls the routine of each not expired watchdog control node.
void | _Watchdog_Insert (Watchdog_Header *header, Watchdog_Control *the_watchdog, uint64_t expire)
| Inserts a watchdog into the set of scheduled watchdogs according to the specified expiration time.
void | _Watchdog_Remove (Watchdog_Header *header, Watchdog_Control *the_watchdog)
| In the case the watchdog is scheduled, then it is removed from the set of scheduled watchdogs.
RTEMS_INLINE_ROUTINE uint64_t | _Watchdog_Cancel (Watchdog_Header *header, Watchdog_Control *the_watchdog, uint64_t now)
| In the case the watchdog is scheduled, then it is removed from the set of scheduled watchdogs.
RTEMS_INLINE_ROUTINE bool | _Watchdog_Is_scheduled (const Watchdog_Control *the_watchdog)
| Checks if the watchdog is scheduled.
RTEMS_INLINE_ROUTINE void | _Watchdog_Next_first (Watchdog_Header *header, Watchdog_Control *the_watchdog)
| Sets the first node of the header.
RTEMS_INLINE_ROUTINE bool | _Watchdog_Is_valid_timespec (const struct timespec *ts)
| Checks if the timespec is a valid timespec for a watchdog.
RTEMS_INLINE_ROUTINE bool | _Watchdog_Is_valid_interval_timespec (const struct timespec *ts)
| Checks if the timespec is a valid interval timespec for a watchdog.
RTEMS_INLINE_ROUTINE const struct timespec * | _Watchdog_Future_timespec (struct timespec *now, const struct timespec *delta)
| Adds the delta timespec to the current time if the delta is a valid interval timespec.
RTEMS_INLINE_ROUTINE bool | _Watchdog_Is_far_future_timespec (const struct timespec *ts)
| Checks if the timespec is too far in the future.
RTEMS_INLINE_ROUTINE uint64_t | _Watchdog_Ticks_from_seconds (uint32_t seconds)
| Converts the seconds to ticks.
RTEMS_INLINE_ROUTINE uint64_t | _Watchdog_Ticks_from_timespec (const struct timespec *ts)
| Converts the timespec in ticks.
RTEMS_INLINE_ROUTINE uint64_t | _Watchdog_Ticks_from_sbintime (int64_t sbt)
| Converts the sbintime in ticks.
RTEMS_INLINE_ROUTINE void | _Watchdog_Per_CPU_acquire_critical (Per_CPU_Control *cpu, ISR_lock_Context *lock_context)
| Acquires the per cpu watchdog lock in a critical section.
RTEMS_INLINE_ROUTINE void | _Watchdog_Per_CPU_release_critical (Per_CPU_Control *cpu, ISR_lock_Context *lock_context)
| Releases the per cpu watchdog lock in a critical section.
RTEMS_INLINE_ROUTINE uint64_t | _Watchdog_Per_CPU_insert_ticks (Watchdog_Control *the_watchdog, Per_CPU_Control *cpu, Watchdog_Interval ticks)
| Sets the watchdog's cpu to the given instance and sets its expiration time to the watchdog expiration time of the cpu plus the ticks.
RTEMS_INLINE_ROUTINE uint64_t | _Watchdog_Per_CPU_insert (Watchdog_Control *the_watchdog, Per_CPU_Control *cpu, Watchdog_Header *header, uint64_t expire)
| Sets the watchdog's cpu and inserts it with the given expiration time in the scheduled watchdogs.
RTEMS_INLINE_ROUTINE void | _Watchdog_Per_CPU_remove (Watchdog_Control *the_watchdog, Per_CPU_Control *cpu, Watchdog_Header *header)
| Removes the watchdog from the cpu and the scheduled watchdogs.
RTEMS_INLINE_ROUTINE void | _Watchdog_Per_CPU_remove_ticks (Watchdog_Control *the_watchdog)
| Removes the watchdog from the cpu and the scheduled watchdogs.

## Variables
volatile Watchdog_Interval | _Watchdog_Ticks_since_boot
| The watchdog ticks counter.
const uint32_t | _Watchdog_Microseconds_per_tick
| The watchdog microseconds per tick.
const uint32_t | _Watchdog_Nanoseconds_per_tick
| The watchdog nanoseconds per tick.
const uint32_t | _Watchdog_Ticks_per_second
| The watchdog ticks per second.
const uint32_t | _Watchdog_Ticks_per_timeslice
| The watchdog ticks per timeslice.

## Detailed Description

Watchdog Handler.

This handler encapsulates functionality related to the scheduling of watchdog functions to be called at specific times in the future.

Note
  This handler does not have anything to do with hardware watchdog timers.

## Macro Definition Documentation

## ◆ WATCHDOG_BITS_FOR_1E9_NANOSECONDS

#define WATCHDOG_BITS_FOR_1E9_NANOSECONDS 30

The bits necessary to store 1000000000 (= WATCHDOG_NANOSECONDS_PER_SECOND) nanoseconds.

The expiration time is an unsigned 64-bit integer. To store nanoseconds timeouts we use 30 bits (2**30 == 1073741824) for the nanoseconds and 34 bits for the seconds since UNIX Epoch. This leads to a year 2514 problem.

## ◆ WATCHDOG_INITIALIZER

#define WATCHDOG_INITIALIZER | ( |  | routine | ) |

Value:
{ \
{ { { NULL, NULL, NULL, WATCHDOG_INACTIVE } } }, \
( routine ), \
0 \
}
NULL
#define NULL
Requests a GPIO pin group configuration.
Definition: bestcomm_api.h:77
WATCHDOG_INACTIVE
@ WATCHDOG_INACTIVE
The watchdog is inactive.
Definition: watchdogimpl.h:61

Watchdog initializer for static initialization.

The processor of this watchdog is set to processor with index zero.

See also
  _Watchdog_Preinitialize().

## ◆ WATCHDOG_MAX_SECONDS

#define WATCHDOG_MAX_SECONDS 0x3ffffffff

The maximum number of seconds representable in the nanoseconds watchdog format.

We have 2**34 bits for the seconds part.

## Typedef Documentation

## ◆ Watchdog_Interval

typedef uint32_t Watchdog_Interval

Type is used to specify the length of intervals.

This type is used to specify the length of intervals.

## ◆ Watchdog_Service_routine

typedef void Watchdog_Service_routine

Return type from a Watchdog Service Routine.

This type defines the return type from a Watchdog Service Routine.

## ◆ Watchdog_Service_routine_entry

typedef Watchdog_Service_routine(* Watchdog_Service_routine_entry) (Watchdog_Control *)

Pointer to a watchdog service routine.

This type define a pointer to a watchdog service routine.

## Enumeration Type Documentation

## ◆ Watchdog_State

enum Watchdog_State

Watchdog states.

Enumerator
WATCHDOG_SCHEDULED_BLACK | The watchdog is scheduled and a black node in the red-black tree.
WATCHDOG_SCHEDULED_RED | The watchdog is scheduled and a red node in the red-black tree.
WATCHDOG_INACTIVE | The watchdog is inactive.
WATCHDOG_PENDING | The watchdog is on a chain of pending watchdogs. This state is used by the timer server for example.

## Function Documentation

## ◆ _Watchdog_Cancel()

RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Cancel | ( | Watchdog_Header * | header,
|  | Watchdog_Control * | the_watchdog,
|  | uint64_t | now
| ) |  |

In the case the watchdog is scheduled, then it is removed from the set of scheduled watchdogs.

The watchdog must be initialized before this call.

Parameters

  [in,out] | header | The scheduled watchdogs.
  [in,out] | the_watchdog | The watchdog to remove.
  | now | The current time.

Return values

  other | The difference of the now and expiration time.
  0 | The now time is greater than or equal to the expiration time of the watchdog.

## ◆ _Watchdog_Do_tickle()

void _Watchdog_Do_tickle | ( | Watchdog_Header * | header,
|  | Watchdog_Control * | first,
|  | uint64_t | now,
|  | ISR_lock_Context * | lock_context
| ) |  |

Calls the routine of each not expired watchdog control node.

Parameters

  header | The watchdog header.
  first | The first watchdog control node.
  now | The current time to check the expiration time against.
  lock | The lock that is released before calling the routine and then acquired after the call.
  lock_context | The lock context for the release before calling the routine and for the acquire after.

## ◆ _Watchdog_Future_timespec()

RTEMS_INLINE_ROUTINE const struct timespec * _Watchdog_Future_timespec | ( | struct timespec * | now,
|  | const struct timespec * | delta
| ) |  |

Adds the delta timespec to the current time if the delta is a valid interval timespec.

Parameters

  [in,out] | now | The current time.
  | delta | The delta timespec for the addition.

Return values

  pointer | Pointer to the now timespec.
  NULL | delta is not a valid interval timespec.

## ◆ _Watchdog_Get_CPU()

RTEMS_INLINE_ROUTINE Per_CPU_Control * _Watchdog_Get_CPU | ( | const Watchdog_Control * | the_watchdog | ) |

Gets the watchdog's cpu.

Parameters

  the_watchdog | The watchdog to get the cpu of.

Returns
  The cpu of the watchdog.

## ◆ _Watchdog_Get_state()

RTEMS_INLINE_ROUTINE Watchdog_State _Watchdog_Get_state | ( | const Watchdog_Control * | the_watchdog | ) |

Gets the state of the watchdog.

Parameters

  the_watchdog | The watchdog to get the state of.

Returns
  The RB_COLOR of the_watchdog.

## ◆ _Watchdog_Header_destroy()

RTEMS_INLINE_ROUTINE void _Watchdog_Header_destroy | ( | Watchdog_Header * | header | ) |

Destroys the watchdog header.

Parameters

  header | The watchdog header to destroy.

## ◆ _Watchdog_Header_first()

RTEMS_INLINE_ROUTINE Watchdog_Control * _Watchdog_Header_first | ( | const Watchdog_Header * | header | ) |

Returns the first of the watchdog header.

Parameters

  header | The watchdog header to remove the first of.

Returns
  The first of header.

## ◆ _Watchdog_Header_initialize()

RTEMS_INLINE_ROUTINE void _Watchdog_Header_initialize | ( | Watchdog_Header * | header | ) |

Initializes the watchdog header.

Parameters

  [out] | header | The header to initialize.

## ◆ _Watchdog_Initialize()

RTEMS_INLINE_ROUTINE void _Watchdog_Initialize | ( | Watchdog_Control * | the_watchdog,
|  | Watchdog_Service_routine_entry | routine
| ) |  |

Initializes a watchdog with a new service routine.

The watchdog must be inactive.

Parameters

  [out] | the_watchdog | The watchdog to initialize.
  | routing | The service routine for the_watchdog.

## ◆ _Watchdog_Insert()

void _Watchdog_Insert | ( | Watchdog_Header * | header,
|  | Watchdog_Control * | the_watchdog,
|  | uint64_t | expire
| ) |  |

Inserts a watchdog into the set of scheduled watchdogs according to the specified expiration time.

The watchdog must be inactive.

Parameters

  [in,out] | header | The set of scheduler watchdogs to insert into.
  [in,out] | the_watchdog | The watchdog to insert.
  | expire | The expiration time for the watchdog.

## ◆ _Watchdog_Is_far_future_timespec()

RTEMS_INLINE_ROUTINE bool _Watchdog_Is_far_future_timespec | ( | const struct timespec * | ts | ) |

Checks if the timespec is too far in the future.

Parameters

  ts | The timespec for the verification.

Return values

  true | ts is too far in the future.
  false | ts is not too far in the future.

## ◆ _Watchdog_Is_scheduled()

RTEMS_INLINE_ROUTINE bool _Watchdog_Is_scheduled | ( | const Watchdog_Control * | the_watchdog | ) |

Checks if the watchdog is scheduled.

Parameters

  the_watchdog | The watchdog for the verification.

Return values

  true | The watchdog is scheduled.
  false | The watchdog is inactive.

## ◆ _Watchdog_Is_valid_interval_timespec()

RTEMS_INLINE_ROUTINE bool _Watchdog_Is_valid_interval_timespec | ( | const struct timespec * | ts | ) |

Checks if the timespec is a valid interval timespec for a watchdog.

Parameters

  ts | The timespec for the verification.

Return values

  true | The timespec is a valid interval timespec.
  false | The timespec is invalid.

## ◆ _Watchdog_Is_valid_timespec()

RTEMS_INLINE_ROUTINE bool _Watchdog_Is_valid_timespec | ( | const struct timespec * | ts | ) |

Checks if the timespec is a valid timespec for a watchdog.

Parameters

  ts | The timespec for the verification.

Return values

  true | The timespec is a valid timespec.
  false | The timespec is invalid.

## ◆ _Watchdog_Next_first()

RTEMS_INLINE_ROUTINE void _Watchdog_Next_first | ( | Watchdog_Header * | header,
|  | Watchdog_Control * | the_watchdog
| ) |  |

Sets the first node of the header.

Sets the first node of the header to either the leftmost child node of the watchdog control node, or if not present sets it to the right child node of the watchdog control node. if both are not present, the new first node is the parent node of the current first node.

Parameters

  [in,out] | header | The watchdog header.
  | the_watchdog | The watchdog control node for the operation.

## ◆ _Watchdog_Per_CPU_acquire_critical()

RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_acquire_critical | ( | Per_CPU_Control * | cpu,
|  | ISR_lock_Context * | lock_context
| ) |  |

Acquires the per cpu watchdog lock in a critical section.

Parameters

  cpu | The cpu to acquire the watchdog lock of.
  lock_context | The lock context.

## ◆ _Watchdog_Per_CPU_insert()

RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Per_CPU_insert | ( | Watchdog_Control * | the_watchdog,
|  | Per_CPU_Control * | cpu,
|  | Watchdog_Header * | header,
|  | uint64_t | expire
| ) |  |

Sets the watchdog's cpu and inserts it with the given expiration time in the scheduled watchdogs.

Parameters

  [in,out] | the_watchdog | The watchdog to set cpu and expiration time of.
  | cpu | The cpu for the operation.
  [in,out] | header | The scheduled watchdogs.
  | expire | The expiration time for the watchdog.

Returns
  The expiration time of the watchdog.

## ◆ _Watchdog_Per_CPU_insert_ticks()

RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Per_CPU_insert_ticks | ( | Watchdog_Control * | the_watchdog,
|  | Per_CPU_Control * | cpu,
|  | Watchdog_Interval | ticks
| ) |  |

Sets the watchdog's cpu to the given instance and sets its expiration time to the watchdog expiration time of the cpu plus the ticks.

Parameters

  [in,out] | the_watchdog | The watchdog to set the cpu and expiration time of.
  | cpu | The cpu for the watchdog.
  | ticks | The ticks to add to the expiration time.

Returns
  The new expiration time of the watchdog.

## ◆ _Watchdog_Per_CPU_release_critical()

RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_release_critical | ( | Per_CPU_Control * | cpu,
|  | ISR_lock_Context * | lock_context
| ) |  |

Releases the per cpu watchdog lock in a critical section.

Parameters

  cpu | The cpu to release the watchdog lock of.
  lock_context | The lock context.

## ◆ _Watchdog_Per_CPU_remove()

RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_remove | ( | Watchdog_Control * | the_watchdog,
|  | Per_CPU_Control * | cpu,
|  | Watchdog_Header * | header
| ) |  |

Removes the watchdog from the cpu and the scheduled watchdogs.

Parameters

  [in,out] | the_watchdog | The watchdog to remove.
  | cpu | The cpu to remove the watchdog from.
  [in,out] | The | scheduled watchdogs.

## ◆ _Watchdog_Per_CPU_remove_ticks()

RTEMS_INLINE_ROUTINE void _Watchdog_Per_CPU_remove_ticks | ( | Watchdog_Control * | the_watchdog | ) |

Removes the watchdog from the cpu and the scheduled watchdogs.

Parameters

  [in,out] | the_watchdog | The watchdog to remove.

## ◆ _Watchdog_Preinitialize()

RTEMS_INLINE_ROUTINE void _Watchdog_Preinitialize | ( | Watchdog_Control * | the_watchdog,
|  | Per_CPU_Control * | cpu
| ) |  |

Pre-initializes a watchdog.

This routine must be called before a watchdog is used in any way. The exception are statically initialized watchdogs via WATCHDOG_INITIALIZER().

Parameters

  [out] | the_watchdog | The uninitialized watchdog.

## ◆ _Watchdog_Remove()

void _Watchdog_Remove | ( | Watchdog_Header * | header,
|  | Watchdog_Control * | the_watchdog
| ) |  |

In the case the watchdog is scheduled, then it is removed from the set of scheduled watchdogs.

The watchdog must be initialized before this call.

Parameters

  [in,out] | header | The scheduled watchdogs.
  [in,out] | the_watchdog | The watchdog to remove.

## ◆ _Watchdog_Set_CPU()

RTEMS_INLINE_ROUTINE void _Watchdog_Set_CPU | ( | Watchdog_Control * | the_watchdog,
|  | Per_CPU_Control * | cpu
| ) |  |

Sets the cpu for the watchdog.

Parameters

  [out] | the_watchdog | The watchdog to set the cpu of.
  | cpu | The cpu to be set as the_watchdog's cpu.

## ◆ _Watchdog_Set_state()

RTEMS_INLINE_ROUTINE void _Watchdog_Set_state | ( | Watchdog_Control * | the_watchdog,
|  | Watchdog_State | state
| ) |  |

Sets the state of the watchdog.

Parameters

  [out] | the_watchdog | The watchdog to set the state of.
  | state | The state to set the watchdog to.

## ◆ _Watchdog_Tick()

void _Watchdog_Tick | ( | struct Per_CPU_Control * | cpu | ) |

Performs a watchdog tick.

Parameters

  cpu | The processor for this watchdog tick.

## ◆ _Watchdog_Ticks_from_sbintime()

RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Ticks_from_sbintime | ( | int64_t | sbt | ) |

Converts the sbintime in ticks.

Parameters

  sbt | The sbintime to convert to ticks.

Returns
  sbt converted to ticks.

## ◆ _Watchdog_Ticks_from_seconds()

RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Ticks_from_seconds | ( | uint32_t | seconds | ) |

Converts the seconds to ticks.

Parameters

  seconds | The seconds to convert to ticks.

Returns
  seconds converted to ticks.

## ◆ _Watchdog_Ticks_from_timespec()

RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Ticks_from_timespec | ( | const struct timespec * | ts | ) |

Converts the timespec in ticks.

Parameters

  ts | The timespec to convert to ticks.

Returns
  ts converted to ticks.

## Variable Documentation

## ◆ _Watchdog_Microseconds_per_tick

const uint32_t _Watchdog_Microseconds_per_tick
| extern

The watchdog microseconds per tick.

This constant is defined by the application configuration via <rtems/confdefs.h>.

## ◆ _Watchdog_Nanoseconds_per_tick

const uint32_t _Watchdog_Nanoseconds_per_tick
| extern

The watchdog nanoseconds per tick.

This constant is defined by the application configuration via <rtems/confdefs.h>.

## ◆ _Watchdog_Ticks_per_second

const uint32_t _Watchdog_Ticks_per_second
| extern

The watchdog ticks per second.

This constant is defined by the application configuration via <rtems/confdefs.h>.

## ◆ _Watchdog_Ticks_per_timeslice

const uint32_t _Watchdog_Ticks_per_timeslice
| extern

The watchdog ticks per timeslice.

This constant is defined by the application configuration via <rtems/confdefs.h>.

## ◆ _Watchdog_Ticks_since_boot

volatile Watchdog_Interval _Watchdog_Ticks_since_boot
| extern

The watchdog ticks counter.

With a 1ms watchdog tick, this counter overflows after 50 days since boot.