2015-10-09 39 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)。