mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Add stack unwinding code for HardFault exception
This commit is contained in:
parent
bce35ca678
commit
ef6be8ab3c
@ -1,7 +1,11 @@
|
||||
#include "usbd_core.h"
|
||||
#include <stdio.h>
|
||||
#include <usbd_core.h>
|
||||
#include <stm32f4xx_exti.h>
|
||||
/* disable optimization for this file */
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("O0")
|
||||
#define UNUSED(x) x __attribute__((unused))
|
||||
#define BREAK() __asm__ volatile ("BKPT");
|
||||
|
||||
extern USB_OTG_CORE_HANDLE USB_OTG_Core;
|
||||
extern uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
|
||||
|
||||
@ -15,14 +19,44 @@ void NMI_Handler(void)
|
||||
BREAK();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles Hard Fault exception.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
|
||||
{
|
||||
UNUSED(volatile uint32_t r0);
|
||||
UNUSED(volatile uint32_t r1);
|
||||
UNUSED(volatile uint32_t r2);
|
||||
UNUSED(volatile uint32_t r3);
|
||||
UNUSED(volatile uint32_t r12);
|
||||
UNUSED(volatile uint32_t lr); /* Link register. */
|
||||
UNUSED(volatile uint32_t pc); /* Program counter. */
|
||||
UNUSED(volatile uint32_t psr);/* Program status register. */
|
||||
|
||||
r0 = pulFaultStackAddress[ 0 ];
|
||||
r1 = pulFaultStackAddress[ 1 ];
|
||||
r2 = pulFaultStackAddress[ 2 ];
|
||||
r3 = pulFaultStackAddress[ 3 ];
|
||||
|
||||
r12 = pulFaultStackAddress[ 4 ];
|
||||
lr = pulFaultStackAddress[ 5 ];
|
||||
pc = pulFaultStackAddress[ 6 ];
|
||||
psr = pulFaultStackAddress[ 7 ];
|
||||
|
||||
BREAK();
|
||||
}
|
||||
|
||||
//static void HardFault_Handler( void ) __attribute__( ( naked ) );
|
||||
void HardFault_Handler(void)
|
||||
{
|
||||
BREAK();
|
||||
__asm volatile
|
||||
(
|
||||
" tst lr, #4 \n"
|
||||
" ite eq \n"
|
||||
" mrseq r0, msp \n"
|
||||
" mrsne r0, psp \n"
|
||||
" ldr r1, [r0, #24] \n"
|
||||
" ldr r2, handler2_address_const \n"
|
||||
" bx r2 \n"
|
||||
" handler2_address_const: .word prvGetRegistersFromStack \n"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -100,4 +134,4 @@ void OTG_FS_IRQHandler(void)
|
||||
{
|
||||
USBD_OTG_ISR_Handler (&USB_OTG_Core);
|
||||
}
|
||||
|
||||
#pragma GCC pop_options
|
||||
|
||||
Loading…
Reference in New Issue
Block a user