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>
|
#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");
|
#define BREAK() __asm__ volatile ("BKPT");
|
||||||
|
|
||||||
extern USB_OTG_CORE_HANDLE USB_OTG_Core;
|
extern USB_OTG_CORE_HANDLE USB_OTG_Core;
|
||||||
extern uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
|
extern uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev);
|
||||||
|
|
||||||
@ -15,14 +19,44 @@ void NMI_Handler(void)
|
|||||||
BREAK();
|
BREAK();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
|
||||||
* @brief This function handles Hard Fault exception.
|
{
|
||||||
* @param None
|
UNUSED(volatile uint32_t r0);
|
||||||
* @retval None
|
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)
|
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);
|
USBD_OTG_ISR_Handler (&USB_OTG_Core);
|
||||||
}
|
}
|
||||||
|
#pragma GCC pop_options
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user