LINUX.ORG.RU
ФорумTalks

mcu-info-util

 ,


6

2

Как уже я здесь немного говорил, я разрабатываю архиполезную (на мой взгляд) утилиту mcu-info-util. Она OpenSource, написана на Python и нативно работает под Linux.

Данная утилита нужна только тем, кто занимается разработкой прошивок для микроконтроллеров. Если вы этим не занимаетесь в качестве работы или хобби, то вам данный проект интересен не будет. mcu-info-util умеет следующее:

  • Находить компиляторы avr-gcc и arm-none-eabi (актуально для Windows, утилита ищет в реестре некоторые ключи, которые туда пишут установщики соответствующих тулчайнов, также производится поиск в PATH, для Linux только поиск PATH).
  • Подсказывать ключи, которые нужно передать компилятору и линковщику, чтобы успешно скомпилировать проект под целевой микроконтроллер (и если для AVR это всего лишь -mmcu=..., то для ARM всевозможные указания версии cortex, наличия модуля аппаратной математики и т. д.).
  • Генерировать скрипт линковки для ARM. Больше не нужно писать свой скрипт или искать готовый - достаточно названия микроконтроллера (например, STM32F103C8T6) и утилита создаст подходящий скрипт линковки.
  • Генерировать заголовочный файл с описанием регистров периферии выбранного микроконтроллера (в настоящий момент только для ARM, используется информация из файлов SVD, включённых в комплект поставки). Не нужно при использовании libopencm3 или CMSIS, но никто и не заставляет использовать.

Например, мы хотим собрать прошивку под микроконтроллер STM32F103C8T6:

$ mcu-info-util --mcu stm32f103c8t6 --find-compiler
/usr/bin/arm-none-eabi-gcc
$ mcu-info-util --mcu stm32f103c8t6 --print-flags
-D_ROM=65536 -D_RAM=20480 -D_ROM_OFF=0x08000000 -D_RAM_OFF=0x20000000 -mcpu=cortex-m3 -mthumb -DSTM32F1 -msoft-float
$ mcu-info-util --mcu stm32f103c8t6 --linker-script script.ld
$ mcu-info-util --mcu stm32f103c8t6 --header mcudefs.h

Разумеется, было бы разумно использовать mcu-info-util не самостоятельно, а внутри скриптов сборки. На этот случай я приготовил пару примеров - для make и для cmake в каталоге misc репозитория проекта.

Таким образом Makefile проекта может выглядеть как-то так (разумеется, проект будет поддерживать инкрементальную компиляцию с отслеживанием зависимостей исходных файлов) - https://github.com/KivApple/mcu-info-util/blob/master/misc/makefile-project/M...

А проект CMake как-то так - https://github.com/KivApple/mcu-info-util/blob/master/misc/cmake-project/CMak....

Выбор используемого микроконтроллера осуществляется всего лишь одной переменной - MCU. Скрипты произведут серию обращений к mcu-info-util, в итоге будет найден (если установлен) необходимый компилятор, флаги компиляции и при необходимости сгенерирован скрипт линковщика и заголовочный файл с описаниями регистров.

Согласитесь, это гораздо удобнее хардкода размеров ОЗУ и ПЗУ, путей к компилятору (в настройках IDE) и т. д. Функционал подобного уровня (выбор МК по названию и автонастройка проекта под него) предоставляют лишь коммерческие IDE, а моё решение не имеет каких-либо привязок. Вы можете использовать в своём проекте любые библиотеки (скажем, подключить исходники какой-нибудь RTOS), писать код в любой IDE (нужна лишь поддержка Makefile или CMake, либо возможность скриптовать систему сборки и прямые руки), данная утилита лишь берёт на себя необходимую рутину по выбору необходимого компилятора и флагов компиляции без которых проект банально не заработает.

В настоящий момент имеется поддержка только микроконтроллеров STM32 и AVR (также теоретически может нормально заработать для ARM от Atmel).

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

★★★★★
Ответ на: комментарий от dima3351

В том то и дело, что он есть только в проприретарных коммерческих IDE заточенных под конкретные микроконтроллеры. Нельзя просто так взять и использовать любую удобную IDE для C/C++. К тому же под разные микроконтроллеры нужны разные IDE (сомневаюсь, что Atmel Studio может работать с МК не от Atmel), хотя казалось бы язык программирования один и тот же.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Да, но например для меня главным плюсом IDE от разработчиков микроконтроллеров является поддержка отладчика, подключил JTAG, нажал кнопочку и дебагаешь себе всласть

dima3351
()
Ответ на: комментарий от dima3351

К тому же этих специализированных IDE под Linux банально нет, в отличии от IDE для C/C++ общего назначения.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от dima3351

Я STM32 дебажил средствами CLion. Запускаю st-util при подключенном stlink - получается GDB сервер. К нему можно подключиться любой IDE, которая умеет удалённую отладку. При этом всё будет работать (главное чтобы IDE умела) - точки останова, вычисление выражений, просмотр содержимого регистров. Разумеется, надо поставить arm-none-eabi-gdb и выбрать его в IDE, ибо отладка идёт через него.

Отладкой AVR не занимался, потому что у меня нет подходящего программатора/отладчика (через USBASP вроде как нельзя). Но скорее всего ситуация будет примерно такая же (во всяком случае пакет avr-gdb я в репозиториях вижу). Главное чтобы была утилита работы с программатором, играющая роль gdb-сервера.

Кстати, если использовать файл mcudefs.h, сгенерированный mcu-info-util, то у нас будет куча глобальных volatile структур, представляющих собой все регистры периферии, которые можно смотреть отладчиком точно также как и другие глобальные переменные.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от ncrmnt

Мои скрипты не привязаны к каким-либо библиотекам или системам сборки (файлы для cmake и make - просто примеры интеграции), их можно использовать в любом контексте.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от bender

Если расскажешь, как с ними работать (какой компилятор и какие опции могут быть нужны), то добавлю (просто не работал с ними).

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

вот конфиг для плат семейства ChipKIT (они на PIC32) для ардуины, можно попробовать почистить от ардуиноспецифической фигни

https://github.com/chipKIT32/chipKIT-core/blob/6cbbc9b511c20ebafd7511ad15f10e...

пример сформированной строки компилятора (из среды разработки)

«/home/benderamp/.arduino15/packages/chipKIT/tools/pic32-tools/4.8.3-pic32gcc/bin/pic32-gcc» -c -g -O2 -w -DARDUINO_ARCH_PIC32 -mno-smart-io -ffunction-sections -fdata-sections -mdebugger -Wcast-align -fno-short-double -ftoplevel-reorder -MMD -std=gnu11 -mprocessor=32MX320F128H -DF_CPU=80000000L -DARDUINO=10609 -D_BOARD_UNO_ -DMPIDEVER=16777998 -DMPIDE=150 -DIDE=Arduino -G1024 -I/tmp/build0f05a4d52fdf5a63940aca6493fe104b.tmp/sketch "-I/home/benderamp/.arduino15/packages/chipKIT/hardware/pic32/1.2.1/cores/pic32" "-I/home/benderamp/.arduino15/packages/chipKIT/hardware/pic32/1.2.1/variants/Uno32" «/tmp/build0f05a4d52fdf5a63940aca6493fe104b.tmp/sketch/test.c» -o «/tmp/build0f05a4d52fdf5a63940aca6493fe104b.tmp/sketch/test.c.o»

бинарники можно скачать плагином к Arduino IDE http://chipkit.net/wiki/index.php?title=ChipKIT_core

потом выбрать плату, например, ChipKIT Uno32 (на PIC32MX) или ChipKIT WiFire (на PIC32MZ), потом в настройках поставить галку «Показать подробный вывод: Компиляция», потом скомпилять дефолтный блинк - все компиляторы и прочие утилиты повылезают со всеми ключами в нижнем окошке.

короче, вот полный выхлоп для WiFire http://pastebin.com/Y7ceWMhx вот для Uno32 http://pastebin.com/ma21iuPJ (может они и не отличаются даже)

bender ★★★★★
()
Ответ на: комментарий от bender

Предполагаю, что ключевой опцией компилятора является -mprocessor=32MX320F128H (прямо как -mmcu=atmega8), а остальные - адаптация для ардуиновских библиотек (всякие define'ы). Также немного опций оптимизации. Какие из них платформозависимы и обязательны для работы - я не знаю, ибо с пиками не работал.

Так же не совсем понимаю, откуда взять компилятор кроме как из поставки плагина для ардуины.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

так, вот чипкитовские компиляторы для PIC32:

https://github.com/chipKIT32/chipKIT-cxx-build https://github.com/chipKIT32/chipKIT-cxx

еще есть коммерческие компиляторы Microchip MPLAB XC (мне почему-то казалось, что они тоже основаны на gcc, но на их странице упоминаний gcc не вижу): http://www.microchip.com/mplab/compilers

вот еще какой-то старый пост про отличия этих компиляторов: http://dangerousprototypes.com/blog/2011/05/31/chipkit-pic32-compiler-qa/

bender ★★★★★
()
Последнее исправление: bender (всего исправлений: 1)

Будет поддержка других компиляторов, архитектур и микроконтроллеров?
Например, восьмибитные AVR, PIC, 8051 (STC в частности)...

CYB3R ★★★★★
()
Ответ на: комментарий от CYB3R

Так как раз восьмибитные AVR и поддерживаются. Вообще, проблема в том, что для этого надо хоть немного понимать процесс сборки под целевую архитектуру, а я работал только с STM32, MSP430 и 8-битными AVR.

Таким образом мне требуется либо полная инструкция по сборке (где найти компилятор, какие флаги НЕОБХОДИМЫ), либо готовый патч.

С компилятором sdcc вроде проблем нет - он есть в репозитории, он есть под винду. А с вышеупомянутым pic32 проблема - откуда должен браться компилятор. Загрузка и компиляция из исходников пока не входит в рамки моей утилиты.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Если есть желание, то можешь присоединиться к проекту и помочь с добавлением поддержки архитектур. Просто я не вижу смысла добавлять поддержку компилятора «для галочки», так что всё равно флаги неюзабельны будут. Сейчас я немного привожу код проекта в порядок, чтобы добавлять архитектуры стало удобно, а ещё можно было использовать mcu_info_util как библиотеку в других проектах.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)

Похоже на годноту, дотащусь до дому, до хаты, посмотрю :-)

Pentium02 ★★
()
Ответ на: комментарий от KivApple

Я только не понял, а база данных со всеми микроконтроллерами где? Нашёл devices.data, но там только STM32.

CYB3R ★★★★★
()
Ответ на: комментарий от CYB3R

Там не только STM32, а вообще много разных ARM.

Вообще, поведение для разных семейств МК задаётся непосредственно кодом (слишком уж разное поведение требуется). Я сейчас как раз отрефакторил эту часть и теперь каждое семейство задаётся классом унаследованным от Toolchain (см. файлы toolchain_XXX.py).

Для MSP430 и AVR всё просто и банально - единственный необходимый параметр это -mmcu=XXX. Там никакой базы нет (точнее она есть, но непосредственно в компиляторе). Скрипты линкера и заголовочные файлы генерироваться не будут.

Для ARM ситуация сложнее. Параметры компиляции берутся из devices.data, скрипт линковки генерируется на основании этих данных тоже, а заголовочный файл на основании коллекции SVD (я сегодня выпилил собственную базу SVD и теперь использую пакет cmsis_svd, который прописан в зависимостях моего проекта в setup.py).

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от KivApple

А с вышеупомянутым pic32 проблема - откуда должен браться компилятор. Загрузка и компиляция из исходников пока не входит в рамки моей утилиты.

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

Ардуиновскую версию искать особо не нужно - у нее стандартное место (правда, номер версии в конце может меняться):

$HOME/.arduino15/packages/chipKIT/tools/pic32-tools/4.8.3-pic32gcc/bin/

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

Я, кстати, раньше пользовался скриптом, который собирал прошивки ардуиновским компилятором и шил их на плуту ардуиновской прошивалкой из консоли без использования их среды, пускал примеры на C++ с нормальной main (без setup/loop) и на асме. До нормального консольного тулчейна не хватало только возможности использовать нормальный программатор с отладкой - для него все равно приходится пускать MPLAB.

bender ★★★★★
()

Выложил свой проект на PyPI: https://pypi.python.org/pypi/mcu-info-util/0.2. Таким образом теперь можно установить его командой pip install mcu-info-util, а также указывать в качестве зависимостей к своим проектам в setup.py.

Кстати, теперь моя утилита может использоваться не только как самодостаточное приложение, но и в качестве библиотеки. Простейший пример:

from mcu_info_util.toolchain import Toolchain
toolchain = Toolchain.find_toolchain("atmega8")
print(toolchain.find_compiler())
KivApple ★★★★★
() автор топика
17 декабря 2016 г.
Ответ на: комментарий от KivApple

KivApple, спасибо за полезную утилиту. Есть ли смысл добавить в сгенерированный файл

mcu-info-util --mcu stm32f103c8t6 --linker-script script.ld 
строку
__estack = 0x20005000;
??

М.б. возможна генерация полезных векторов (адресов) для тек, кто пишет на ассемблере? Например так

mcu-info-util --mcu stm32f103c8t6 --header mcudefs.asm.h
.equ STACKINIT,         0x20020000      @ адрес вершины стека
....................................... @ регистр XXX - Timer 1
....................................... @ регистр XXX - Timer 2
и т.д.

morkovkin
()
Ответ на: комментарий от morkovkin

Стек на микроконтроллерах ARM (а только для них в настоящий момент mcu-info-util генерирует скрипты линоквки) растёт вниз. Как следствие, символ _stack (который уже создаётся) указывает именно на его вершину, которая является по сути дела концом ОЗУ. Чёткого его начала (или конца, как посмотреть) не существует. Вот кончились статические данные (символ _ebss) и пошла динамическая память (куча). А на динамическую память сверху надвигается стек. В случае его переполнения стек налезет на динамическую память и всё сломается. Но откуда я знаю какая максимальная глубина рекурсии и насколько большая куча ему нужна? Это уже не мои проблемы.

Чисто технически прошивка может делать всякие проверки внутри malloc, а также каким-то образом контролировать переполнение стека (возможно, можно как-то заставить МК в этом случае сгенерировать прерывание, ещё можно вставить проверку по все прологи прерываний), однако это уже задача тех, кто пишет прошивку. mcu-info-util не занимается написанием исходного кода за программиста. Она максимум сгенерирует набор define с адресами регистров.

KivApple ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.