LINUX.ORG.RU

STM32 + Emacs. Убираем костыли

 , ,


5

2

Доброго вечерка!

Ещё с давних пор я смирился с тем фактом, что хардварная разработка будет проходить на винде. Eagle и Keil не оставляли меня в покое.

Чуть более года назад я перешёл на kiCad, чем был чрезвычайно доволен! Просто невероятно крутая ЕДА и удобная. Теперь ещё меньше времени стал проводить в винде...

Но keil так и не хотел уходить. А на фоне эклипса (SW4STM32) keil выглядел прямо таки великолепно. И, к огромному сожалению, работать в своём емаксике было совсем не удобно - библиотеки HAL просто гигантские, а юзать Stm32CubeMX и переписывать Мэйкфайл после каждого действия было бы мазохизмом. Ещё одной проблемой была отладка и загрузка прошивок.

Но всё встало на свои места через некоторое время после поисков. Сначала нашёл опенсорсный st-link (на то время он был кривоват), а потом и скрипт для генерации мэйкфайла по проекту STM32CubeMX.

https://github.com/baoshi/CubeMX2Makefile

https://github.com/texane/stlink

Сделал тестовый проектик. И ОНО СКОМПИЛЛИРОВАЛОСЬ! Я был щастлев. Но прошивка на STM32F4xx не удалась =с Только сработало с STM32F103. Но всё-равно.

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

И решил я прицепить это к емаксу. И получилось отлично! Но не так идеально, как я хотел... время поджимало, поэтому вышли костыли.

Я использовал EDE проекты для автокомплита, компиляции и дебага. И в идеале хотел сделать для ЕДЕ тэмплейт, чтобы всё было автоматизировано, но пока есть только костыли.

Мне оч нравится lisp, но нет времени и задач для его изучения, поэтому код может быть ужасным. Но он работает ^^

Итак мой костыль для stm32 в емаксе: https://github.com/SL-RU/stm32-emacs

  1. нужно установить CEDET и https://github.com/texane/stlink
  2. клонируем https://github.com/SL-RU/stm32-emacs и делаем git submodule update --init
  3. в init.el
    (load-file (concat user-emacs-directory "/stm32/stm32.el"))
    (require 'stm32)
    ;;По желанию
    (stm32-load-all-projects)
    (global-semantic-idle-scheduler-mode 1)
    
  4. создаём проект в CubeMx и генерируем его для SW4STM32
  5. M-x stm32-new-project RET *select CubeMX project path*
  6. stm32-run-st-util для запуска st-util
  7. stm32-start-gdb для запуска gdb
  8. (gdb) load для загрузки прошивки
  9. stm32-generate-makefile для перерегенерации мэйкфайла и тд после изменений в кубМх и тд

И оно роботаит. О том как загружать прошивку стоит почитать в доках st-util.

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

★★★★

4. создаём проект в CubeMx и генерируем его для SW4STM32

Судя по этому пункту, вы по-прежнему делаете всё это под виндой?

Beewek ★★
()

нужно установить CEDET

Он же ж в актуальных версиях Emacs из коробки идёт.

(load-file (concat user-emacs-directory "/stm32/stm32.el"))
(require 'stm32)
(add-to-lisp 'load-path (expand-file-name "stm32" user-emacs-directory))
(require 'stm32)

Итак, что вы можете предложить, чтобы улучшить ето?

По функциональности ничего посоветовать не могу (под микроконтроллеры не программирую и CEDET не пользую), но логично было бы добавить этот пакет в MELPA. Правда, сначала нужно будет подчистить код.

  • Используй conventional libary headers.
  • Используй единый префикс к глобальным именам (обычно используют название пакета, в твоём случае stm32- подходит идеально). *CL-style* обозначения глобальных переменных не используй (в твоём случае их можно сделать defcustom-опциями).

    Подробнее смотри Coding Conventions.

  • Тут весь progn можно заменить на (user-error ...) (он для этой цели и нужен).
  • Здесь progn не нужен, в Emacs Lisp else-ветка может состоять из нескольких выражений (именно поэтому then и else ветки имеют разное выравнивание).
  • my-get-project-root-dir и my-get-project-name содержат дублирующийся код, который хорошо бы вынести в отдельную функцию.
  • Убрать предупреждения, которые генерирует checkdoc (если используешь flyckeck что я сильно рекомендую, то ты уже должен их видеть).
  • В идеале — переписать CubeMX2Makefile на Emacs Lisp, чтобы избавиться от лишней зависимости.

Это так, на первый взгляд. purcell обычно перед принятием пакета делает code review и подсказывает, что нужно исправить.

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

Ещё

  • Конструкции типа (if foo foo (get-foo)) обычно записывают так: (or foo (get-foo)).
  • Тело when и так выполняется в implicit progn, тут и в подобных случаях progn не нужен.
  • Если используешь concat для построения shell-команды, помни, что файлы и директории могут содержать пробелы и другие символы, имеющие специальные значения для шелла. Либо экранируй “опасные” аргументы с помощью функции shell-quote-argument, либо (лучше) используй функцию combine-and-quote-strings.
  • Зачем хардкодить путь к питону?
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)

Поздравляю!

Остается теперь выкинуть калокуб и использовать свои сниппеты + какую-нибудь обвязку (скажем, из opencm3).

anonymous
()

Тут наткнулся на http://tuhdo.github.io/c-ide.html , пока не пробовал, у меня ещё чего то по Python накручено, что то осталось под org-mode и LaTeX ... хотелось бы большей чтобы из коробочки IDE была, даже если эта коробочка один-два MELPA пакета для тех кто хочет.

DR_SL ★★★★★
()
Ответ на: Ещё от theNamelessOne

Огромное спасибо за ревью! Пошёл исправляться, лисп слишком приятный ^^

Зачем хардкодить путь к питону?

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

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

Была такая мысль, и вышло бы это довольно не сложно, ведь все тэмплейты открыты, но времени, пока нет.

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

Да там все поделка.... в общем то что я давал по ссылке накрылось ошибкой

Debugger entered--Lisp error: (invalid-slot-name "#<helm-source-in-buffer Regexp Builder>" :multimatch)

если питоновский сборник рецептов под одной крышей у меня ещё более менее пашет, то это непонятно и как пользовать, тут ещё свой project менеджер свой..... в общем Emacs IDE для C у меня под большим вопросом, не то что конфиг, как пользовать тоже непонятно....

DR_SL ★★★★★
()

Насколько надо отчаяться, чтобы считать Keil реально удобным?)
Но, увы, да, альтернатив не много и они не лучше.
Рад что удалось пересесть на СПО :)

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

Мои поделки - вдруг пригодится. Правда, на opencm3 (сам все никак не пересяду на «чисто свое», а эти гады - разрабы opencm3 - любят радикально менять API, поэтому обновлять библиотеку - себе геморрой нарабатывать).

Судя по отзывам народа на форумах по электронике, обычно либо фекалиями обмазываются (keil, калокуб и прочая гадость), либо берут лишь cmsis и заголовочные файлы, и пользуются чисто своим + сниппетами.

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

anonymous
()

В свое время у меня получилось прошить STM32F3Discovery из линукса при помощи openocd, писалось всё (сама прошивка, скрипты зашивки в плату) руками при помощи гугла. Как бы всё ок работало без всяких сред программирования: тупо vim/nano/geany + toolchain (вроде был Linaro) + Makefile + openocd.

Emacs-ом не пользовался, осуждать не стану, но если вдруг захочется отказаться от всей мишуры (ИМХО, это и есть лучший выход) - знайте, выход есть. Если нужно, могу скинуть вечером Makefile.

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

Вообще cedet могёт Си/С++ разработку просто отлично!

Ты создаёшь проект, делаешь ede-new, выбираешь тэмплейт(Мэйкфайл, cmake, etc...), и просто прогишь, потом C-c . C для компиляции и готово! Всё работает вообще отлично и идеально, начиная от автокомплита и до сборки.

Вот хорошая серия роликов: https://www.youtube.com/watch?v=NjTCjqSZOAU там объясняются все модули и возможности.

Для питона я юзаю elpy и тоже очень доволен.

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

Да не сильно) Это же просто Си - для прогания на нём не нужно вообще ничего - можно даж в блокноте писать. А тут даже автокомплит есть) Самое крутое в кейле, за что он мне понравился, отладка! Она божественна ^^

YOY :3

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

Добавил в закладочки ^^

Я смотрел на opencm, но чёт не захотелось.

Современная разработка под МК невозможна просто без сторонних библиотек, хы. USB, SDIO, SAI и тд - там нужно задействовать просто невероятное кол-во регистров и учесть все особенности системы, т.е. прочитать даташит полностью, а у СТМ32ф4 он 1800страниц занимает, да там ещё не всё - на каждую переферию есть свои АПНОТЫ.

Меня вполне устраивает HAL - он удобный и, самое главное, надёжный и учитывает всю переферию, все её особенности! Да, качество кода может оставлять лучшего, но этот код надёжен - ещё ни разу не подводил) ЮСБ флэшка в 10 строчек кода - это что-то невероятное ^^ И открыты все исходники.

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

Ну так тут я делаю тоже самое - без мешуры. Емакс только нужен для редактирования исходников, как и любой другой блокнот, а то, что я сделал, нужно только для автокомплита и дебага. Мэкфайл генерируется питоновским скриптом(просто для удобства), а сборка проходит тем же мейком. А дебагить можно просто gdb(gud - емаксовский интерфейс к gdb).

Можно обойтись даже без CubeMx - просто скопировать библиотеки HAL и вручную настраивать переферию. Но зачем, если HAL делает всё абсолютно тоже самое и заодно исключает человеческий фактор ошибок?)

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

Но зачем

Просто, чтобы поиграться, узнать как работают изнутри шины (I2C, USB, ...), чтобы затем пересесть на что-то более серьезное.

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

А что там разбираться то? Или ты про хардварную часть? Тогда для разборок лучше поюзать FPGA)

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

Неа, только дескрипторы HID правил. Но мне особо разбираться и не надо было - все воплощено в HAL и работает. Да и времени особо нет( Но я тебя понял, хе

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

Если можно, несколько вопросов?

auto-complete,ac, company-mode - это разные вещи?

helm,semantic, (ac-)c-headers - это анализаторы кода проекта и поставщики тэгов(бэкэнд) или как, в чем разница?

irony - работает только с clang компилятором? ggtags - это что и зачем?

В идеале как с python хотелось бы сделать отдельно настройки режима автодполнения и подгрузки всего и вся или даже мини мод. Который и активировать M-x avr-c-mode, только как его писать увы знаний нет.

(defun prelude-personal-python-mode-defaults ()
  "Personal defaults for Python programming."
  ;; Enable elpy mode
  (elpy-mode)
  ;; Jedi backend
  ;; (jedi:setup)
  ;; (setq jedi:complete-on-dot t) ;optional
  ;; (auto-complete-mode)
  ;; (jedi:ac-setup)
  ;; (setq elpy-rpc-python-command "python3")
  ;; (python-shell-interpreter "ipython3")
  (company-quickhelp-mode)
  )

(setq prelude-personal-python-mode-hook 'prelude-personal-python-mode-defaults)

(add-hook 'python-mode-hook (lambda ()
                              (run-hooks 'prelude-personal-python-mode-hook)))

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

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

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

auto-complete,ac - одно и тоже; company-mode - совсем иная, но выполняет те же функции;

helm - просто добавляет в интерфейс такую менюшку, которая автокомплитит пути при открытии файлов, команды по M-x, пакеты и тд https://imgur.com/a/zXuv2 Типа ido, только мне helm больше нравица.

semantic, (ac-)c-headers анализаторы кода, только реализованные по-разному. Яхз, в чём именно разница, но с ац-* я не смог нормально поработать, поэтому сразу заюзал semantic.

Агась, только для clang, ибо юзает его фичи.

ggtags - просто офигенная штука. Она нужна для навигации по проекту, поиска, закладок и тд. Самое главное, что она позволяет мгновенно перемещаться по функциям и тд проекта весом в несколько гигов. По сорсникам нашего любимого ядрышка скачет огого!

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

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

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

ggtags - просто офигенная штука. Она нужна для навигации по проекту, поиска, закладок итд

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

  • скачать ядро с kernel.org
  • зайти в корень распакованного ядра и набрать gtags
  • перейти там к такой то строчки и нажать комбиницию клавиш или функции из gtag

Поставил helm - да очень прикольный, мне kill-ring радует и M-x. Спасибо.

DR_SL ★★★★★
()

Глянь на мой велосипед на ту же тематику - https://github.com/KivApple/mcu-info-util

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

Пишешь простейший Makefile с использованием этой утилиты и он получается универсальным (изменил переменную с названием МК и всё пересобралось под него).

Чтобы понять примерный функционал, вот тебе:

$ mcu-info-util
usage: mcu-info-util [-h] [--mcu MCU] [--print-flags]
                     [--linker-script LINKER_SCRIPT] [--header HEADER]
                     [--use-defines] [--enable-libopencm3]
                     [--metadata-dir METADATA_DIR]

MCU info util

optional arguments:
  -h, --help            show this help message and exit
  --mcu MCU             specify MCU model (e. g. STM32F407VG)
  --print-flags         print required compiler and linker flags for target
                        MCU
  --linker-script LINKER_SCRIPT
                        specify output file name for the linker script
  --header HEADER       specify output file name for the C/C++ header
  --use-defines         use #define instead of static const
  --enable-libopencm3   enable linking with libopencm3 library (if supported
                        for target MCU)
  --metadata-dir METADATA_DIR
                        specify metadata directory
$ mcu-info-util --mcu STM32F103C8 --print-flags
-D_ROM=64K -D_RAM=20K -D_ROM_OFF=0x08000000 -D_RAM_OFF=0x20000000 -mcpu=cortex-m3 -mthumb -DSTM32F1 -msoft-float
KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

*CL-style* обозначения глобальных переменных не используй (в твоём случае их можно сделать defcustom-опциями).

Как это? Можно примерчик7 а то не нагуглил ничего понятного... =Р

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

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

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

Как это? Можно примерчик7 а то не нагуглил ничего понятного…

Про *CL-style* я имел в виду вместо названий *foo-bar* использовать foo-bar (такое наименование глобальных переменных не прижилось в среде Emacs Lisp; это значит, что если ты решишься добавить свой пакет в Melpa, то тебя скорее всего попросят переименовать такие переменные).

У тебя сейчас все *stm- параметры завязаны на твоё рабочее окружение (например, что st-util будет находиться в директории prg/stlink/build в домашней директории пользователя lyra). Естественно, пользователю придётся указывать свои значения для этих настроек. Для настроек пакета, которые могут быть изменены конечным пользователем, принято предоставлять интерфейс Customization (документация), при этом значения настроек по умолчанию опять же не должны быть завязаны на твоё окружение. Ну и в документации (README и Commentary-секция твоего файла) нужно указать, что такие-то настройки могут быть изменены пользователем.

Пример:

(defgroup stm32 nil
  "STM32 projects integration"
  :group 'development)

(defcustom stm32-st-util-command "st-util"
  "The command to use to run st-util"
  :group 'stm32
  :type 'string)

(defcustom stm32-template-folder "CubeMX2Makefile"
  "Project's relative directory with scripts for generating makefiles."
  :group 'stm32
  :type 'string)

;; and so on...

Добавь файл COPYING с текстом GNU GPL в репозиторий и упоминание используемой лицензии в README, например:

# License

This program is distributed under the terms of GNU General
Public License, version 3 or any later version. See COPYING 
for details.

По поводу library headers:

  • все новые проекты должны использовать лексическое связывание: для этого нужно в заголовок каждого elisp-файла добавить строку -*- lexical-binding: t -*-.
  • подумай над использованием схемы семантического версионирования для отслеживания версий твоей программы.
  • если какой-нибудь заголовок у тебя пустой (например, Maintainer:, Compatibility:, Change Log:), то его указывать не надо.
  • в Package-Requires: нужно указать минимальную поддерживаемую версию Emacs.

Вот переделанный шаблон для stm32, который придерживается стиля большинства Elisp-проектов (заполни секцию Commentary: сам):

;;; stm32.el --- STM32 projects integration -*- lexical-binding: t -*-

;; Copyright (C) 2016 Alexander Lutsai

;; Author: Alexander Lutsai <s.lyra@ya.ru>
;; Created: 05 Sep 2016
;; Version: 0.1.0
;; Package-Requires: ((emacs "24.4"))
;; URL: https://github.com/SL-RU/stm32-emacs/
;; Keywords: tools, maint

;; This file is not part of GNU Emacs.

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary: 

;; - Short descriptions of your project
;; - How to set it up:
;;   - installation
;;   - configuration
;; - How to use it

;;; Code:

;; !!! Code goes here !!!

(provide 'stm32)
;;; stm32.el ends here
theNamelessOne ★★★★★
()
2 ноября 2016 г.
Ответ на: комментарий от SL_RU

Ох осторожнее с этим человеческим фактором.

Поищите статьи на тему «Почему HAL -кал» и вы найдете достаточно человеко-индусского фактора в этом поделии. Когда хочется вот прям сейчас, быстро, или подсмотреть иниты - да, удобно. Но баги лучше из своего говнокода выгребать, чем из чужого.

anonymous
()
Ответ на: Ох осторожнее с этим человеческим фактором. от anonymous

Конечно я сам прекрасно знаю, что с халом всё плохо. Но когда говорил «человеческий фактор» - я имел ввиду возню регистрами и циферками. По опыту аврок знаю, что большинство ошибок именно из-за этого, а не из-за косости либ.

SL_RU ★★★★
() автор топика

1. Выкинь калокуб, не будь вантузятником!

2. Если тебе так хочется, для инициализации периферии можно opencm3 использовать, все остальное - ТОЛЬКО через CMSIS! Читай документацию - не будь ардуинщиком!

3. На мой взгляд, эмакс - говно. Но на вкус и на цвет все фломастеры разные...

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

Ты не представляешь, но именно использование калокуба сделает твои разработки говноподелками уровня хуже школьника!

Только регистры!!!

Если ты действительно серьезно разрабатываешь под STM32, то буквально за год выучишь все errata наизусть + хорошо освоишь RM. Кроме того, накопятся свои сниппеты, которые потом просто будет воткнуть в любой новый проект. И они не будут использовать говнолибы, замедляющие код и увеличивающие его размер во многие разы.

Почитай народ на изыдиэлектрониксе и казусе: о калокубе положительно только полные болваны отзываются. Основная часть разработчиков вообще кроме CMSIS (+, понятное дело, сторонних библиотек USB, lwip и т.п. хрень) ничего не пользует.

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

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