Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

Comments on Is Feeding a Watchdog Timer from an ISR a Bad Practice?

Parent

Is Feeding a Watchdog Timer from an ISR a Bad Practice?

+3
−0

In an embedded system, I require a watchdog to be able to pass ESD qualifications (the main reason for the watchdog requirement is that the device wasn't able to pass the harshest tests of the IEC 61000-4-2 standard). Having no experience with watchdogs, I went through this Memfault article. I liked the events "registration" and "flags" since it easily allows us to do conditional ORing of events depending on the system's state. Plus it feels scalable.

For the feeding part, here's what I put in place:

/** @brief Raise the event flag and feed the watchdog if all required event flags are set.
 *
 *  @param[in] event_flag  Bitmask corresponding to the triggering event.
 */
static void watchdog_feed_if_all_events_set(watchdog_event_t event_flag)
{
    /* Declare as volatile since this function could be called from concurrent ISRs. */
    static volatile watchdog_event_t watchdog_fed_events;

    enter_critical();

    watchdog_fed_events |= event_flag;

    if ((watchdog_fed_events & watchdog_required_events) == watchdog_required_events) {
        bsp_watchdog_feed();
        watchdog_fed_events = 0;
    }
    exit_critical();
}

This function can then be called from any part of the application, including from ISRs.

Now for the question:

I was told it was senseless to feed a watchdog from an ISR and that a redesign is required, but no rationale was provided. I see nothing wrong with my implementation and it works just fine. I feel like a watchdog design is closely related/dependent to the system on which it is implemented and that there are no one-size-fits-all designs.

Am I missing something? Why would someone want to avoid feeding a watchdog from an ISR?

History
Why does this post require attention from curators or moderators?
You might want to add some details to your flag.
Why should this post be closed?

1 comment thread

"XY problem" about ESD (4 comments)
Post
+1
−0

Feeding the watchdog from an interrupt service routine is indeed a bad idea, usually. It depends on what you are really trying to protect against.

The purpose of a hardware watchdog is usually to allow recovery if the processor stops doing what it's supposed to be doing. The question then becomes how do you measure "supposed to be doing".

If you are only concerned about the processor itself no longer executing code due to a physical reason, like an ESD event, then feeding the dog from an interrupt routine is OK. However, there are other possible reasons the process can stop doing what it's supposed to be doing that this method won't catch. If the processor takes a bad jump someplace, it could be executing garbage foreground code, but interrupts might still run normally. If you have multiple tasks running, then a single task could be wedged, but the interrupt method won't detect that.

By having only foreground code (as opposed to interrupt code) feeding the dog, more of the system has to be functional to not cause a hardware reset. In a cooperative multi-tasking system, you could have one task occasionally feed the dog. If that one task is running occasionally, then all tasks must be running occasionally.

An even more robust system, necessary in pre-emptive multi-tasking, is for each task to set a flag occasionally but faster than you need to feed the dog. One task periodically checks the flags and only feeds the dog if all flags are set. Of course it resets the flags then, ready for the next interval.

History
Why does this post require attention from curators or moderators?
You might want to add some details to your flag.

1 comment thread

Thanks for that, I was looking for a more nuanced answer like this. My system is bare metal and part ... (3 comments)
Thanks for that, I was looking for a more nuanced answer like this. My system is bare metal and part ...
drkfrx‭ wrote about 14 hours ago

Thanks for that, I was looking for a more nuanced answer like this. My system is bare metal and part of the firmware is interrupt driven by an external IC. The watchdog needs to trigger if said external IC fails to raise its IRQ line. I had implemented the conditional feeding with the "event flags" already, but I'll now move the actual feeding in a single place (main loop) while the different processes (ISRs) will raise their associated flag. This will essentially be what you suggest in your last paragraph!

Lundin‭ wrote about 14 hours ago

drkfrx‭ The problem with conditionally checking the memory and kicking the watchdog accordingly is that if the memory gets corrupted, the watchdog no longer protects against that. Which is one of the core purposes of having a watchdog in the first place.

On safety-critical systems you often use a hardware time window watchdog which must be refreshed within a certain time interval and that design only works well if you refresh it from one place in main().

drkfrx‭ wrote about 14 hours ago · edited about 14 hours ago

I admit I didn't think about memory corruption. So there could be an edge case where memory gets corrupted but all parts of the firmware still run, albeit in an incorrect manner. The watchdog could still be fed nonetheless and have the system sustain in this faulty state.

This feels quite improbable to me, but I can understand that safety critical systems (which mine isn't) would require a more developed solution.