STM32 Hardfault при вызове любой C -функции - PullRequest
2 голосов
/ 28 апреля 2020

Пытаясь узнать больше о чипах ARM, и после успешного мигания с использованием ассемблера я хочу смешать функции C и ассемблера. Однако любая C -функция, которую я вызываю, вызывает Hardfault. Я думаю, что упускаю что-то очевидное.

Я компилирую, используя g cc, и эти флаги

-c -g -ggdb -Wall --specs=nosys.specs

Я использую следующие библиотеки lib c .a libg cc .a при компоновке

-L/usr/local/gnu-arm/arm-none-eabi/lib/thumb/v7e-m+fp/softfp -lc -L/usr/local/gnu-arm/lib/gcc/arm-none-eabi/9.2.1/thumb/v7e-m+fp/softfp

В objdump вот где происходит сбой:

 80004d4:   d3fb        bcc.n   80004ce <FillZerobss>
 80004d6:   f7ff ff09   bl  80002ec <SystemInit>

Чип вызывает сбой при превышении abobe bl

Вот первые строки функции SystemInit

080002ec <SystemInit>:
80002ec:    e52db004    push    {fp}        ; (str fp, [sp, #-4]!)
80002f0:    e28db000    add fp, sp, #0, 0
80002f4:    e59f3014    ldr r3, [pc, #20]   ; 8000310 <SystemInit+0x24>
80002f8:    e3a02302    mov r2, #134217728  ; 0x8000000
80002fc:    e5832008    str r2, [r3, #8]
8000300:    e1a00000    nop         ; (mov r0, r0)

Вместо 080002e c я получаю:

08000298 <HardFault_Handler>

Я думаю, что упускаю что-то совершенно очевидное, но не вижу этого. Любая помощь или указатели будут оценены.

1 Ответ

0 голосов
/ 30 апреля 2020

Комментарии показывают, что вопрос может быть исправлен за это время. Этот ответ собирает дайджест полезных комментариев для краткого ответа на вопрос:

Идея (old_timer):

на основе некоторых подсказок, я думаю, вы работают на Cortex-M, который не может выполнять инструкции ARM только для большого пальца, и какие инструкции для большого пальца зависят от чипа и ядра.

Что это за чип / ядро?

OP (user13424266):

Спасибо всем за помощь и указание в правильном направлении. Я добавил -mthumb -mthumb-interwork к G CC, и теперь он работает как положено!

Подтверждение (Мартин Розенау):

@ fuz Я только что попробовал: Линкер GNU не заменяет bl на blx. Тем не менее, процессоры STM32 обычно имеют ядра Cortex-M, которые не поддерживают ни не-большой код, ни инструкцию blx.

...