Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° встраиваСмых систСм Π½Π° Π±Π°Π·Π΅ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² STM32 Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ спСциализированных инструмСнтов, ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… срСди Π½ΠΈΡ… являСтся компилятор ARM None EABI GCC. Π­Ρ‚ΠΎΡ‚ Π½Π°Π±ΠΎΡ€ инструмСнтов позволяСт Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° C/C++ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ARM Cortex-M, Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ Π² основС всСх ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² STM32. Однако Π΅Π³ΠΎ установка ΠΈ настройка часто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ вопросы Ρƒ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… β€” ΠΎΡ‚ Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ вСрсии Π΄ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с IDE Ρ‚ΠΈΠΏΠ° STM32CubeIDE ΠΈΠ»ΠΈ VS Code.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·ΠΎΠ²ΡƒΡŽ установку, Π½ΠΎ ΠΈ Π½ΡŽΠ°Π½ΡΡ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ STM32 (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, STM32F103 ΠΈΠ»ΠΈ STM32H743), рассмотрим Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с HardFault ΠΈΠ·-Π·Π° Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ² компиляции. Если Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с сообщСниями Π²Ρ€ΠΎΠ΄Π΅ undefined reference to `_sbrk' ΠΈΠ»ΠΈ region `RAM' overflowed β€” здСсь Π²Ρ‹ Π½Π°ΠΉΠ΄Ρ‘Ρ‚Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ARM None EABI GCC ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½ для STM32

ARM None EABI GCC β€” это вСрсия компилятора GCC, адаптированная для встраиваСмых систСм Π½Π° Π±Π°Π·Π΅ процСссоров ARM Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы (ΠΎΡ‚ΡΡŽΠ΄Π° None Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ). АббрСвиатура EABI (Embedded Application Binary Interface) ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° стандарт взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ. Для STM32 этот инструмСнт ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ:

  • πŸ”Ή Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ядСр Cortex-M0/M3/M4/M7, учитывая ΠΈΡ… особСнности (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ FPU Π² Cortex-M4/M7).
  • πŸ”Ή ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ спСцифичныС для STM32 Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ DSP-инструкции ΠΈΠ»ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ ускоритСли (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, CRC Π² STM32F4).
  • πŸ”Ή Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ (ld) с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ для ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ², Π³Π΄Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° FLASH ΠΈ RAM с Тёсткими ограничСниями.
  • πŸ”Ή БовмСстим с ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΌΠΈ инструмСнтами (OpenOCD, ST-Link) ΠΈ популярными IDE.

Π‘Π΅Π· этого компилятора Π²Ρ‹ Π½Π΅ смоТСтС ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ для STM32 ΠΈΠ· исходников β€” Π΄Π°ΠΆΠ΅ Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ STM32CubeMX для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°. НапримСр, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ для STM32F103C8T6 ("Blue Pill") ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ указания ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΡƒΠ»Ρ‡Π΅ΠΉΠ½Π° (arm-none-eabi-gcc) Π² настройках сборки.

πŸ“Š Какой ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ STM32 Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅?
  • STM32F1 (Cortex-M3)
  • STM32F4 (Cortex-M4)
  • STM32H7 (Cortex-M7)
  • STM32L (Π½ΠΈΠ·ΠΊΠΎΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‰ΠΈΠ΅)
  • Π”Ρ€ΡƒΠ³ΠΎΠΉ

Установка ARM None EABI GCC: пошаговая инструкция

ΠŸΡ€ΠΎΡ†Π΅ΡΡ установки зависит ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Π½ΠΎ общая схСма ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Π°: ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ прСдсборСнный ΠΏΠ°ΠΊΠ΅Ρ‚, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² PATH, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ. НиТС инструкции для Windows, Linux ΠΈ macOS.

Для Windows

Π‘Π°ΠΌΡ‹ΠΉ простой способ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ дистрибутив ΠΎΡ‚ ARM ΠΈΠ»ΠΈ сборку ΠΎΡ‚ xPacks:

  1. Π‘ΠΊΠ°Ρ‡Π°ΠΉΡ‚Π΅ Π°Ρ€Ρ…ΠΈΠ² с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, gcc-arm-none-eabi-10.3-2021.10-win32.zip).
  2. РаспакуйтС Π² ΠΏΠ°ΠΏΠΊΡƒ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, C:\arm-gcc\).
  3. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ bin Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния PATH:
C:\arm-gcc\bin

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ установку ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

arm-none-eabi-gcc --version

Для Linux (Ubuntu/Debian)

МоТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€, Π½ΠΎ вСрсии Ρ‚Π°ΠΌ часто ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅. Π›ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ скрипт:

wget https://developer.arm.com/-/media/Files/downloads/gnu/10.3-2021.10/binrel/gcc-arm-10.3-2021.10-x86_64-arm-none-eabi.tar.xz

tar -xf gcc-arm-10.3-2021.10-x86_64-arm-none-eabi.tar.xz -C /opt/

export PATH="/opt/gcc-arm-10.3-2021.10-x86_64-arm-none-eabi/bin:$PATH"

ЗапуститС ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку|Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ arm-none-eabi-gcc --version|Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ вСрсия Π½Π΅ Π½ΠΈΠΆΠ΅ 9.3|ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ arm-none-eabi-ld ΠΈ arm-none-eabi-objcopy

-->

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ STM32CubeIDE, Π½Π΅ устанавливайтС компилятор Π² ΠΏΡƒΡ‚ΡŒ с ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Program Files). Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкам сборки Ρ‚ΠΈΠΏΠ° cannot find -lgcc.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ компилятора для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² STM32

Π”Π°ΠΆΠ΅ послС установки ARM None EABI GCC трСбуСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ настройка Ρ„Π»Π°Π³ΠΎΠ² компиляции ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°. Ошибки здСсь ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ Π½Π΅Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ΅ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ памяти. Рассмотрим ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Π€Π»Π°Π³ΠΈ компиляции (-mcpu, -mthumb, -O)

Для STM32 ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ:

  • πŸ”§ -mcpu=cortex-m4 β€” Ρ†Π΅Π»Π΅Π²ΠΎΠ΅ ядро (Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° cortex-m0, cortex-m7 ΠΈ Ρ‚.Π΄.).
  • πŸ”§ -mthumb β€” использованиС Π½Π°Π±ΠΎΡ€Π° инструкций Thumb (экономит ΠΏΠ°ΠΌΡΡ‚ΡŒ).
  • πŸ”§ -O2 ΠΈΠ»ΠΈ -Os β€” оптимизация ΠΏΠΎ скорости ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ (для STM32F1 с ΠΌΠ°Π»Ρ‹ΠΌ FLASH Π»ΡƒΡ‡ΡˆΠ΅ -Os).
  • πŸ”§ -mfpu=fpv4-sp-d16 β€” ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° FPU (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Cortex-M4/M7).
  • πŸ”§ -mfloat-abi=hard β€” использованиС Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ.

Π€Π°ΠΉΠ» Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ° (.ld)

Π›ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚Ρƒ памяти вашСго STM32. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ для STM32F407VG (256KB FLASH, 128KB RAM):

MEMORY

{

FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K

RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K

}

Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ссли Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² .ld Ρ„Π°ΠΉΠ»Π΅?

Если ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ мСньший Ρ€Π°Π·ΠΌΠ΅Ρ€ FLASH, Ρ‡Π΅ΠΌ трСбуСтся, Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ memory region overflowed. Если ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ больший β€” ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² сосСдних сСкторах (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Ρ‚Π΅Ρ€Π΅Ρ‚ΡŒ Option Bytes). Для STM32H7 с DTCM ΠΈ ITCM трСбуСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ описаниС этих Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ².

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠŸΡ€ΠΈ использовании FreeRTOS ΠΈΠ»ΠΈ STM32 HAL ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π² .ld Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ мСсто ΠΏΠΎΠ΄ стСк ΠΈ ΠΊΡƒΡ‡Ρƒ (_estack, _Min_Heap_Size). Π˜Π½Π°Ρ‡Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ HardFault ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ памяти.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с STM32CubeIDE ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ срСдами

STM32CubeIDE ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ встроСнный компилятор, Π½ΠΎ Π΅Π³ΠΎ вСрсия ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ свой ARM None EABI GCC:

  1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Project Properties β†’ C/C++ Build β†’ Settings β†’ Tool Settings.
  2. Π’ ΠΏΠΎΠ»Π΅ Toolchain path ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ компилятору (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, C:\arm-gcc\bin).
  3. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Command для Compiler, Assembler ΠΈ Linker, Π·Π°ΠΌΠ΅Π½ΠΈΠ² прСфикс Π½Π° arm-none-eabi-.

Для VS Code с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ Cortex-Debug настройтС tasks.json:

{

"version": "2.0.0",

"tasks": [

{

"label": "Build STM32",

"type": "shell",

"command": "arm-none-eabi-gcc",

"args": [

"-mcpu=cortex-m4",

"-mthumb",

"-O2",

"-o", "output.elf",

"main.c"

]

}

]

}

πŸ’‘

Если STM32CubeIDE Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ компилятор, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²Π° доступа ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ с Ρ‚ΡƒΠ»Ρ‡Π΅ΠΉΠ½ΠΎΠΌ. На Linux ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ chmod +x для всСх Ρ„Π°ΠΉΠ»ΠΎΠ² Π² /opt/gcc-arm-....

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π”Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ARM None EABI GCC. Рассмотрим самыС частыС:

Ошибка ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° РСшСниС
undefined reference to `_sbrk' ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ рСализация динамичСского выдСлСния памяти Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ syscalls.c ΠΈΠ· STM32Cube ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΊΡƒΡ‡Ρƒ (-specs=nano.specs)
region `RAM' overflowed Π‘Ρ‚Π΅ΠΊ ΠΈΠ»ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ RAM Π£Π²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ Stack_Size Π² .ld ΠΈΠ»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄
HardFault ΠΏΡ€ΠΈ стартС НСвСрный Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ .ld ΠΈ startup_*.s, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ STM32CubeMonitor для диагностики
floating point ABI mismatch НСсовпадСниС Ρ„Π»Π°Π³ΠΎΠ² -mfloat-abi ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ всС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ Ρ„Π»Π°Π³Π°ΠΌΠΈ hard/softfp

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ ошибка: Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ STM32H7 с D-Cache, Π½ΠΎ Π·Π°Π±Ρ‹Π»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ -mfpu=fpv5-d16, ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€ΠΈ опСрациях с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, хотя компиляция ΠΏΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚ Π±Π΅Π· ошибок.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠ΄Π° для STM32

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ компилятора ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Π½Π° 20-30% ΠΈΠ»ΠΈ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… участков. НСсколько Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ:

  • ⚑ Для STM32F1 (ΠΌΠ°Π»ΠΎ FLASH): ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ -Os -flto (оптимизация ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ + Link-Time Optimization).
  • ⚑ Для STM32H7 (высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ): -O3 -funroll-loops -mfpu=fpv5-d16.
  • ⚑ ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ части стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ: -nostdlib -nostartfiles (Ссли ΠΏΠΈΡˆΠ΅Ρ‚Π΅ свой startup).
  • ⚑ Для FreeRTOS: ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ с -fdata-sections -ffunction-sections ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ --gc-sections ΠΏΡ€ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄ для сборки ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ:

arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -O2 -flto -mfpu=fpv4-sp-d16 -mfloat-abi=hard \

-Tstm32f4xx.ld -Wl,--gc-sections -o firmware.elf main.c drivers/*.c

πŸ’‘

ИспользованиС -flto ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ врСмя компиляции, Π½ΠΎ сокращаСт Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Π½Π° 10-15%. Однако для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ этот Ρ„Π»Π°Π³ (-fno-lto), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ услоТняСт трассировку ΠΊΠΎΠ΄Π°.

ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GDB ΠΈ OpenOCD

ПослС компиляции ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Π΅Ρ‘ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡˆΠΈΡ‚ΡŒ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ GDB + OpenOCD + ST-Link. Базовая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄:

  1. ЗапуститС OpenOCD с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ для вашСй ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ‹:
    openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
  2. Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ запуститС GDB:
    arm-none-eabi-gdb firmware.elf
    

    (gdb) target remote :3333

    (gdb) load

    (gdb) continue

Для удобства ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ это Π² VS Code Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Cortex-Debug ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ STM32CubeIDE с встроСнным ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ.

Как ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ HardFault?

Если ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π² HardFault, Π² GDB Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅:

(gdb) break HardFault_Handler

(gdb) continue

(gdb) backtrace

Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ сбоя. Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ рСгистры HFSR, CFSR ΠΈ MMFAR для диагностики ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, доступ ΠΊ Π½Π΅Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½ΠΎΠΉ памяти ΠΈΠ»ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ноль).

FAQ: ЧастыС вопросы ΠΏΠΎ ARM None EABI GCC ΠΈ STM32

МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ARM None EABI GCC для STM8?

НСт, ARM None EABI GCC ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ARM Cortex. Для STM8 (8-Π±ΠΈΡ‚Π½ΠΎΠ΅ ядро) Π½ΡƒΠΆΠ΅Π½ компилятор SDCC ΠΈΠ»ΠΈ IAR for STM8.

Как ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ компилятора ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ STM32CubeIDE ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ?

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Project Properties β†’ C/C++ Build β†’ Settings β†’ Toolchain. ВСрсия ΡƒΠΊΠ°Π·Π°Π½Π° Π² ΠΏΠΎΠ»Π΅ Toolchain version. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ компилятору Π² Toolchain path.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈ компиляции появляСтся ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ warning: implicit declaration of function 'HAL_Delay'?

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ с объявлСниСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ:

  • Π’ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ #include "stm32f4xx_hal.h" (ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ для вашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ).
  • ΠŸΡƒΡ‚ΡŒ ΠΊ STM32 HAL Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² Include Paths (-I Ρ„Π»Π°Π³).
Как ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ для STM32F103 (64KB FLASH)?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Ρ„Π»Π°Π³ΠΎΠ²:

-Os -flto -ffunction-sections -fdata-sections -Wl,--gc-sections

Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ HAL (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, HAL_I2C, Ссли Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ I2C).

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли arm-none-eabi-gdb Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ OpenOCD?

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅:

  • Π—Π°ΠΏΡƒΡ‰Π΅Π½ Π»ΠΈ OpenOCD (ps aux | grep openocd).
  • ΠŸΠΎΡ€Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ :3333).
  • ΠŸΡ€Π°Π²Π° доступа ΠΊ ST-Link (Π½Π° Linux ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ udev).