Add support for dumping board-specific information on assertion. From David Sidrane

This commit is contained in:
Gregory Nutt 2015-03-04 07:00:29 -06:00
parent 81ac04bbaf
commit 76007d28f5
16 changed files with 116 additions and 0 deletions

View File

@ -352,6 +352,12 @@ void up_assert(const uint8_t *filename, int lineno)
lldbg("Assertion failed at file:%s line: %d\n",
filename, lineno);
#endif
up_dumpstate();
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -369,5 +369,10 @@ void up_assert(const uint8_t *filename, int lineno)
#endif
up_dumpstate();
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -367,5 +367,10 @@ void up_assert(const uint8_t *filename, int lineno)
filename, lineno);
#endif
up_dumpstate();
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -378,5 +378,10 @@ void up_assert(const uint8_t *filename, int lineno)
#endif
up_dumpstate();
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -46,6 +46,7 @@
#include <nuttx/kmalloc.h>
#include <nuttx/arch.h>
#include <nuttx/board.h>
#include <arch/board/board.h>
#include "up_arch.h"

View File

@ -175,6 +175,10 @@ void up_assert(const uint8_t *filename, int lineno)
up_dumpstate();
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
#ifdef CONFIG_ARCH_USBDUMP
/* Dump USB trace data */

View File

@ -337,5 +337,10 @@ void up_assert(const uint8_t *filename, int lineno)
#endif
up_dumpstate();
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -181,5 +181,9 @@ void up_assert(const uint8_t *filename, int lineno)
(void)usbtrace_enumerate(assert_tracecallback, NULL);
#endif
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -487,6 +487,10 @@ void up_assert(const uint8_t *filename, int line)
{
fprintf(stderr, "Assertion failed at file:%s line: %d\n", filename, line);
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, line);
#endif
// in interrupt context or idle task means kernel error
// which will stop the OS
// if in user space just terminate the task

View File

@ -169,5 +169,9 @@ void up_assert(const uint8_t *filename, int lineno)
(void)usbtrace_enumerate(assert_tracecallback, NULL);
#endif
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -81,5 +81,10 @@ int main(int argc, char **argv, char **envp)
void up_assert(const uint8_t *filename, int line)
{
fprintf(stderr, "Assertion failed at file:%s line: %d\n", filename, line);
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, line);
#endif
longjmp(sim_abort, 1);
}

View File

@ -299,5 +299,10 @@ void up_assert(const uint8_t *filename, int lineno)
#endif
up_dumpstate();
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -181,5 +181,9 @@ void up_assert(void)
(void)usbtrace_enumerate(assert_tracecallback, NULL);
#endif
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -180,5 +180,9 @@ void up_assert(void)
(void)usbtrace_enumerate(assert_tracecallback, NULL);
#endif
#ifdef CONFIG_BOARD_CRASHDUMP
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
#endif
_up_assert(EXIT_FAILURE);
}

View File

@ -1043,6 +1043,31 @@ config ARCH_BOARD_CUSTOM_DIR
to some location outside of the NuttX source tree (like
"~/projects/myboard").
config BOARD_CRASHDUMP
bool "Enable Board level logging of crash dumps"
default n
---help---
If selected up_asseert will call out to board_crashdump, in the case
of an assertion failure, prior to calling exit. Or in the
case of a hardfault prior to looping indefinitely. board_crashdump
then has a chance to save the state of the machine.
The purpose of board_crashdump is to save as much information as it can
about the cause of the fault and then most likely reset the system.
N.B. There is limited system resources that can be used, who knows
what memory is trashed? So all we can expect to do is save the
"machine state" in a place where on the next reset can write it
to more sophisticated storage in a sane operating environment.
config BOARD_RESET_ON_CRASH
bool "Eanble Board Reset after the crashdump is saved"
default n
depends on BOARD_CRASHDUMP
---help---
If selected the board_crashdump should reset the machine after
saveing the state of the machine
config BOARD_CUSTOM_LEDS
bool "Custom board LEDs"
default n

View File

@ -291,4 +291,34 @@ uint8_t board_buttons(void);
xcpt_t board_button_irq(int id, xcpt_t irqhandler);
#endif
/****************************************************************************
* Name: board_crashdump
*
* Description:
* If CONFIG_BOARD_CRASHDUMP is selected then up_asseert will call out to
* board_crashdump prior to calling exit in the case of an assertion failure.
* Or in the case of a hardfault looping indefinitely. board_crashdump then
* has a chance to save the state of the machine. The provided
* board_crashdump should save as much information as it can about the cause
* of the fault and then most likely reset the system.
*
* N.B. There are limited system resources that can be used by the provided
* board_crashdump function. The tems from the fact that most critical/fatal
* crashes are because of a hard fault or during interrupt processing.
* In these cases, up_assert is running from the context of an interrupt
* handlerand it is impossible to use any device driver in this context.
*
* Also consider the following: Who knows what state the system is in? Is
* memory trashed? Is the Heap intact? Therefore all we can expect to do in
* board_crashdump is save the "machine state" in a place where on the next
* reset we can write it to more sophisticated storage in a sane operating
* environment.
*
****************************************************************************/
#ifdef CONFIG_BOARD_CRASHDUMP
void board_crashdump(uint32_t currentsp, void *tcb, uint8_t *filename,
int lineno);
#endif
#endif /* __INCLUDE_NUTTX_BOARD_H */