Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Компиляция под STM32 с помощью gcc

Ср янв 01, 2020 18:34:16

Ну, основной вопрос составляет то, как заставить компилятор вырабатывать объектные файлы под вариант архитектуры arm cortex m3, на которой построены данные микроконтроллеры. Сама компиляция осуществляется, если я ничего не напутал, командой arm-none-eabi-gcc. Почитав интернет, наткнулся на статью, где её автор писал про данную компиляцию. Проблема его статьи была в том, что в самой статье команд на компиляцию он не привёл, а отвёл роль изучения данных команд на приложенный к статье makefile, который скачать было нельзя, а из той-же самой статьи следовало то, что cortex m3 это упрощённая версия arm, в которой отсутствует как минимум 1 команда (там-же приведённая). Так вот, как должна быть составлена команда на компиляцию, чтобы компилятор выработал код, полностью совместимый с данной архитектурой? Так-же, заодно вопрос, как выработанный код преобразовать в файл .hex? Так-же, при попытке скомпилировать программу, подсунув ему нужные файлы из cmsis выдаёт следующие сообщения об ошибках:
core_cm3.c: In function 'uint32_t __get_PSP()':
core_cm3.c:445:12: error: cannot allocate stack for variable 'result', naked function.
uint32_t result=0;
^~~~~~
core_cm3.c: In function 'uint32_t __get_MSP()':
core_cm3.c:479:12: error: cannot allocate stack for variable 'result', naked function.
uint32_t result=0;
^~~~~~
In file included from system_stm32f10x.c:65:0:
stm32f10x.h:96:3: error: #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
#error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"


А при попытке подсунуть файл startup_stm32f10x_cl.s кучу сообщений такого рода:
startup_stm32f10x_cl.s:349: Error: bad instruction `else '


Как это можно исправить?
И, если знаете толковые материалы про использованию arm-gcc для stm32, подскажите, пожалуйста.

Re: Компиляция под STM32 с помощью gcc

Ср янв 01, 2020 19:29:54

Почему бы не использовать IDE с компилятором GCC?

Re: Компиляция под STM32 с помощью gcc

Ср янв 01, 2020 19:55:06

Кусочек из makefile'а:
Код:
STARTUP = startup_armcm3.s
SRC = system_stm32f1xx.c main.c
# Указываем каталоги, в которых находятся *.h файлы от библиотек.
DEVICE = /media/Data/ARM/STM32CubeF1/STM32Cube_FW_F1_V1.2.0/Drivers/STM32F1xx_HAL_Driver
CORE = /media/Data/ARM/STM32CubeF1/STM32Cube_FW_F1_V1.2.0/Drivers/CMSIS/Device/ST/STM32F1xx/Include
CMSIS = /media/Data/ARM/STM32CubeF1/STM32Cube_FW_F1_V1.2.0/Drivers/CMSIS/Include/
PROJ = .

# Собираем каталоги в одну переменную вида -I<путь> -I<путь>
INCLUDES += -I$(DEVICE)/Inc \
         -I$(CORE) \
         -I$(CMSIS) \
         -I$(PROJ)

CC=arm-none-eabi-gcc
LD=arm-none-eabi-ld
CP=arm-none-eabi-objcopy

# Некоторые дефайны - нестандартная частота кварца, тип кристалла и заглушка для HAL драйвера (который работает БЕЗ остальной части нормально).
DEFS = -DSTM32F103xB -DHSE_VALUE=12000000 -DUSE_HAL_DRIVER

LDSCRIPT = stm32f103cbt6_app.ld
OPTIMIZE = -Os
MCU = cortex-m3
MCFLAGS = -mcpu=$(MCU) -mthumb -mlittle-endian --specs=nosys.specs -ffunction-sections -fdata-sections -Wl,--gc-sections -nostartfiles

CFLAGS   = $(MCFLAGS) $(OPTIMIZE)  $(DEFS) $(INCLUDES) -g -gdwarf-2 -Wall -c
LDFLAGS   = $(MCFLAGS) -T$(LDSCRIPT)

OBJS := $(notdir $(SRC:.c=.o)) $(STARTUP:.s=.o)
BUILDS := $(addprefix $(BUILDDIR)/, $(OBJS))

%.o: %.c
   @echo "Compiling: $^"
   @$(CC) $(CFLAGS) $^ -o $(BUILDDIR)/$@
%.o: %.s
   @echo "Compiling: $^"
   @$(CC) $(CFLAGS) $^ -o $(BUILDDIR)/$@

$(TARGET): $(EXECUTABLE)
   @$(SIZE) $(EXECUTABLE)
   @$(CP) -O binary $< $@

$(EXECUTABLE): $(OBJS)
   @echo "Building: $(EXECUTABLE)"
   @$(CC) $(LDFLAGS) $(BUILDS) -o $(EXECUTABLE)
   @echo "[DONE]"

clean:
   rm -rf $(BUILDDIR)/*.elf $(BUILDDIR)/*.o $(BUILDDIR)/*.bin


В итоге, строка получается примерно такого вида:
Сборка *.o файла:
Код:
arm-none-eabi-gcc -mcpu=$(MCU) -mthumb -mlittle-endian --specs=nosys.specs -ffunction-sections -fdata-sections -Wl,--gc-sections -nostartfiles  -Os -DSTM32F103xB -DHSE_VALUE=12000000 -DUSE_HAL_DRIVER -I/media/Data/ARM/STM32CubeF1/STM32Cube_FW_F1_V1.2.0/Drivers/STM32F1xx_HAL_Driver -I/media/Data/ARM/STM32CubeF1/STM32Cube_FW_F1_V1.2.0/Drivers/CMSIS/Device/ST/STM32F1xx/Include -I/media/Data/ARM/STM32CubeF1/STM32Cube_FW_F1_V1.2.0/Drivers/CMSIS/Include/ -g -gdwarf-2 -Wall -c main.c -o main.o


Сборка ассемблерного файла (отличаются только имена файлов)
Код:
arm-none-eabi-gcc -mcpu=$(MCU) -mthumb -mlittle-endian --specs=nosys.specs -ffunction-sections -fdata-sections -Wl,--gc-sections -nostartfiles  -Os -DSTM32F103xB -DHSE_VALUE=12000000 -DUSE_HAL_DRIVER -I/media/Data/ARM/STM32CubeF1/STM32Cube_FW_F1_V1.2.0/Drivers/STM32F1xx_HAL_Driver -I/media/Data/ARM/STM32CubeF1/STM32Cube_FW_F1_V1.2.0/Drivers/CMSIS/Device/ST/STM32F1xx/Include -I/media/Data/ARM/STM32CubeF1/STM32Cube_FW_F1_V1.2.0/Drivers/CMSIS/Include/ -g -gdwarf-2 -Wall -c startup_armcm3.s -o startup_armcm3.o


Линковка:
Код:
arm-none-eabi-gcc  -mcpu=$(MCU) -mthumb -mlittle-endian --specs=nosys.specs -ffunction-sections -fdata-sections -Wl,--gc-sections -nostartfiles -Tstm32f103cbt6_app.ld <ВСЕ *.o файлы> -o <some_app.elf>

Бинарник:
Код:
arm-none-eabi-objcopy -O binary <some_app.elf> <some_app.hex>


P.S.: Это работает в linux'е. Win* система потребует всё правильно переименовать. Ну и пути, естественно.

А вообще, если нужно именно собирать вручную - рекомендую озаботиться сборкой шаблона в виде Makefile'а.

Re: Компиляция под STM32 с помощью gcc

Ср янв 01, 2020 20:19:12

Советую в Makefile добавить после цели all еще такое:
Код:
debug: CFLAGS += -DEBUG -Werror
debug: all

В итоге для отладки не надо долго мучиться, а достаточно написать make debug. Можно вообще удалить цель all и сделать по умолчанию вывод подсказки, запилив две цели: debug и release. Но мне проще так.
Ну и да, мало ли, куда вы положите arm-none-eabi? Скажем, у меня в генте проблема с "коробочным" gcc под arm: он пытается запустить аппаратное деление на STM32F0, поэтому я пишу:
Код:
PREFIX      ?= /opt/bin/arm-none-eabi

И в Makefile можно для F1 либо переписать путь, либо make вызвать с измененной опцией PREFIX.
P.S. Крайне не рекомендую пользоваться калом.

Re: Компиляция под STM32 с помощью gcc

Чт янв 02, 2020 10:13:49

P.S. Крайне не рекомендую пользоваться калом.


Мне нужны были от него заголовочники. А без дефайна они не подключались в тот момент. А может дефайн остался случайно. Но вот их *.c файлы я стараюсь не использовать.

Re: Компиляция под STM32 с помощью gcc

Чт янв 02, 2020 22:58:18

А можете пояснить, что должно лежать по путям DEVICE, CORE и CMSIS? Структура каталогов STM32F10x_StdPeriph_Lib отличается от cubemx. Я так полагаю, CORE - core_cm3.h, CMSIS - stm32f10x.h и system_stm32f10x.h?
И ещё, как быть с файлами *.c лежащими по данным каталогам? Я так полагаю, они в принципе не обязательны, но нужны, если потребуются функции из заголовочных файлов, и, в принципе, их можно скомпилировать раз, оформить из них библиотеку и подсовывать компилятору уже её каждый раз, для простоты?
Мурик писал(а):Почему бы не использовать IDE с компилятором GCC?
Мне надо понять, как это работает. Дальше уже можно и IDE настроить соответствующим образом.

Re: Компиляция под STM32 с помощью gcc

Чт янв 02, 2020 23:32:53

BOND12 писал(а):
Мурик писал(а):Почему бы не использовать IDE с компилятором GCC?
Мне надо понять, как это работает. Дальше уже можно и IDE настроить соответствующим образом.
Все это не нужно знать при использовании IDE.
Посмотрите например этот материал. http://purebasic.mybb.ru/viewtopic.php?id=575
Рассматривается использование различных библиотек (SPL, HAL, LL и вовсе без библиотек) и ни разу не потребовалось знание того как производится компиляция.

Если нужна сборка без IDE выше написали как ее производить.

Re: Компиляция под STM32 с помощью gcc

Пт янв 03, 2020 22:33:37

Мурик писал(а):Все это не нужно знать при использовании IDE.

Проблема этих IDE в том, что они созданы под windows. Собственно, я и затеял разбор GCC с тем, чтобы слезть с кейла, который под виртуальной машиной гонял, т.к. на линукс его никто не портировал, а под wine он работал настолько криво, что использовать его по назначению возможным не представлялось.
Да и интересно мне, как это всё работает без IDE.

Кстати, мой вопрос про пути всё ещё в силе.

Re: Компиляция под STM32 с помощью gcc

Сб янв 04, 2020 10:11:06

тут для начала простейший пример "STM32F103RB a minimal example" для GCC
http://pandafruits.com/stm32_primer/stm ... inimal.php
без CMSIS, стартапа и прочих инклудов.
Затем можно сделать минимальный проект в кубе от ST - а он делает проект и для GCC, правда там хал получается прицеплен. Но хал легко из такого проекта выкашивается, зато остаются все цмисы и пр. самые свежие. В этом проекте несложный мейкфайл - для разбора и понимания и правки сгодится.
з.ы. Кейл под вайном нормально работает, настроить отладку даже вроде можно (не пробовал - мне не надо было). Надо Кейл установить на ПК с виндовс, потом просто скопировать папку себе в линукс и запускать экзешник - вайн запускает. Кейл вполне портабелен - запускал и v4 и v5, пользуюсь в основном v4 для поддержки старых проектов.

Re: Компиляция под STM32 с помощью gcc

Сб янв 04, 2020 11:58:00

oleg110592 писал(а):тут для начала простейший пример "STM32F103RB a minimal example" для GCC
http://pandafruits.com/stm32_primer/stm ... inimal.php

За это - спасибо.
oleg110592 писал(а):з.ы. Кейл под вайном нормально работает, настроить отладку даже вроде можно (не пробовал - мне не надо было). Надо Кейл установить на ПК с виндовс, потом просто скопировать папку себе в линукс и запускать экзешник - вайн запускает. Кейл вполне портабелен - запускал и v4 и v5, пользуюсь в основном v4 для поддержки старых проектов.

Ну, не знаю, как у других, а у меня в кейле при попытке создать проект - абсолютно пустое меню выбора устройства. Причём - что у установленного через wine, что у скопированного из windows.

Re: Компиляция под STM32 с помощью gcc

Сб янв 04, 2020 12:03:33

Проблема этих IDE в том, что они созданы под windows.

Тогда вообще непонятно, в чем проблема!
Я пользуюсь qt-creator, никаких косяков нет. В отличие от мазохистов-геймеров, в линуксе четкая иерархия файловой системы и нет проблем написать раз и навсегда Makefile и пользоваться им! По клавосочетанию можно запустить make, можно даже прошивать по клавосочетанию. А для любителей внутрисхемной отладки есть интеграция с gdb.

Re: Компиляция под STM32 с помощью gcc

Сб янв 04, 2020 12:27:00

абсолютно пустое меню выбора устройства

wine 5.0-rc2 из репозитория сам обновился, и на 4 версиях работало:
Изображение
з.ы. геймеры на линукс перебираются - "Proton - уже 4000 подобных Windows-игр, идеально доступных для игр под Linux". Vulkan API linux выдает больше FPS, чем на Windows 10

Re: Компиляция под STM32 с помощью gcc

Сб янв 04, 2020 14:52:05

А можете пояснить, что должно лежать по путям DEVICE, CORE и CMSIS? Структура каталогов STM32F10x_StdPeriph_Lib отличается от cubemx. Я так полагаю, CORE - core_cm3.h, CMSIS - stm32f10x.h и system_stm32f10x.h?

Не совсем. Всё это названия... грубо говоря, наборов файлов.
Изначально - какие-то заголовочные файлы Куба. А переименовывать было лень.
Чаще всего там находятся *.h файлы, которые требуются для сборки проекта.
Если хочется - можно свалить все эти файлы прямо в проект (копипастом, ага). Но после десятого-двадцатого каталога, занимающего по паре десятков мегабайт, становится стыдно перед собой же, и наконец в файле оказываются ссылки.

В общих чертах, gcc будет искать указания на файлы
#include <something.h>
в тех каталогах, которые будут указаны.

И ещё, как быть с файлами *.c лежащими по данным каталогам?

*.c, лично я, складываю в папку. Изредка требуется один-два хитрых .c и это тот случай, когда проще их скопировать. Тем более, что часто они платформо-зависимы (зависят от ядра и иногда даже конкретной модели контроллера).


Я так полагаю, они в принципе не обязательны, но нужны, если потребуются функции из заголовочных файлов, и, в принципе, их можно скомпилировать раз, оформить из них библиотеку и подсовывать компилятору уже её каждый раз, для простоты?

*.c файлы указываются в makefile'е явно. Смотрите директиву SRC = ...
Это все те файлы, которые в итоге будут участвовать в сборке и ТОЛЬКО те, которые в итоге будут переданы линковщику для окончательной сборки исполняемого файла.

Кстати, может посмотреть вот эту статью:
https://server.179.ru/tasks/cpp/total/105.html

Проблема этих IDE в том, что они созданы под windows. Собственно, я и затеял разбор GCC с тем, чтобы слезть с кейла, который под виртуальной машиной гонял, т.к. на линукс его никто не портировал, а под wine он работал настолько криво, что использовать его по назначению возможным не представлялось.
Да и интересно мне, как это всё работает без IDE.

Кстати, мой вопрос про пути всё ещё в силе.

И Вы хотите потоптаться по тем же граблям? Ну... могу только посочувствовать.

И... порекомендовать таки поставить Eclipse + OpenOCD + плагины + *.vxd файлы описания периферии... в общем, в итоге ЭТО будет работать лучше чем Keil. Повертье моим шишкам.
Даже почти удобно получится. Хотя имеет свою специфику.

Re: Компиляция под STM32 с помощью gcc

Сб янв 04, 2020 20:42:16

oleg110592 писал(а):
абсолютно пустое меню выбора устройства

wine 5.0-rc2 из репозитория сам обновился, и на 4 версиях работало:
Изображение

Изображение
:cry:

Re: Компиляция под STM32 с помощью gcc

Сб янв 04, 2020 21:26:11

по зеленой иконке это 5 Кейл. Установщик ставит только uVision и тулчейн. Библиотеки и примеры устанавливаются через Pack Installer - только то, что нужно. Если какого-то устройства в данный момент нет, можно установить Legacy Support для нужной серии. Когда то делал уже забыл. Все есть мануале
http://www.keil.com/support/man/docs/uv ... taller.htm

Re: Компиляция под STM32 с помощью gcc

Сб янв 04, 2020 22:06:13

oleg110592 писал(а):по зеленой иконке это 5 Кейл. Установщик ставит только uVision и тулчейн. Библиотеки и примеры устанавливаются через Pack Installer - только то, что нужно. Если какого-то устройства в данный момент нет, можно установить Legacy Support для нужной серии. Когда то делал уже забыл. Все есть мануале
http://www.keil.com/support/man/docs/uv ... taller.htm

Дело всё в том, что изначально он содержит как минимум просто arm архитектуры. Конкретно в этой версии уже были установлены пакеты для stm (взял с вирт. машины). Как видите - к использованию не пригоден.

Добавлено after 4 minutes 5 seconds:
Ладно, всем, кто отвечал - спасибо. Буду разбираться.

Re: Компиляция под STM32 с помощью gcc

Вс янв 05, 2020 23:55:47

Кстати, мой вопрос про пути всё ещё в силе.

Если еще актуальный вопрос, вот тут https://bevice.ru/posts/1590.html начал примерно его и разбирать. Пока фиг знает, как быстро и понятно про CMake написать, но компиляция и линковка разобраны.

Добавлено after 3 minutes 2 seconds:
Почему бы не использовать IDE с компилятором GCC?

А на билд-сервера тоже предлагаете IDE натягивать?

Re: Компиляция под STM32 с помощью gcc

Пн янв 06, 2020 00:45:05

Прошивку для stm32f103 на билдсерверах собирать. :facepalm:

Re: Компиляция под STM32 с помощью gcc

Пн янв 06, 2020 00:57:42

bevice писал(а):А на билд-сервера тоже предлагаете IDE натягивать?
Какой билд сервер если нет опыта работы с STM32 и GCC?

Re: Компиляция под STM32 с помощью gcc

Пн янв 06, 2020 10:39:19

bevice писал(а):А на билд-сервера тоже предлагаете IDE натягивать?
Какой билд сервер если нет опыта работы с STM32 и GCC?

кладем в проект .gitlab-ci.yml:
Код:
binaries-debug:
    image: bevice/gcc-arm-none-eabi
    tags:
        - arm-none-eabi-gcc
    script:
        - BUILD_DIR=${CI_PROJECT_NAME}-$(git log -1 --format=%h)-dbg
        - rm -rf ${BUILD_DIR}
        - mkdir ${BUILD_DIR}
        - cd ${BUILD_DIR}
        - cmake -DCMAKE_BUILD_TYPE=Debug ..
        - cmake --build . -- -j 8
        - git log -3 > changes.txt
    artifacts:
        name: "${CI_PROJECT_NAME}-$(git log -1 --format=%h)-dbg"
        paths:
            - ${CI_PROJECT_NAME}-$(git log -1 --format=%h)-dbg/*.bin
            - ${CI_PROJECT_NAME}-$(git log -1 --format=%h)-dbg/*.elf
            - ${CI_PROJECT_NAME}-$(git log -1 --format=%h)-dbg/changes.txt


коммитим на gitlab с подключенным gitlab-runner с докером. Всё. Ну скрипт сборки разве что подправить, у меня на CMake

Добавлено after 4 minutes 32 seconds:
Прошивку для stm32f103 на билдсерверах собирать. :facepalm:

Ну вот есть у меня проект, в котором требуется собрать несколько десятков почти одинаковых прошивок. Незначительно отличаются параметрами сборки и шифруются по серийному номеру. После сборки нужно отправить обновления в другой офис и зарегистрировать на сервере обновлений.
У меня это решает CI, и после коммита в соответствующую ветку все происходит само-собой.
А как вы эту задачку решите? Да, некоторые параметры сборки задаются в другом офисе, а серийные номера вообще на сборке.
Ответить