stmhal: On HardFault, print stack pointer and do a stack dump.
This commit is contained in:
parent
b7d27e31e8
commit
bffda45154
@ -74,6 +74,7 @@
|
||||
#include "pendsv.h"
|
||||
#include "irq.h"
|
||||
#include "pybthread.h"
|
||||
#include "gccollect.h"
|
||||
#include "extint.h"
|
||||
#include "timer.h"
|
||||
#include "uart.h"
|
||||
@ -81,6 +82,7 @@
|
||||
#include "can.h"
|
||||
#include "dma.h"
|
||||
#include "i2c.h"
|
||||
#include "usb.h"
|
||||
|
||||
extern void __fatal_error(const char*);
|
||||
extern PCD_HandleTypeDef pcd_fs_handle;
|
||||
@ -123,6 +125,15 @@ STATIC void print_reg(const char *label, uint32_t val) {
|
||||
mp_hal_stdout_tx_str("\r\n");
|
||||
}
|
||||
|
||||
STATIC void print_hex_hex(const char *label, uint32_t val1, uint32_t val2) {
|
||||
char hex_str[9];
|
||||
mp_hal_stdout_tx_str(label);
|
||||
mp_hal_stdout_tx_str(fmt_hex(val1, hex_str));
|
||||
mp_hal_stdout_tx_str(" ");
|
||||
mp_hal_stdout_tx_str(fmt_hex(val2, hex_str));
|
||||
mp_hal_stdout_tx_str("\r\n");
|
||||
}
|
||||
|
||||
// The ARMv7M Architecture manual (section B.1.5.6) says that upon entry
|
||||
// to an exception, that the registers will be in the following order on the
|
||||
// // stack: R0, R1, R2, R3, R12, LR, PC, XPSR
|
||||
@ -132,11 +143,18 @@ typedef struct {
|
||||
} ExceptionRegisters_t;
|
||||
|
||||
void HardFault_C_Handler(ExceptionRegisters_t *regs) {
|
||||
// We need to disable the USB so it doesn't try to write data out on
|
||||
// the VCP and then block indefinitely waiting for the buffer to drain.
|
||||
pyb_usb_flags = 0;
|
||||
|
||||
mp_hal_stdout_tx_str("HardFault\r\n");
|
||||
|
||||
print_reg("R0 ", regs->r0);
|
||||
print_reg("R1 ", regs->r1);
|
||||
print_reg("R2 ", regs->r2);
|
||||
print_reg("R3 ", regs->r3);
|
||||
print_reg("R12 ", regs->r12);
|
||||
print_reg("SP ", (uint32_t)regs);
|
||||
print_reg("LR ", regs->lr);
|
||||
print_reg("PC ", regs->pc);
|
||||
print_reg("XPSR ", regs->xpsr);
|
||||
@ -151,6 +169,19 @@ void HardFault_C_Handler(ExceptionRegisters_t *regs) {
|
||||
if (cfsr & 0x8000) {
|
||||
print_reg("BFAR ", SCB->BFAR);
|
||||
}
|
||||
|
||||
if ((void*)&_ram_start <= (void*)regs && (void*)regs < (void*)&_ram_end) {
|
||||
mp_hal_stdout_tx_str("Stack:\r\n");
|
||||
uint32_t *stack_top = &_estack;
|
||||
if ((void*)regs < (void*)&_heap_end) {
|
||||
// stack not in static stack area so limit the amount we print
|
||||
stack_top = (uint32_t*)regs + 32;
|
||||
}
|
||||
for (uint32_t *sp = (uint32_t*)regs; sp < stack_top; ++sp) {
|
||||
print_hex_hex(" ", (uint32_t)sp, *sp);
|
||||
}
|
||||
}
|
||||
|
||||
/* Go to infinite loop when Hard Fault exception occurs */
|
||||
while (1) {
|
||||
__fatal_error("HardFault");
|
||||
|
Loading…
x
Reference in New Issue
Block a user