IAR 用于调试的HardFault异常处理

用于调试的hardfault

在编写STM32程序代码时由于自己的粗心会发现有时候程序跑着跑着就进入了

HardFault_Handler中断,按照经验来说进入HardFault_Handler故障的原因主要有两个方面:

1:内存溢出或则访问越界。

2:堆栈溢出。

发生异常后我们可以首先查看LR寄存器的值,确认当前使用的堆栈是MSP还是PSP,然后找到相对应的堆栈指针,并在内存中查看相对应堆栈的内容,内核将R0~R3,R12,LR,PC,XPRS寄存器依次入栈,其中LR即为发生异常前PC将要执行的下一条指令地址。

/******************************************************************************/
/*            Cortex-M4 Processor Interruption and Exception Handlers         */ 
/******************************************************************************/
void hard_fault_handler_c( unsigned int* hardfault_args )
{
    unsigned char svc_num;
    unsigned int stacked_r0;
    unsigned int stacked_r1;
    unsigned int stacked_r2;
    unsigned int stacked_r3;
    unsigned int stacked_r12;
    unsigned int stacked_lr;
    unsigned int stacked_pc;
    unsigned int stacked_psr;

    stacked_r0 = ( ( unsigned long )hardfault_args[0] );
    stacked_r1 = ( ( unsigned long )hardfault_args[1] );
    stacked_r2 = ( ( unsigned long )hardfault_args[2] );
    stacked_r3 = ( ( unsigned long )hardfault_args[3] );

    stacked_r12 = ( ( unsigned long )hardfault_args[4] );
    stacked_lr = ( ( unsigned long )hardfault_args[5] );
    stacked_pc = ( ( unsigned long )hardfault_args[6] );
    stacked_psr = ( ( unsigned long ) hardfault_args[7] );

    svc_num = ( ( char* )stacked_r0 )[-2];


    /******************* Add yourdebug trace here ***********************/
    hardfault_args[0] = stacked_r0 + stacked_r1;

    printf("r0: %x\r\n", stacked_r0);
    ......

    while(1)
    {
    }
}

#if   defined ( __ICCARM__ )
void HardFault_Handler( void )
{
    __ASM("TST lr, #4\n");

    __ASM("ITE EQ\n"

    "MRSEQ r0, MSP\n"

    "MRSNE r0, PSP\n");

    __ASM("MOV r1, LR\n");

    __ASM("B hard_fault_handler_c");
}
#else   //#if defined ( __CC_ARM )

注意上边汇编哪里

IAR Embedded Workbench for ARM version 7.30 (and earlier) accepted constructions like:

[...]
__ASM("ITE EQ");
__ASM("MRSEQ R0, MSP");
__ASM("MRSNE R0, PSP");
[...]

The above is a bug which is corrected in IAR Embedded Workbench for ARM version 7.40.1.

The code above will generate diagnostic messages like:

Error[Ta117]: IT-block ends prematurely, or there is a label within the IT-block
Discussion
The construction above is unsafe, as in-between the asm()-statements it was possible to place ordinary C source code.

Suggested rewrite
Change the construction into a single inline assebler statement, with multiple lines.

The above construction should be rewritten to:

[…]
__ASM(“ITE EQ \n”
“MRSEQ R0, MSP \n”
“MRSNE R0, PSP”);
[…]

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要排查iar中的hardfault_handler,可以按照以下步骤进行: 首先,检查代码中是否存在任何引起硬件故障的问题。这可能包括访问无效的内存地址,或者在非法的寄存器状态下执行指令。可以通过仔细检查代码,确保所有指针和数组访问都是有效和合法的来排除这些问题。还应该检查是否有任何可能导致硬件故障的意外操作,如意外中断或异常的触发。 其次,可以通过使用iar提供的调试工具来进一步排查。可以使用iar调试器功能,逐步执行代码并观察其行为,以确定在哪一步出现了hardfault。可以观察寄存器的状态,查看是否存在非法的值或异常情况。还可以使用iar提供的堆栈跟踪功能,查看hardfault发生前的函数调用堆栈,以确定可能的原因。 另外,可以查看iar提供的编译器和链接器的日志,以查找任何与硬件故障相关的警告或错误信息。这些日志可能会提示一些潜在的问题,如内存分配错误或不匹配的函数调用。 最后,可以参考iar的文档和用户手册,查找关于hardfault_handler的相关信息。iar可能会有一些特定的设置或配置选项,用于处理硬件故障。可以在文档中查找这些信息,并进行相应的设置和配置。 综上所述,通过仔细检查代码、使用iar调试工具、查看编译器和链接器的日志,并参考iar的文档,可以有效地排查iar中的hardfault_handler问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhxlx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值