nrf: Feed the watchdog from the RTC interrupt

Feeding a watchdog from a periodic interrupt isn't the smartest thing
to do (unless you have setup multi-channels) so we also allow us to
express to the WDT driver whether we've arrived from an ISR or not.
pull/1/head
Daniel Thompson 2020-02-01 13:10:23 +00:00
parent 5f5b7bdb25
commit b2273b5d22
4 changed files with 9 additions and 6 deletions

View File

@ -94,15 +94,14 @@ static ubluepy_advertise_data_t m_adv_data_eddystone_url;
#endif // BLUETOOTH_WEBBLUETOOTH_REPL #endif // BLUETOOTH_WEBBLUETOOTH_REPL
int mp_hal_stdin_rx_chr(void) { int mp_hal_stdin_rx_chr(void) {
wdt_feed(); wdt_feed(false);
while (!ble_uart_enabled()) { while (!ble_uart_enabled()) {
// wait for connection // wait for connection
wdt_feed(); wdt_feed(false);
} }
while (isBufferEmpty(mp_rx_ring_buffer)) { while (isBufferEmpty(mp_rx_ring_buffer)) {
wdt_feed(); wdt_feed(false);
;
} }
uint8_t byte; uint8_t byte;

View File

@ -76,7 +76,7 @@ void wdt_init(void)
} }
} }
void wdt_feed(void) void wdt_feed(bool isr)
{ {
/* /*
* A WDT button allows us to feed the dog from somewhere that would * A WDT button allows us to feed the dog from somewhere that would
@ -86,6 +86,8 @@ void wdt_feed(void)
*/ */
#if MICROPY_HW_HAS_WDT_BUTTON #if MICROPY_HW_HAS_WDT_BUTTON
if (!button_pressed()) if (!button_pressed())
#else
if (!isr)
#endif #endif
nrf_wdt_reload_request_set(0); nrf_wdt_reload_request_set(0);
} }

View File

@ -26,6 +26,6 @@
#define __MICROPY_INCLUDED_LIB_WDT_H__ #define __MICROPY_INCLUDED_LIB_WDT_H__
void wdt_init(void); void wdt_init(void);
void wdt_feed(void); void wdt_feed(bool isr);
#endif // __MICROPY_INCLUDED_LIB_WDT_H__ #endif // __MICROPY_INCLUDED_LIB_WDT_H__

View File

@ -28,6 +28,7 @@
#include "py/nlr.h" #include "py/nlr.h"
#include "py/runtime.h" #include "py/runtime.h"
#include "rtcounter.h" #include "rtcounter.h"
#include "wdt.h"
#include "nrfx_rtc.h" #include "nrfx_rtc.h"
#include "nrf_clock.h" #include "nrf_clock.h"
@ -106,6 +107,7 @@ STATIC void interrupt_handler(size_t instance_id) {
uint32_t val = nrfx_rtc_counter_get(self->p_rtc) + config->period; uint32_t val = nrfx_rtc_counter_get(self->p_rtc) + config->period;
nrfx_rtc_cc_set(self->p_rtc, 0, val, true); nrfx_rtc_cc_set(self->p_rtc, 0, val, true);
} }
wdt_feed(true);
} }
#if !defined(BLUETOOTH_SD) #if !defined(BLUETOOTH_SD)