RTEMS
5.1
|
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. More... | |
#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. More... | |
#define | WATCHDOG_MAX_SECONDS 0x3ffffffff |
The maximum number of seconds representable in the nanoseconds watchdog format. More... | |
#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. More... | |
typedef Watchdog_Service_routine(* | Watchdog_Service_routine_entry) (Watchdog_Control *) |
Pointer to a watchdog service routine. More... | |
typedef uint32_t | Watchdog_Interval |
Type is used to specify the length of intervals. More... | |
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. More... | |
RTEMS_INLINE_ROUTINE Watchdog_Control * | _Watchdog_Header_first (const Watchdog_Header *header) |
Returns the first of the watchdog header. More... | |
RTEMS_INLINE_ROUTINE void | _Watchdog_Header_destroy (Watchdog_Header *header) |
Destroys the watchdog header. More... | |
void | _Watchdog_Tick (struct Per_CPU_Control *cpu) |
Performs a watchdog tick. More... | |
RTEMS_INLINE_ROUTINE Watchdog_State | _Watchdog_Get_state (const Watchdog_Control *the_watchdog) |
Gets the state of the watchdog. More... | |
RTEMS_INLINE_ROUTINE void | _Watchdog_Set_state (Watchdog_Control *the_watchdog, Watchdog_State state) |
Sets the state of the watchdog. More... | |
RTEMS_INLINE_ROUTINE Per_CPU_Control * | _Watchdog_Get_CPU (const Watchdog_Control *the_watchdog) |
Gets the watchdog's cpu. More... | |
RTEMS_INLINE_ROUTINE void | _Watchdog_Set_CPU (Watchdog_Control *the_watchdog, Per_CPU_Control *cpu) |
Sets the cpu for the watchdog. More... | |
RTEMS_INLINE_ROUTINE void | _Watchdog_Preinitialize (Watchdog_Control *the_watchdog, Per_CPU_Control *cpu) |
Pre-initializes a watchdog. More... | |
RTEMS_INLINE_ROUTINE void | _Watchdog_Initialize (Watchdog_Control *the_watchdog, Watchdog_Service_routine_entry routine) |
Initializes a watchdog with a new service routine. More... | |
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. More... | |
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. More... | |
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. More... | |
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. More... | |
RTEMS_INLINE_ROUTINE bool | _Watchdog_Is_scheduled (const Watchdog_Control *the_watchdog) |
Checks if the watchdog is scheduled. More... | |
RTEMS_INLINE_ROUTINE void | _Watchdog_Next_first (Watchdog_Header *header, Watchdog_Control *the_watchdog) |
Sets the first node of the header. More... | |
RTEMS_INLINE_ROUTINE bool | _Watchdog_Is_valid_timespec (const struct timespec *ts) |
Checks if the timespec is a valid timespec for a watchdog. More... | |
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. More... | |
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. More... | |
RTEMS_INLINE_ROUTINE bool | _Watchdog_Is_far_future_timespec (const struct timespec *ts) |
Checks if the timespec is too far in the future. More... | |
RTEMS_INLINE_ROUTINE uint64_t | _Watchdog_Ticks_from_seconds (uint32_t seconds) |
Converts the seconds to ticks. More... | |
RTEMS_INLINE_ROUTINE uint64_t | _Watchdog_Ticks_from_timespec (const struct timespec *ts) |
Converts the timespec in ticks. More... | |
RTEMS_INLINE_ROUTINE uint64_t | _Watchdog_Ticks_from_sbintime (int64_t sbt) |
Converts the sbintime in ticks. More... | |
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. More... | |
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. More... | |
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. More... | |
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. More... | |
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. More... | |
RTEMS_INLINE_ROUTINE void | _Watchdog_Per_CPU_remove_ticks (Watchdog_Control *the_watchdog) |
Removes the watchdog from the cpu and the scheduled watchdogs. More... | |
Variables | |
volatile Watchdog_Interval | _Watchdog_Ticks_since_boot |
The watchdog ticks counter. More... | |
const uint32_t | _Watchdog_Microseconds_per_tick |
The watchdog microseconds per tick. More... | |
const uint32_t | _Watchdog_Nanoseconds_per_tick |
The watchdog nanoseconds per tick. More... | |
const uint32_t | _Watchdog_Ticks_per_second |
The watchdog ticks per second. More... | |
const uint32_t | _Watchdog_Ticks_per_timeslice |
The watchdog ticks per timeslice. More... | |
Watchdog Handler.
This handler encapsulates functionality related to the scheduling of watchdog functions to be called at specific times in the future.
#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.
#define WATCHDOG_INITIALIZER | ( | routine | ) |
Watchdog initializer for static initialization.
The processor of this watchdog is set to processor with index zero.
#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 uint32_t Watchdog_Interval |
Type is used to specify the length of intervals.
This type is used to specify the length of intervals.
typedef void Watchdog_Service_routine |
Return type from a Watchdog Service Routine.
This type defines the return type from a Watchdog Service Routine.
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.
enum Watchdog_State |
Watchdog states.
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.
[in,out] | header | The scheduled watchdogs. |
[in,out] | the_watchdog | The watchdog to remove. |
now | The current time. |
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. |
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.
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. |
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.
[in,out] | now | The current time. |
delta | The delta timespec for the addition. |
pointer | Pointer to the now timespec. |
NULL | delta is not a valid interval timespec. |
RTEMS_INLINE_ROUTINE Per_CPU_Control* _Watchdog_Get_CPU | ( | const Watchdog_Control * | the_watchdog | ) |
Gets the watchdog's cpu.
the_watchdog | The watchdog to get the cpu of. |
RTEMS_INLINE_ROUTINE Watchdog_State _Watchdog_Get_state | ( | const Watchdog_Control * | the_watchdog | ) |
Gets the state of the watchdog.
the_watchdog | The watchdog to get the state of. |
RTEMS_INLINE_ROUTINE void _Watchdog_Header_destroy | ( | Watchdog_Header * | header | ) |
Destroys the watchdog header.
header | The watchdog header to destroy. |
RTEMS_INLINE_ROUTINE Watchdog_Control* _Watchdog_Header_first | ( | const Watchdog_Header * | header | ) |
Returns the first of the watchdog header.
header | The watchdog header to remove the first of. |
RTEMS_INLINE_ROUTINE void _Watchdog_Header_initialize | ( | Watchdog_Header * | header | ) |
Initializes the watchdog header.
[out] | header | The header to 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.
[out] | the_watchdog | The watchdog to initialize. |
routing | The service routine for the_watchdog. |
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.
[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. |
RTEMS_INLINE_ROUTINE bool _Watchdog_Is_far_future_timespec | ( | const struct timespec * | ts | ) |
Checks if the timespec is too far in the future.
ts | The timespec for the verification. |
true | ts is too far in the future. |
false | ts is not too far in the future. |
RTEMS_INLINE_ROUTINE bool _Watchdog_Is_scheduled | ( | const Watchdog_Control * | the_watchdog | ) |
Checks if the watchdog is scheduled.
the_watchdog | The watchdog for the verification. |
true | The watchdog is scheduled. |
false | The watchdog is inactive. |
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.
ts | The timespec for the verification. |
true | The timespec is a valid interval timespec. |
false | The timespec is invalid. |
RTEMS_INLINE_ROUTINE bool _Watchdog_Is_valid_timespec | ( | const struct timespec * | ts | ) |
Checks if the timespec is a valid timespec for a watchdog.
ts | The timespec for the verification. |
true | The timespec is a valid timespec. |
false | The timespec is invalid. |
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.
[in,out] | header | The watchdog header. |
the_watchdog | The watchdog control node for the operation. |
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.
cpu | The cpu to acquire the watchdog lock of. |
lock_context | The lock context. |
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.
[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. |
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.
[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. |
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.
cpu | The cpu to release the watchdog lock of. |
lock_context | The lock context. |
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.
[in,out] | the_watchdog | The watchdog to remove. |
cpu | The cpu to remove the watchdog from. | |
[in,out] | 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.
[in,out] | the_watchdog | The watchdog to remove. |
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().
[out] | the_watchdog | The uninitialized watchdog. |
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.
[in,out] | header | The scheduled watchdogs. |
[in,out] | the_watchdog | The watchdog to remove. |
RTEMS_INLINE_ROUTINE void _Watchdog_Set_CPU | ( | Watchdog_Control * | the_watchdog, |
Per_CPU_Control * | cpu | ||
) |
Sets the cpu for the watchdog.
[out] | the_watchdog | The watchdog to set the cpu of. |
cpu | The cpu to be set as the_watchdog's cpu. |
RTEMS_INLINE_ROUTINE void _Watchdog_Set_state | ( | Watchdog_Control * | the_watchdog, |
Watchdog_State | state | ||
) |
Sets the state of the watchdog.
[out] | the_watchdog | The watchdog to set the state of. |
state | The state to set the watchdog to. |
void _Watchdog_Tick | ( | struct Per_CPU_Control * | cpu | ) |
Performs a watchdog tick.
cpu | The processor for this watchdog tick. |
RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Ticks_from_sbintime | ( | int64_t | sbt | ) |
Converts the sbintime in ticks.
sbt | The sbintime to convert to ticks. |
RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Ticks_from_seconds | ( | uint32_t | seconds | ) |
Converts the seconds to ticks.
seconds | The seconds to convert to ticks. |
RTEMS_INLINE_ROUTINE uint64_t _Watchdog_Ticks_from_timespec | ( | const struct timespec * | ts | ) |
Converts the timespec in ticks.
ts | The timespec to convert to ticks. |
const uint32_t _Watchdog_Microseconds_per_tick |
The watchdog microseconds per tick.
This constant is defined by the application configuration via <rtems/confdefs.h>.
const uint32_t _Watchdog_Nanoseconds_per_tick |
The watchdog nanoseconds per tick.
This constant is defined by the application configuration via <rtems/confdefs.h>.
const uint32_t _Watchdog_Ticks_per_second |
The watchdog ticks per second.
This constant is defined by the application configuration via <rtems/confdefs.h>.
const uint32_t _Watchdog_Ticks_per_timeslice |
The watchdog ticks per timeslice.
This constant is defined by the application configuration via <rtems/confdefs.h>.
volatile Watchdog_Interval _Watchdog_Ticks_since_boot |
The watchdog ticks counter.
With a 1ms watchdog tick, this counter overflows after 50 days since boot.