我在創建具有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編寫程序集。
謝謝
爲什麼它被聲明爲'static'?如果你刪除它會怎麼樣?也許內聯程序集被解釋爲一個不同的翻譯單元。 –
爲什麼編譯器會爲靜態函數導出一個符號,儘可能地說它是完全不用的?它甚至可能完全將其優化。像inline asm這樣的流程控制不是你應該a)期望的工作,並且b)永遠不要做。沒有理由不用C來編寫控制邏輯;您最多隻有3條指令可能需要asm語句才能將合適的特殊寄存器轉換爲C變量(如果您沒有合適的內部函數)。 – Notlikethat
查看您的地圖文件並查看生成的符號。幾乎可以肯定'靜態'導致該函數不具有全局符號(或者全局符號) –