Add support for dumping board-specific information on assertion. From David Sidrane
This commit is contained in:
parent
81ac04bbaf
commit
76007d28f5
@ -352,6 +352,12 @@ void up_assert(const uint8_t *filename, int lineno)
|
|||||||
lldbg("Assertion failed at file:%s line: %d\n",
|
lldbg("Assertion failed at file:%s line: %d\n",
|
||||||
filename, lineno);
|
filename, lineno);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
up_dumpstate();
|
up_dumpstate();
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -369,5 +369,10 @@ void up_assert(const uint8_t *filename, int lineno)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
up_dumpstate();
|
up_dumpstate();
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -367,5 +367,10 @@ void up_assert(const uint8_t *filename, int lineno)
|
|||||||
filename, lineno);
|
filename, lineno);
|
||||||
#endif
|
#endif
|
||||||
up_dumpstate();
|
up_dumpstate();
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -378,5 +378,10 @@ void up_assert(const uint8_t *filename, int lineno)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
up_dumpstate();
|
up_dumpstate();
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
|
|
||||||
#include <nuttx/kmalloc.h>
|
#include <nuttx/kmalloc.h>
|
||||||
#include <nuttx/arch.h>
|
#include <nuttx/arch.h>
|
||||||
|
#include <nuttx/board.h>
|
||||||
#include <arch/board/board.h>
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
#include "up_arch.h"
|
#include "up_arch.h"
|
||||||
|
@ -175,6 +175,10 @@ void up_assert(const uint8_t *filename, int lineno)
|
|||||||
|
|
||||||
up_dumpstate();
|
up_dumpstate();
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_USBDUMP
|
#ifdef CONFIG_ARCH_USBDUMP
|
||||||
/* Dump USB trace data */
|
/* Dump USB trace data */
|
||||||
|
|
||||||
|
@ -337,5 +337,10 @@ void up_assert(const uint8_t *filename, int lineno)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
up_dumpstate();
|
up_dumpstate();
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -181,5 +181,9 @@ void up_assert(const uint8_t *filename, int lineno)
|
|||||||
(void)usbtrace_enumerate(assert_tracecallback, NULL);
|
(void)usbtrace_enumerate(assert_tracecallback, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
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
|
// in interrupt context or idle task means kernel error
|
||||||
// which will stop the OS
|
// which will stop the OS
|
||||||
// if in user space just terminate the task
|
// if in user space just terminate the task
|
||||||
|
@ -169,5 +169,9 @@ void up_assert(const uint8_t *filename, int lineno)
|
|||||||
(void)usbtrace_enumerate(assert_tracecallback, NULL);
|
(void)usbtrace_enumerate(assert_tracecallback, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -81,5 +81,10 @@ int main(int argc, char **argv, char **envp)
|
|||||||
void up_assert(const uint8_t *filename, int line)
|
void up_assert(const uint8_t *filename, int line)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Assertion failed at file:%s line: %d\n", filename, 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);
|
longjmp(sim_abort, 1);
|
||||||
}
|
}
|
||||||
|
@ -299,5 +299,10 @@ void up_assert(const uint8_t *filename, int lineno)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
up_dumpstate();
|
up_dumpstate();
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -181,5 +181,9 @@ void up_assert(void)
|
|||||||
(void)usbtrace_enumerate(assert_tracecallback, NULL);
|
(void)usbtrace_enumerate(assert_tracecallback, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -180,5 +180,9 @@ void up_assert(void)
|
|||||||
(void)usbtrace_enumerate(assert_tracecallback, NULL);
|
(void)usbtrace_enumerate(assert_tracecallback, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_CRASHDUMP
|
||||||
|
board_crashdump(up_getsp(), g_readytorun.head, filename, lineno);
|
||||||
|
#endif
|
||||||
|
|
||||||
_up_assert(EXIT_FAILURE);
|
_up_assert(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -1043,6 +1043,31 @@ config ARCH_BOARD_CUSTOM_DIR
|
|||||||
to some location outside of the NuttX source tree (like
|
to some location outside of the NuttX source tree (like
|
||||||
"~/projects/myboard").
|
"~/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
|
config BOARD_CUSTOM_LEDS
|
||||||
bool "Custom board LEDs"
|
bool "Custom board LEDs"
|
||||||
default n
|
default n
|
||||||
|
@ -291,4 +291,34 @@ uint8_t board_buttons(void);
|
|||||||
xcpt_t board_button_irq(int id, xcpt_t irqhandler);
|
xcpt_t board_button_irq(int id, xcpt_t irqhandler);
|
||||||
#endif
|
#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 */
|
#endif /* __INCLUDE_NUTTX_BOARD_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user