Обработка аппаратных сбоев - Arm Cortex-M0

У меня возникли трудности с созданием жесткого обработчика ошибок для NRF51 с ARM CortexM0.

(примечание: следующий код был объединен из разных источников в Интернете) Вот что у меня есть на данный момент:

    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 Вызов: Cross ARM C ++ Linker C: \ Users \ Steven \ AppData \ Local \ Temp \ ccuAgDyP.ltrans9.ltrans.o: В функции HardFault_Handler': <artificial>:(.text.HardFault_Handler+0x18): undefined reference tohard_fault_handler_c 'collect2.exe: error : ld возвратил 1 статус выхода make: *** [FruityMesh.elf] Ошибка 1 makefile: 65: не удалось выполнить рецепт для цели 'project.elf'

Таким образом, похоже, что компоновщик не может найти адрес для функции hard_fault_handler_c. Я бы подумал, что мне нужно написать сборку для импорта или включить путь к этой функции, но это всего лишь мое предложение. Мне не удалось написать сборку для M0, которая для этого компилируется.

Спасибо


person Beau R.    schedule 09.10.2015    source источник
comment
Почему он указан как static? Что если убрать? Возможно, встроенная сборка интерпретируется как другая единица перевода ..   -  person Eugene Sh.    schedule 09.10.2015
comment
Зачем компилятору экспортировать символ для статической функции, которая, насколько он может судить, полностью не используется? Возможно, он даже полностью его оптимизировал. Подобное управление потоком внутри встроенного asm - это не то, что вы должны: а) ожидать, что оно будет работать, и б) когда-либо будут. Нет веских причин не писать эту управляющую логику на языке C; у вас есть не более 3 инструкций, которым могут потребоваться инструкции asm для захвата соответствующего специального регистра в переменную C (если у вас нет подходящих встроенных функций).   -  person Notlikethat    schedule 09.10.2015
comment
Посмотрите на свой файл карты и посмотрите, какие символы генерируются. Почти наверняка "статика" заставляет эту функцию не иметь глобального символа (или искаженного глобального символа).   -  person Russ Schultz    schedule 12.10.2015


Ответы (1)


Я бы предложил обновить NRF SDK до версии 11, в которой поддержка жесткого обработчика сбоев (см. nRF5_SDK_11.0.0_89a8197 / components / libraries / hardfault).

person Nic Dahlquist    schedule 27.06.2016