diff options
-rw-r--r-- | README | 6 | ||||
-rw-r--r-- | core/cortex-m/panic.c | 12 | ||||
-rw-r--r-- | include/panic.h | 12 | ||||
-rw-r--r-- | include/util.h | 11 |
4 files changed, 40 insertions, 1 deletions
@@ -54,3 +54,9 @@ Build Options Precise data bus error, Forced hard fault, Vector catch, bfar = 60000000 mmfs = 00008200, shcsr = 00000000, hfsr = 40000000, dfsr = 00000008 +- CONFIG_ASSERT_HELP + + Report assertion failures in a vebose manner to aid debugging. When + enabled an ASSERT() which fails will produce message in the form: + + ASSERTION FAILURE '<expr>' in function() at file:line diff --git a/core/cortex-m/panic.c b/core/cortex-m/panic.c index d249974b06..1c9629eff3 100644 --- a/core/cortex-m/panic.c +++ b/core/cortex-m/panic.c @@ -360,3 +360,15 @@ void exception_panic(void) [save_area] "r" (save_area.saved_regs) ); } + + +#ifdef CONFIG_ASSERT_HELP +void panic_assert_fail(const char *msg, const char *func, const char *fname, + int linenum) +{ + panic_printf("\nASSERTION FAILURE '%s' in %s() at %s:%d\n", msg, func, + fname, linenum); + + panic_reboot(); +} +#endif diff --git a/include/panic.h b/include/panic.h index 2cfda9bcee..2bef50f541 100644 --- a/include/panic.h +++ b/include/panic.h @@ -56,6 +56,18 @@ void panic_vprintf(const char *format, va_list args); */ void panic_printf(const char *format, ...); + +/** + * Report an assertion failure and reset + * + * @param msg Assertion expression or other message + * @param func Function name where assertion happened + * @param fname File name where assertion happened + * @param linenum Line number where assertion happened + */ +void panic_assert_fail(const char *msg, const char *func, const char *fname, + int linenum); + /** * Report a panic to the panic reporting device * diff --git a/include/util.h b/include/util.h index cf1ffde4d7..423408a45c 100644 --- a/include/util.h +++ b/include/util.h @@ -10,6 +10,7 @@ #include "common.h" #include "config.h" +#include "panic.h" /** * Trigger a compilation failure if the condition @@ -22,10 +23,18 @@ * is not verified at runtime. */ #ifdef CONFIG_DEBUG -#define ASSERT(cond) do { \ +# ifdef CONFIG_ASSERT_HELP +# define ASSERT(cond) do { \ + if (!(cond)) \ + panic_assert_fail(#cond, __func__, __FILE__, \ + __LINE__); \ + } while (0); +# else +# define ASSERT(cond) do { \ if (!(cond)) \ __asm("bkpt"); \ } while (0); +# endif #else #define ASSERT(cond) #endif |