diff --git a/core/lib/assert.c b/core/lib/assert.c index fb4ff644bf..73558e8cf9 100644 --- a/core/lib/assert.c +++ b/core/lib/assert.c @@ -19,6 +19,7 @@ #include "architecture.h" #include "cpu.h" #include "debug.h" +#include "irq.h" #include "panic.h" #if IS_USED(MODULE_BACKTRACE) #include "backtrace.h" @@ -35,6 +36,12 @@ __NORETURN static inline void _assert_common(void) #ifdef DEBUG_ASSERT_BREAKPOINT DEBUG_BREAKPOINT(1); #endif + if (DEBUG_ASSERT_NO_PANIC && !irq_is_in() && irq_is_enabled()) { + puts("FAILED ASSERTION."); + while (1) { + thread_sleep(); + } + } core_panic(PANIC_ASSERT_FAIL, "FAILED ASSERTION."); } diff --git a/core/lib/include/assert.h b/core/lib/include/assert.h index 55bfd29386..665813c92c 100644 --- a/core/lib/include/assert.h +++ b/core/lib/include/assert.h @@ -157,6 +157,15 @@ __NORETURN void _assert_panic(void); #endif #endif +/** + * @brief Don't panic on a failed assertion, just halt the running thread. + * + * If the assertion failed in an interrupt, the system will still panic. + */ +#ifndef DEBUG_ASSERT_NO_PANIC +#define DEBUG_ASSERT_NO_PANIC (1) +#endif + #ifdef __cplusplus } #endif