mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-17 05:12:57 +01:00
sys/auto_init: add auto_init_wdt_{event, thread} modules
This commit is contained in:
parent
b8a6988e79
commit
80fe4e5f26
@ -157,9 +157,42 @@
|
|||||||
* Makefile add:
|
* Makefile add:
|
||||||
*
|
*
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~ {.mk}
|
* ~~~~~~~~~~~~~~~~~~~~~~~~ {.mk}
|
||||||
* MODULE += periph_wdt_cb
|
* USEMODULE += periph_wdt_cb
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~~~
|
* ~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
*
|
*
|
||||||
|
* WDT Auto-Start
|
||||||
|
* ==============
|
||||||
|
*
|
||||||
|
* It is possible to enable the Watchdog in early boot, before application startup:
|
||||||
|
*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~ {.mk}
|
||||||
|
* USEMODULE += periph_wdt_auto_start
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*
|
||||||
|
* The watchdog will automatically be initialized with the parameters
|
||||||
|
* @ref CONFIG_PERIPH_WDT_WIN_MIN_MS and @ref CONFIG_PERIPH_WDT_WIN_MAX_MS
|
||||||
|
*
|
||||||
|
* It is also possible to automatically kick the watchdog.
|
||||||
|
* This is a very non-invasive way of using the watchdog, but it is also very
|
||||||
|
* weak as it can only detect situations where low-priority threads are
|
||||||
|
* starved from execution and may even trigger wrongly in situations where the
|
||||||
|
* system just experiences high load, but would otherwise have recovered on it's own.
|
||||||
|
*
|
||||||
|
* If you want to enable it anyway, select this module:
|
||||||
|
*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~ {.mk}
|
||||||
|
* USEMODULE += auto_init_wdt_thread
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*
|
||||||
|
* If you are using an event thread, you can also use the watchdog to ensure that events
|
||||||
|
* are processed in time.
|
||||||
|
* To do so, add
|
||||||
|
*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~ {.mk}
|
||||||
|
* USEMODULE += auto_init_wdt_event
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*
|
||||||
|
*
|
||||||
* @{
|
* @{
|
||||||
*
|
*
|
||||||
* @file wdt.h
|
* @file wdt.h
|
||||||
|
@ -589,6 +589,8 @@ NO_PSEUDOMODULES += auto_init_multimedia
|
|||||||
NO_PSEUDOMODULES += auto_init_security
|
NO_PSEUDOMODULES += auto_init_security
|
||||||
NO_PSEUDOMODULES += auto_init_usbus
|
NO_PSEUDOMODULES += auto_init_usbus
|
||||||
NO_PSEUDOMODULES += auto_init_screen
|
NO_PSEUDOMODULES += auto_init_screen
|
||||||
|
NO_PSEUDOMODULES += auto_init_wdt_event
|
||||||
|
NO_PSEUDOMODULES += auto_init_wdt_thread
|
||||||
|
|
||||||
# Packages and drivers may also add modules to PSEUDOMODULES in their `Makefile.include`.
|
# Packages and drivers may also add modules to PSEUDOMODULES in their `Makefile.include`.
|
||||||
|
|
||||||
|
@ -24,6 +24,23 @@ ifneq (,$(filter auto_init_gnrc_netif,$(USEMODULE)))
|
|||||||
USEMODULE += gnrc_netif_init_devs
|
USEMODULE += gnrc_netif_init_devs
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(filter auto_init_wdt_thread,$(USEMODULE)))
|
||||||
|
USEMODULE += periph_wdt_auto_start
|
||||||
|
USEMODULE += ztimer_msec
|
||||||
|
|
||||||
|
# we can only have either auto_init_wdt_event or auto_init_wdt_thread
|
||||||
|
ifneq (,$(filter auto_init_wdt_event,$(USEMODULE)))
|
||||||
|
$(error auto_init_wdt_event and auto_init_wdt_thread are mutually exclusive)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(filter auto_init_wdt_event,$(USEMODULE)))
|
||||||
|
USEMODULE += event_periodic_callback
|
||||||
|
USEMODULE += event_thread
|
||||||
|
USEMODULE += periph_wdt_auto_start
|
||||||
|
USEMODULE += ztimer_msec
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter auto_init_sock_dns,$(USEMODULE)))
|
ifneq (,$(filter auto_init_sock_dns,$(USEMODULE)))
|
||||||
ifneq (,$(filter ipv4,$(USEMODULE)))
|
ifneq (,$(filter ipv4,$(USEMODULE)))
|
||||||
USEMODULE += ipv4_addr
|
USEMODULE += ipv4_addr
|
||||||
|
@ -30,4 +30,12 @@ ifneq (,$(filter auto_init_screen,$(USEMODULE)))
|
|||||||
DIRS += screen
|
DIRS += screen
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(filter auto_init_wdt_event,$(USEMODULE)))
|
||||||
|
DIRS += wdt_event
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(filter auto_init_wdt_thread,$(USEMODULE)))
|
||||||
|
DIRS += wdt_thread
|
||||||
|
endif
|
||||||
|
|
||||||
include $(RIOTBASE)/Makefile.base
|
include $(RIOTBASE)/Makefile.base
|
||||||
|
@ -41,6 +41,12 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define AUTO_INIT_PRIO_MOD_XTIMER 1030
|
#define AUTO_INIT_PRIO_MOD_XTIMER 1030
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef AUTO_INIT_PRIO_WDT_THREAD
|
||||||
|
/**
|
||||||
|
* @brief WDT priority
|
||||||
|
*/
|
||||||
|
#define AUTO_INIT_PRIO_WDT_THREAD 1035
|
||||||
|
#endif
|
||||||
#ifndef AUTO_INIT_PRIO_MOD_RANDOM
|
#ifndef AUTO_INIT_PRIO_MOD_RANDOM
|
||||||
/**
|
/**
|
||||||
* @brief RNG priority
|
* @brief RNG priority
|
||||||
@ -71,6 +77,12 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define AUTO_INIT_PRIO_MOD_EVENT_THREAD 1080
|
#define AUTO_INIT_PRIO_MOD_EVENT_THREAD 1080
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef AUTO_INIT_PRIO_WDT_EVENT
|
||||||
|
/**
|
||||||
|
* @brief WDT event priority
|
||||||
|
*/
|
||||||
|
#define AUTO_INIT_PRIO_WDT_EVENT 1085
|
||||||
|
#endif
|
||||||
#ifndef AUTO_INIT_PRIO_MOD_SYS_BUS
|
#ifndef AUTO_INIT_PRIO_MOD_SYS_BUS
|
||||||
/**
|
/**
|
||||||
* @brief sys bus priority
|
* @brief sys bus priority
|
||||||
|
3
sys/auto_init/wdt_event/Makefile
Normal file
3
sys/auto_init/wdt_event/Makefile
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
MODULE = auto_init_wdt_event
|
||||||
|
|
||||||
|
include $(RIOTBASE)/Makefile.base
|
47
sys/auto_init/wdt_event/wdt.c
Normal file
47
sys/auto_init/wdt_event/wdt.c
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 ML!PA Consulting GmbH
|
||||||
|
*
|
||||||
|
* This file is subject to the terms and conditions of the GNU Lesser
|
||||||
|
* General Public License v2.1. See the file LICENSE in the top level
|
||||||
|
* directory for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup sys_auto_init
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @file wdt.c
|
||||||
|
* @brief Watchdog Event
|
||||||
|
*
|
||||||
|
* @author Benjamin Valentin <benjamin.valentin@ml-pa.com>
|
||||||
|
*
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "auto_init.h"
|
||||||
|
#include "auto_init_utils.h"
|
||||||
|
#include "auto_init_priorities.h"
|
||||||
|
|
||||||
|
#include "architecture.h"
|
||||||
|
#include "event/periodic_callback.h"
|
||||||
|
#include "event/thread.h"
|
||||||
|
#include "periph/wdt.h"
|
||||||
|
#include "ztimer.h"
|
||||||
|
|
||||||
|
static void _wdt_event_cb(void *ctx)
|
||||||
|
{
|
||||||
|
(void)ctx;
|
||||||
|
wdt_kick();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void auto_init_wdt_event(void)
|
||||||
|
{
|
||||||
|
static event_periodic_callback_t wdt_event;
|
||||||
|
unsigned sleep_ms = (CONFIG_PERIPH_WDT_WIN_MIN_MS + CONFIG_PERIPH_WDT_WIN_MAX_MS)
|
||||||
|
/ 2;
|
||||||
|
|
||||||
|
event_periodic_callback_init(&wdt_event, ZTIMER_MSEC, EVENT_PRIO_LOWEST, _wdt_event_cb, NULL);
|
||||||
|
event_periodic_callback_start(&wdt_event, sleep_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
AUTO_INIT(auto_init_wdt_event, AUTO_INIT_PRIO_WDT_EVENT);
|
3
sys/auto_init/wdt_thread/Makefile
Normal file
3
sys/auto_init/wdt_thread/Makefile
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
MODULE = auto_init_wdt_thread
|
||||||
|
|
||||||
|
include $(RIOTBASE)/Makefile.base
|
58
sys/auto_init/wdt_thread/wdt.c
Normal file
58
sys/auto_init/wdt_thread/wdt.c
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 ML!PA Consulting GmbH
|
||||||
|
*
|
||||||
|
* This file is subject to the terms and conditions of the GNU Lesser
|
||||||
|
* General Public License v2.1. See the file LICENSE in the top level
|
||||||
|
* directory for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup sys_auto_init
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @file wdt.c
|
||||||
|
* @brief Watchdog Thread
|
||||||
|
*
|
||||||
|
* @author Benjamin Valentin <benjamin.valentin@ml-pa.com>
|
||||||
|
*
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "auto_init.h"
|
||||||
|
#include "auto_init_utils.h"
|
||||||
|
#include "auto_init_priorities.h"
|
||||||
|
|
||||||
|
#include "architecture.h"
|
||||||
|
#include "periph/wdt.h"
|
||||||
|
#include "ztimer.h"
|
||||||
|
|
||||||
|
#ifndef WDT_THREAD_STACKSIZE
|
||||||
|
#if DEVELHELP
|
||||||
|
#define WDT_THREAD_STACKSIZE THREAD_STACKSIZE_SMALL
|
||||||
|
#else
|
||||||
|
#define WDT_THREAD_STACKSIZE THREAD_STACKSIZE_TINY
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static char WORD_ALIGNED wdt_stack[WDT_THREAD_STACKSIZE];
|
||||||
|
|
||||||
|
static void *_wdt_thread(void *ctx)
|
||||||
|
{
|
||||||
|
(void)ctx;
|
||||||
|
unsigned sleep_ms = (CONFIG_PERIPH_WDT_WIN_MIN_MS + CONFIG_PERIPH_WDT_WIN_MAX_MS)
|
||||||
|
/ 2;
|
||||||
|
while (1) {
|
||||||
|
ztimer_sleep(ZTIMER_MSEC, sleep_ms);
|
||||||
|
wdt_kick();
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void auto_init_wdt_thread(void)
|
||||||
|
{
|
||||||
|
thread_create(wdt_stack, sizeof(wdt_stack), THREAD_PRIORITY_MIN,
|
||||||
|
THREAD_CREATE_STACKTEST, _wdt_thread, NULL, "watchdog");
|
||||||
|
}
|
||||||
|
|
||||||
|
AUTO_INIT(auto_init_wdt_thread, AUTO_INIT_PRIO_WDT_THREAD);
|
Loading…
Reference in New Issue
Block a user