diff --git a/cpu/msp430-common/crash.c b/cpu/msp430-common/crash.c new file mode 100644 index 0000000000..41522eb5e0 --- /dev/null +++ b/cpu/msp430-common/crash.c @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2014 INRIA + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @ingroup core_util + * @{ + * + * @file crash.c + * @brief Crash handling functions implementation for MSP430 MCUs + * + * @author Kévin Roussel + */ + +#include "cpu.h" +#include "lpm.h" +#include "crash.h" + +#include +#include + +/* "public" variables holding the crash data */ +char panic_str[80]; +int panic_code; + +/* flag preventing "recursive crash printing loop" */ +static int crashed = 0; + +/* WARNING: this function NEVER returns! */ +NORETURN void core_panic(int crash_code, const char *message) +{ + /* copy panic datas to "public" global variables */ + panic_code = crash_code; + strncpy(panic_str, message, 80); + /* (try to) print panic message to console */ + if (crashed == 0) { + crashed = 1; + puts("******** SYSTEM FAILURE ********\n"); + puts(message); +#if DEVELHELP + puts("******** RIOT HALTS HERE ********\n"); +#else + puts("******** RIOT WILL REBOOT ********\n"); +#endif + puts("\n\n"); + } + /* disable watchdog and all possible sources of interrupts */ + WDTCTL = WDTPW | WDTHOLD; + dINT(); +#if DEVELHELP + /* enter infinite loop, into deepest possible sleep mode */ + while (1) { + lpm_set(LPM_OFF); + } +#else + /* DEVELHELP not set => reboot system */ + reboot(); +#endif +}