|
楼主 |
发表于 2021-10-23 05:46:07
|
显示全部楼层
本帖最后由 justdomyself 于 2021-10-23 12:01 编辑
下面是参照这个帖子弄得,帖子里面是M3的,不清楚M4是否适用:
https://blog.csdn.net/suny1234/article/details/89418980
HardFault_Handler\
PROC
EXPORT HardFault_Handler ;[WEAK]
IMPORT rt_hw_hard_fault_exception
TST lr, #0x04 ;;(1-1)
MRSNE r0, msp ;;(1-2)
MRSEQ r0, psp ;;(1-3)
STMFD r0!, {r4 - r11} ;;(2)
STMFD r0!, {lr} ;;(3)
MSRNE msp, r0 ;;(1-4)
MSREQ psp, r0 ;;(1-5)
PUSH {lr} ;;(4)
BL rt_hw_hard_fault_exception ;;(5)
POP {lr} ;;(6)
ORR lr, lr, #0x04 ;;(7)
BX lr ;;(8)
ENDP
ALIGN 4 ;;(9)
;B .
;ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
struct exception_stack
{
uint32_t r0;
uint32_t r1;
uint32_t r2;
uint32_t r3;
uint32_t r12;
uint32_t lr;
uint32_t pc;
uint32_t psr;//?????
};
struct stack_frame
{
uint32_t r4;
uint32_t r5;
uint32_t r6;
uint32_t r7;
uint32_t r8;
uint32_t r9;
uint32_t r10;
uint32_t r11;
struct exception_stack exception_stack_frame;
};
struct exception_info
{
uint32_t exc_return;
struct stack_frame stack_frame;
};
#define rt_kprintf segger_printk
/*
* fault exception handler
*/
void rt_hw_hard_fault_exception(struct exception_info * exception_info)
{
extern long list_thread(void);
/*??context???????????*/
struct stack_frame* context = &exception_info->stack_frame;
// /*???????????????????????,????????*/
// if (rt_exception_hook != RT_NULL)
// {
// rt_err_t result;
// result = rt_exception_hook(exception_info);
// if (result == RT_EOK)
// return;
// }
/*?????????*/
rt_kprintf("psr: 0x%08x\n", context->exception_stack_frame.psr);
/*??????????*/
rt_kprintf("r00: 0x%08x\n", context->exception_stack_frame.r0);
rt_kprintf("r01: 0x%08x\n", context->exception_stack_frame.r1);
rt_kprintf("r02: 0x%08x\n", context->exception_stack_frame.r2);
rt_kprintf("r03: 0x%08x\n", context->exception_stack_frame.r3);
rt_kprintf("r04: 0x%08x\n", context->r4);
rt_kprintf("r05: 0x%08x\n", context->r5);
rt_kprintf("r06: 0x%08x\n", context->r6);
rt_kprintf("r07: 0x%08x\n", context->r7);
rt_kprintf("r08: 0x%08x\n", context->r8);
rt_kprintf("r09: 0x%08x\n", context->r9);
rt_kprintf("r10: 0x%08x\n", context->r10);
rt_kprintf("r11: 0x%08x\n", context->r11);
rt_kprintf("r12: 0x%08x\n", context->exception_stack_frame.r12);
rt_kprintf(" lr: 0x%08x\n", context->exception_stack_frame.lr);
rt_kprintf(" pc: 0x%08x\n", context->exception_stack_frame.pc);
/*??EXC_RETURN[2] ?1????????????*/
if(exception_info->exc_return & (1 << 2) )
{
rt_kprintf("hard fault on thread:\r\n\r\n");
#ifdef RT_USING_FINSH
list_thread();/*??????*/
#endif /* RT_USING_FINSH */
}
else/*???handler??*/
{
rt_kprintf("hard fault on handler\r\n\r\n");
}
#ifdef RT_USING_FINSH
hard_fault_track();/*????*/
#endif /* RT_USING_FINSH */
while (1);
}
|
|