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

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

Пн янв 06, 2020 13:14:06

bevice, чушь-то какая! Вы что, пишете идеальный код без косяков? Да пока очередная правка доживет до стадии коммита, промежуточных сборок и тысяча может быть! Да и отладка туда же...

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

Пн янв 06, 2020 14:15:07

bevice, чушь-то какая! Вы что, пишете идеальный код без косяков? Да пока очередная правка доживет до стадии коммита, промежуточных сборок и тысяча может быть! Да и отладка туда же...

Чего? каждая правка по определению это коммит. Коммит в продакшен ветку по-определению идеальный, полностью рабочий и оттестированный. Если вы не умеете в VCS не распространяйте свою практику на всех.

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

Пн янв 06, 2020 16:23:28

bevice, вот, скажем, сделал я одну правку: 200 вставок и 50 удалений. И что, оно прямо вот так с лету заработает? Да хренушки!!! Сначала - тестовые сборки c -Wall -Wextra -Werror, чтобы ошибки увидеть. Потом - тестовая прошивка и отладка на МК. И лишь после этого — коммит!

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

Пн янв 06, 2020 16:42:49

bevice, вот, скажем, сделал я одну правку: 200 вставок и 50 удалений. И что, оно прямо вот так с лету заработает? Да хренушки!!! Сначала - тестовые сборки c -Wall -Wextra -Werror, чтобы ошибки увидеть. Потом - тестовая прошивка и отладка на МК. И лишь после этого — коммит!


Вас кто-то заставляет коммитить сразу в продакшен ветку? Нет, делаете ветку с правкой, каждая атомарная правка не нарушающая логику - это отдельный коммит. Даже если он состоит из одной строки. Чтобы мерж-реквестов не было добавляйте в начало "WiP:", ну это так, совет.
Как закончили правку вливаете в тест, как оттестировали мержите в мастер (или как у вас называется), все что попало в прод-ветку - на 100% работает, на 100% проверено и права на мерж есть далеко не у всех.
А как попало в прод - там уже автосборщик все сделает и раскидает.
Или с вас за ветки денег берут? Так в гите они бесплатные совсем, чай не CSV и не SVN. Хоть тысячами плодите.
И да, ключи компиляции тоже можно в ветках автоматически менять, если вы уж -Wall отключаете. И на тестовый стенд можно автоматом заливать, и до стенда можно юнит-тесты прогнать. Уже 21й век, а вы в 80х годах застряли

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

Пн янв 06, 2020 17:10:00

bevice, это - идиотизм, каждую элементарную правку как коммит оформлять. Люди так не делают!
И ветки я не завожу. Ветки нужны, лишь если хочется разные варианты потестить. У меня такого не бывает. Все коммиты идут исключительно в мастер. И вообще, гитхаб я использую только как хранилище кода. Раньше с тем же успехом тарболлы по датам делал.

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

Пн янв 06, 2020 18:41:22

bevice, это - идиотизм, каждую элементарную правку как коммит оформлять. Люди так не делают!
И ветки я не завожу. Ветки нужны, лишь если хочется разные варианты потестить. У меня такого не бывает. Все коммиты идут исключительно в мастер. И вообще, гитхаб я использую только как хранилище кода. Раньше с тем же успехом тарболлы по датам делал.

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

Впрочем, можете хоть виноаром раз в неделю паковать, раз вам так нравится и удобно. Но ради б-га, не учите плохому людей. А то потом переучивать приходится.

И вообще, гитхаб я использую только как хранилище кода. Раньше с тем же успехом тарболлы по датам делал.

Так может не стоит тогда рассказывать, как по-вашему правильно делать? Вы в данном вопросе не сильно компетентны.

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

Пн янв 06, 2020 19:21:59

bevice писал(а):Выбирайтесь из каменного века. Люди так делают
Думаете любители для которых МК это хобби (особенно начинающие) поступают как вы пишите? :facepalm: :)))

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

Пн янв 06, 2020 19:45:06

bevice писал(а):Выбирайтесь из каменного века. Люди так делают
Думаете любители для которых МК это хобби (особенно начинающие) поступают как вы пишите? :facepalm: :)))

Можно штаны через голову надевать, и аргументировать тем, что "я не фотомодель, нафиг такие сложности".
Какая разница хобби или нет? Для начинающих это тем более важно -- сразу начинать делать правильно. Если хотите научиться использовать git по-настоящему, посмотрите скринкаст Ильи Кантора с Javascript.ru, там все очень, очень подробно разобрано.
И давайте закончит этот спор. "Сам не умею и другим не советую, потому что сам не умею" -- очень паршивая аргументация

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

Пн янв 06, 2020 20:34:21

bevice писал(а):Можно штаны через голову надевать
С точки зрения большинства любителей именно так вы и поступаете. :dont_know:
Не путайте любительские проекты (которые на гит мало кто выкладывает, т. к. обычно пишут только для себя) и промышленного масштаба. :)
Вот объясните зачем любителю билд-сервер и другое перечисленное вами?

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

Пн янв 06, 2020 22:13:18

bevice писал(а):Можно штаны через голову надевать
С точки зрения большинства любителей именно так вы и поступаете. :dont_know:
Не путайте любительские проекты (которые на гит мало кто выкладывает, т. к. обычно пишут только для себя) и промышленного масштаба. :)
Вот объясните зачем любителю билд-сервер и другое перечисленное вами?

А зачем новичкам разбираться с ARM? Зачем писать программы для микроконтроллеров? Никто же не заставляет, и точно не требует.
Вы почему-то искренне считаете, что все новички клинические идиоты, что не могут разобраться с десятком ключей компиляции и пятью командами git. Ну если приучать с детства кликать галочки в кейле и копипастить код из примеров аки народстрим, то ничего хорошего не выйдет.
У ТС был вполне конкретный вопрос -
как должна быть составлена команда на компиляцию
вы сходу предложили забить на это и использовать IDE. Так зачем с такими советами сюда писать? Ходите с ними в тему, где спрашивают какую IDE выбрать для GCC, а если ответить на вопрос не можете и вам оно не интересно - так пролистайте мимо, не нужно новичкам навязывать то, что навязали вам.

BOND12, да, чтобы не голословить, вам и тут отвечу, жаль что из-за праздников возможно опоздал поучаствовать в этом цирке.

Ну, основной вопрос составляет то, как заставить компилятор вырабатывать объектные файлы под вариант архитектуры arm cortex m3, на которой построены данные микроконтроллеры. Сама компиляция осуществляется, если я ничего не напутал, командой arm-none-eabi-gcc.

Да, в целом это так, но не совсем. Я опущу тут и префикс arm-none-eabi-, чтобы меньше писанины было. Компиляция на языке C/C++ всегда состоит из трёх этапов:
1. Препроцессинг
2. Компиляция
3. Линковка.

Препроцессинг - это раскрытие макросов, #define #include и тому подобных. Никакой код при этом не компилируется, ничего не анализируется, просто, например вместо #include "header.h" вставляется (прямо как есть) файл header.h, а работы с макросами #define очень похожа на операцию "Найти и заменить" в блокноте или любом другом простейшем текстовом редакторе.

Компиляция - это преобразование всего исходного кода в машинные инструкции, но на данном этапе никакой работы с адресами не происходит. Вместо адресов переменных используются их имена, равно как вместо переходов и вызовов функций. Каждый файл компилируется отдельно, поэтому очень важно чтобы в каждый файл был включен заголовок с описанием всех используемых внешних функций и переменных. Поскольку компиляция происходит пофайлово - могут применяться разные языки программирования. gcc - это компилятор C, g++ для языка C++, as - для ассемблера. На выходе из компилятора всегда будет объектный файл.

Линковка - это сборка из скомпилированных (объектных) файлов готовой программы. Именно на этом этапе происходит связывание, раскладывание по адресам, выкидывание не нужного. Для работы линковщику передаются объектные файлы и правила построения исполняемого файла. Эти правила обычно называются скриптом линковки. Там указывается сколько памяти у контроллера и её адреса, куда положить код, куда данные. Ничего сложного, но почему-то у большинства вызывает полнейший ступор. А уж с нуля написать могут полтора человека.

На выходе после линковки получится исполняемый файл в формате ELF, там кроме самой прошивки еще куча-куча всего лежит, даже исходные тексты могут быть, при желании. Этот исполняемый файл можно передать в отладчик (GDB) и он может запустить-остановить-прошагать программу на микроконтроллере. А вот для того чтобы получить hex или bin файл еще потребуется воспользоваться командой objcopy которая из ELF может вытащить только то, что требуется микроконтроллеру.

Поэтому для сборки прошивки потребуется как минимум исходник на каком-то языке программирования (C/C++/ASM) и скрипт линковки. Поскольку никакой операционной системы на микроконтроллерах нет, еще потребуется кое-какая инициализация, для кода C это немного поработать с предварительно инициализированными переменными. Обычно это делается в startup-файле. Который обычно же пишется на ассемблере, и в нем тоже никто ничего не понимает (даже ST, да в кубе долгое время был косяк с двойным вызовом SystemInit()) - короче этот файлик многими считается обязательным и кочует из проекта в проект из форума в форум. При загрузке микроконтроллер выполняет код, который прописан в этом startup-файле и в конце переходит в функцию main() которую уже и пишет программист. Переходит не сам по себе, а в соответствии с инструкцией в стартапе.

Далее, для упрощения жизни gcc после компиляции по-умолчанию вызывает линковщик, для того чтобы он этого не делал есть специальный ключ. Но вы его не указали, поэтому линковщик был вызван без скрипта линковки. Он ничего не знал про ваш контроллер, про память, про стек итп. Поэтому споткнулся о первую операцию выделения стека. Это первая ошибка.
Вторая -
Please select first the target STM32F10x device
- заголовки CMSIS требуют опередения семейства процессора, например STM32F103xB. Проще всего это сделать через ключ компиляции -D (gcc -DSTM32F103xB ...)
Ну и последняя ошибка. startup_stm32f10x_cl.s - это файл на ассемблере, а вы его скармливали компилятору языка C на что он ругался.

В общем и упрощенном виде компиляция будет выглядеть примерно так:
Код:
arm-none-eabi-gcc -c -g -Wall -mcpu=cortex-m3 -mthumb -o main.o  main.c
arm-none-eabi-ld -g -Tscript.ld -o main.elf main.o
arm-none-eabi-objcopy -Obinary main.elf main.bin


ключи компиляции gcc:
-с - не вызывать линковщик, только компилировать
-g - добавить отладочную информацию
-Wall - включить все предупреждения
-mcpu=cortex-m3 -mthumb - компилировать для процессора cortex-m3 и использовать набор инструкций thumb
-o main.o - выходной файл называть main.o
main.c - компилировать файл main.c


Линковка (ld):
-g - то же самое, добавить отладочную информацию
-Tscript.ld - использовать правила линковки в файле script.ld
-o main.elf - записать полученное в файл main.elf
main.o - (тут используется один, но должны быть все необходимые ранее откомпилированные файлы) - объектные файлы программы, которую нужно компоновать.

objcopy, тут все просто
-Obinary - формат бинарный
main.elf - на вход
main.bin - выход.

Для того, чтобы не писать каждый раз руками все эти команды - придумали сборщики, вроде make.

Про скрипты линковки уже подробно писал, ссылка выше. Если плохо разобрано - спрашивайте, попробую изложить понятнее.

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

Пн янв 06, 2020 22:46:06

bevice, ты маешься откровенной херней. Кончай уже.

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

Пн янв 06, 2020 23:04:04

bevice, ты маешься откровенной херней. Кончай уже.

Слушайте, вы вот вроде бы обсерватории работаете, если не ошибаюсь. Я вот прослушал кучу научпопа от С.Попова и компании, давайте я вас теперь учить буду вашу работу делать? А то вы там фигнёй занимаетесь, похоже.
Вот так это выглядит.

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

Пн янв 06, 2020 23:56:20

bevice писал(а):А зачем новичкам разбираться с ARM?
Хотите сказать что вы изначально знали все о МК с ядром ARM и никогда не изучали их (т. е. не были новичком)? :)))

bevice писал(а):Зачем писать программы для микроконтроллеров? Никто же не заставляет, и точно не требует.
По вашему для того чтобы писать программы обязательно нужен билд-сервер? :)))

bevice писал(а):Вы почему-то искренне считаете, что все новички клинические идиоты, что не могут разобраться с десятком ключей компиляции и пятью командами git.
Многим это нужно? Обычно эти знания могут понадобится при появлении опыта, а не в начале обучения.

bevice писал(а):У ТС был вполне конкретный вопрос
ТС спрашивал про билд-сервер и гит? Тогда зачем вы о них писали? Он просил об этом?

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

Вт янв 07, 2020 11:37:25

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

У нас каждый второй-третий пишет себе софт для обработки изображений. Зачастую софт очень даже сложный.
Угадайте, сколько моих коллег знают о VCS и используют их? Подозреваю, что кроме меня VCS только еще один человек использует.
Вывод прост: незачем молиться на VCS, даже без этих git diff можно посмотреть разницу при помощи классического diff'а. А коммиты сохранять в новых тарболлах, как это делалось 20-30 лет назад.

Ветки нужны только в двух случаях: 1) хочется попробовать какие-то новые фичи, не внедряя их пока в main, 2) разработка ведется группой лиц, каждая группа пилит свое, а чтобы не мешать друг другу, делают это в ветках.

Ну, а делать коммит на исправление одной строчки будет разве что олух какой... (кроме ситуации, когда эта правка избавляет от значительного бага). Коммиты обычно делают в конце рабочего дня или в конце рабочей недели. Редко чаще. И, соответственно, один коммит обычно содержит сотни, если не тысячи, правок!
Советую по гитхабу посмотреть чужой код. Полезно.

P.S. Я достаточно много профессиональных программистов встречал. И никто из них не заморачивался с билд-серверами!
Билд-сервер нужен лишь если человек работает над чем-то очень жирным и громоздким: скажем, кривую библиотеку Qt разрабатывает, или дебильный KDE, ну или еще какую-нибудь жиробасину (возможно, разработчики прошивки для игровых приставок пользуются билд-сервером, не знаю, я далек от вантузятников).

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

Сб июн 27, 2020 10:08:31

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

Добрай день.
Хотел было создать новую тему типа "STM32 быстрый старт с нуля для чайников", но решил не плодить темы, может кто здесь подскажет.
В общем ситуация такaя - я не специалист по микроконтроллерам и не электронщик, но один раз потребовалась сделать устройство под себя (считайте что-то типа "умного дома" - управление нагревателями и вентиляторами через твердотельные реле). Ранее я что-то читал про АVR, поэтому купил для этого пару плат типа Arduino_Nano на али (заодно купил на али пару плат STM32 на всякий случай и китайский ST-Link V2). В общем погуглил, нашел как настроить Eclipse для AVR, написал программу, прошил (через LPT и разъем ISP), в общем с AVR сначала без проблем все получилось. Но потребовалось внести в программу небольшие изменения и я второпях запорол обе AVR платы (может Fuse неправильно прошил, может еще что-то, даже не понял как так вышло), короче теперь AVR не откликаются. Остались только платки с STM32. Опять погуглил как настроить Eclipse для STM32, нашел кучу инструкций от разных авторов по настройке Eclipse для STM32, но что-то как то на мой взгляд нет всех подробностей как с AVR (один например, в своей инструкции по настройке Eclipse для stm32 написал "Jlink - Всё как обычно.", вот и думай что тут делать, на всякий случай нагуглил как китайский ST-Link прошить в Jlink )
Короче я как обезьяна повторил вроде все как по инструкции (например по этой https://habr.com/ru/post/325450/), создаю новый проект (пустой), делаю "Build Project" и получаю ошибку:
Invoking: GNU ARM Cross C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -Wall -Wextra -g -DNDEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/stm32f1-stdperiph/misc.d" -MT"system/src/stm32f1-stdperiph/misc.o" -c -o "system/src/stm32f1-stdperiph/misc.o" "../system/src/stm32f1-stdperiph/misc.c"
c:/gnu mcu eclipse/bin//sh: arm-none-eabi-gcc: not found
make: *** [system/src/stm32f1-stdperiph/subdir.mk:26: system/src/stm32f1-stdperiph/misc.o] Error 127

Подскажите что я упустил, не установил или может не настроил, что еще сделать чтобы в Eclipse написать простейший проект наверно без всяких CubeMX (типа просто помигать светодиодом) и автоматом прошить через ST-Link/Jlink

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

Сб июн 27, 2020 12:22:52

Не проще использовать готовую настроенную IDE?
Все работает из коробки. Компилятор отладчик, библиотеки в дистрибутиве и при создании проекта не нужно ничего искать, подключать, настраивать.
Посмотрите. http://purebasic.mybb.ru/viewtopic.php?id=575
http://purebasic.mybb.ru/viewtopic.php?id=564

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

Сб мар 13, 2021 13:37:46

Все работает из коробки.


Добрый день.
Хотел было создать новую тему, но решил не плодить темы, может кто здесь подскажет.

есть STM32F103C8T6 Core Board по простому Blue pill.
Есть проект под нее написанный в Atollic TrueSTUDIO(R) 9.0.0

есть желание сделать несколько ревизий железа в которых разный функционал на одних и тех же ногах.
При этом так как используются аппаратные особенности процессора требуется настраивать разные прерывания на одно и то же действие. И разные таймера на ШИМ. Как итог в большом количестве файлов приходится прописывать текст вида.

#ifdef Jelezo1
//набор операторов 1
#endif

#ifdef Jelezo2
//набор операторов 2
#endif

#ifdef Jelezo3
//набор операторов 3
#endif

Случаем никто не знает как все вставки оптимизировать и локализовать в 1 файле?
Что бы не навредить быстродействию?

если свернуть в функцию, то её вызов съест время.

Как сделать криво я кажется знаю
- идти через макросы. собрать в один файл, а по месту прописать имя собственное.
Меня в личной беседе напугали, что макросы не всегда адекватно пережовываются IDE
как обстоят дела в Atollic TrueSTUDIO я не знаю.
- или же через файловые вставки, получим много файлов в одной папке. но папку можно сменить.

Как сделать правильно?

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

Сб мар 13, 2021 15:22:04

Хотел было создать новую тему, но решил не плодить темы
С вас что - за это деньги берут (за создание новой темы)?
Так как вопрос совершенно никак не связанный с данной темой -> надо создать отдельную.

Случаем никто не знает как все вставки оптимизировать и локализовать в 1 файле?
Зачем? И что такое "оптимизировать"? Количество букв в исходнике?

Что бы не навредить быстродействию?
Опять-же - быстродействие чего? Компиляции? Лучше обновить комп в этом случае.
А к быстродействию выполнения кода, условная компиляция не имеет никакого отношения. :dont_know:

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

Сб мар 13, 2021 17:56:42

А к быстродействию выполнения кода, условная компиляция не имеет никакого отношения. :dont_know:


Ну как же Компиляция под STM32 с помощью gcc кода из ардуино AVR.

Так как вопрос совершенно никак не связанный с данной темой -> надо создать отдельную.


Тема - Компиляция под STM32 с помощью gcc
А по факту тут собрались знающие люди, которые рассказывают читателям как НАДО писать правильно.
вот я скромно и решил узнать у ВЕЛИКИХ ГУРУ как же это ПРАВИЛЬНО написать.

Зачем? И что такое "оптимизировать"? Количество букв в исходнике?


по факту - да количество букв.

физически
1) количество строк добавляемых в текст
2) не потерять часть из них по куче файлов.

Иногда приходится сталкиваться с (извините полит корректно не сказать) кодом который писали не совсем опытные программисты. И у них по факту получилось скопипастить громадный проект основанный на ногодрыге АВР, вместо приделывания вывода в DMA STM....

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

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

то очень желательно не иметь монструозных, многострочных конструкций, иначе тотел сбивается в сравнении...

Повторяю вопрос:

С макросами ARM GCC (eclipse) дружит?
какие подводные камни при компиляции кода с макросами под STM32 с помощью ARM GCC (eclipse)?

Если не выйдет, то в добавок напишу тулзу, которая все файлы исходника проверит и по флагам в коментах вырежерт лишний код между двумя флагами в коментах - автоматом, и уже в таком виде сравнивать тотелом и вносить свежие правки насочиненные разработчиками оригинала ...
Последний раз редактировалось Cat346 Сб мар 13, 2021 18:17:48, всего редактировалось 1 раз.

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

Сб мар 13, 2021 18:10:48

Да легко там все макросами делается. Но таки я бы посоветовал переписать с нуля. Это быстрей будет.
Сам периодически пытался найти готовый код под всякие задачи. Потом понял, что это невозможно. И стал просто сразу писать свое. С нуля. Безо всех этих калокубов, opencm3 и т.п.
Ответить