2015-10-09 38 views
0

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

(注:下面的代码已经从不同来源的资料在互联网上) 这是我到目前为止有:

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:\用户\史蒂芬\应用程序数据\本地的\ Temp \ ccuAgDyP.ltrans9.ltrans.o:在功能HardFault_Handler': <artificial>:(.text.HardFault_Handler+0x18): undefined reference to hard_fault_handler_c” collect2.exe:错误:LD返回1个退出状态 化妆:* ** [FruityMesh.elf]错误1 makefile:65:r ecipe for target'project.elf'失败

总之,它看起来像链接器无法找到hard_fault_handler_c函数的地址。我会认为我需要编写汇编来导入或包含此函数的路径,但这仅仅是我的建议。我一直无法为编译的M0编写程序集。

谢谢

+3

为什么它被声明为'static'?如果你删除它会怎么样?也许内联程序集被解释为一个不同的翻译单元。 –

+2

为什么编译器会为静态函数导出一个符号,尽可能地说它是完全不用的?它甚至可能完全将其优化。像inline asm这样的流程控制不是你应该a)期望的工作,并且b)永远不要做。没有理由不用C来编写控制逻辑;您最多只有3条指令可能需要asm语句才能将合适的特殊寄存器转换为C变量(如果您没有合适的内部函数)。 – Notlikethat

+0

查看您的地图文件并查看生成的符号。几乎可以肯定'静态'导致该函数不具有全局符号(或者全局符号) –

回答

0

我建议升级到NRF SDK,它加入了内置支持硬故障处理程序的version 11(见nRF5_SDK_11.0.0_89a8197 /组件/库/ hardfault)。