繁体   English   中英

硬故障处理-Arm Cortex-M0

[英]Hardfault handling - Arm Cortex-M0

我在为具有ARM CortexM0的NRF51创建硬故障处理程序时遇到了一些困难。

(注意:以下代码是从互联网上的不同来源合并而成的)到目前为止,这是我得到的:

    static void hard_fault_handler_c(unsigned int * hardfault_args)
{
    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]);

    for(;;);
}

void HardFault_Handler(void)
{
    asm volatile(  
        "movs r0, #4\t\n"  
        "mov  r1, lr\t\n"  
        "tst  r0, r1\t\n" /* Check EXC_RETURN[2] */  
        "beq 1f\t\n"  
        "mrs r0, psp\t\n"  
        "ldr r1,=hard_fault_handler_c\t\n"  
        "bx r1\t\n"  
        "1:mrs r0,msp\t\n"  
        "ldr r1,=hard_fault_handler_c\t\n"  
        : /* no output */  
        : /* no input */  
        : "r0" /* clobber */  
    );  
}

编译期间的错误如下:生成目标:project.elf调用:跨ARM C ++链接器C:\\ Users \\ Steven \\ AppData \\ Local \\ Temp \\ ccuAgDyP.ltrans9.ltrans.o:在函数HardFault_Handler': <artificial>:(.text.HardFault_Handler+0x18): undefined reference to hard_fault_handler_c'collect2.exe的引用:错误:ld返回1退出状态make:*** [FruityMesh.elf]错误1 makefile:65:目标'project.elf'的配方失败

总而言之,链接器似乎无法找到hard_fault_handler_c函数的地址。 我认为我需要编写汇编程序来导入或包含此函数的路径,但这只是我的建议。 我无法为编译后的M0编写程序集。

谢谢

我建议升级到NRF SDK 版本11 ,该版本增加了对硬故障处理程序的内置支持(请参阅nRF5_SDK_11.0.0_89a8197 / components / libraries / hardfault)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM