Как стать автором
Обновить

Комментарии 61

Контроллеры мощнее, а подходы к программированию все те же. Какие-то битики, какие-то регистры. Нафига это все? Следующих шаг от 8-битных МК должен быть переход к более высокому уровню абстракции, когда пофиг сколько там таймеров и есть или нет ДМА. Т.е. к ОС. Без ОС между AVR и ARM нет никакой принципиальной разницы.
FreeRTOS, mbedOS и иже с ними. Это есть. AVR редко используется(во всяком случае мной), зачастую 32 битный STM.
И абстракция есть, HAL называется…
НЛО прилетело и опубликовало эту надпись здесь

Предлагаете для моргания светодиодом использовать Raspberry Pi с каким-нибудь модным фреймворком? :)

node red

В кокосе в свое время можно было выбрать контроллер и создать проект прям в несколько кликов. Если не путаю.
А сейчас все что может само генерировать проект выдает чудовищные простыни с HAL через которые новичку пробраться к железу гораздо сложнее. Хотя сейчас есть LL но с ним по-умолчанию тоже проект не сгенерируешь, опять hal прицепом.

Об этом я и пишу, эта стена кода ради блинка не просто пугает, она сама крестик в правом верхнем углу нажимет и Кейл с Кубом с компа сносит. Вроде хотел всего ничего, Хелловорд написать, а тебе 6 экранов кода выкинуло и дерево проекта на 30+ файлов. Тут любой по старому доброму AVR затоскует, тем более, что реальных задач для STM у домашнего мамкиного программиста как бы и нет. А реально нужного в этой портянке всего 5 строк.

Кстати, можете мне на пальцах объяснить, почему куб выдаёт стену кода? Возможностей и шаблонов, и даже макросов вполне хватает на то, чтобы пользовательский код был достаточно краток.

наверное это плата за «универсальность» заготовки кода. Прописано всё на все случаи, нужное-оставить, ненужное-удалить. Как быть с пластами абстракций, если ты нуб? Скорее всего, никак, только терпеть и лопатить.

STL очень туго обвязана шаблонами, получается, что разработчики куба просто поленились?

Куб генерирует код на Си, а в Си нет шаблонов.

Тогда понятно, на макросах тоже можно писать, но лучше так не делать.

Кстати, можете мне на пальцах объяснить, почему куб выдаёт стену кода?
Да никакой особой стены кода куб не выдаёт. Просто по сути каждый конфигурационный бит процессора в нём записывается как человеко-читаемая строка, например
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
и чтобы понять, что тут происходит, нет необходимости каждую минуту лезть в даташит, выискивая вырвиглазные названия битов в таких же вырвиглазных названиях регистров.

Меня похожий вопрос интересовал, когда я решил попробовать ангуляр — ng init генерит не меньше кода, чем куб

Для быстрого перехода на стм32 идеально подходит stm32duino. По мере погружения код будет постепенно превращаться в нативный

stm32duino — это который из двух? Они несовместимы.

Ну тинька и таблетка все же разных весовых категорий, а если сравнивать 328 и стм407 — вообще несравнимы. На тиньке что-то нормальное втиснуть — желателен ассемблер, а не ардуиноиде, на стмках же есть вполне нормальный STMCubeIDE, который содержит в себе все, что надо для разработки. Таки да, достаточно прост, чтобы разобраться, неплохой дебаггер и кейл не нужен при этом. Единственное, что плохо — он на эклипсе, посему любит задумываться даже на неслабых машинках и очень не любит стлинки на клонах китайских, aka cks или как там их.
В общем холивар atmel vs stm — изначально глуп, как хищник против человека-паука. Ну вы меня поняли...))

Кубоид пробовал, что-то вообще как-то не зашло. Ну и Эклипс для моей слабенькой машинки неподъёмен, да и тоже не впечатляет
А я с него начал, видимо, поэтому и зашел. А так даже ноут справляется древний, правда, приходится медитировать при разработке ))
А вы с STMH7 сравните. Мег ОЗУ, два мега ПЗУ, в отдельных вариантах полтора процессора… Ну как бы зверь совсем иного класса.

К сожалению, такие красивые окошки Кейл умеет рисовать для очень ограниченного количества процов; вероятно, их люди делали "вручную". А регистры рисуются по sfr-файлу, который производитель МК поставляет.

А что делать, если нет 10к$ на Keil? =)
ужаться в 32КБ кода и никому не платить
НЛО прилетело и опубликовало эту надпись здесь
это будет «наилегчайший старт в STM за $10+». Да и хотелось бы ссылочку на нуклео за 10 баксов. Не стоит верить всему, что появляется на Хабре, особенно в камментах.
НЛО прилетело и опубликовало эту надпись здесь

Фигня жто mbed. Редактор на сайте годится только для запуска примеров. Да и то не всех. Навигации нет, отладки нет, даже нормальных сообщений об ошибках нет. Десктопный редактор еще более убог.

Спасибо
Всегда пожалуйста, есть ещё вариант с Visual Studio и VisualGDB
Правда отладчик платный, но говорят он того стоит. А также можно глянуть на Segger Embedded Studio, есть мнение, что там дебаггер просто божественен
Ага, все ждал в комментах, когда про него вспомнят :)
Недавно попробовал, вообще огонь.
Eclipse как IDE на голову выше и бесплатный. Компилятор — gcc для ARM, не сравнивал с Keil по качеству но на больших проектах вполне успешно справляется.

Я в QtC вкорячил. Удобно, включая загрузку и отладку с помощью OpenOCD/GDB.

Берите IAR за 5 )
Мы на gcc собираем. OpenOCD для загрузки, GDB для отладки.
Почему бы не попробовать STMCubeIDE? Все в одном — среда разработки, компилятор, программатор, отладчик. В комплекте CubeMX, интегрирован в IDE, не нужно устанавливать/запускать отдельно. Единственный глюк, который я заметил — после обновления (а они случаются) есть вероятность, что при апгрейде файла *.ioc (это основа проекта, файл CubeMX) весь код, который вы написали в соответствующих блоках будет уничтожен. Но своевременные бэкапы проекта спасают в этом случае. Причем потери не обязательны, это происходит при определенных условиях, сейчас не вспомню, каких, уже больше полугода не подходил к МК. Ну и обновления происходят не просто так, STM в каждой обновке решает некоторые проблемы, к примеру, большинство мануалов в инете для запуска USB в качестве serial port предлагают добавлять некий код в обработчики приема-передачи, начиная с некоторой верии IDE они таки включили этот код в шаблоны. Саму IDE можно взять на st.com
Ну и на ту же таблетку можно писать, используя HAL, можно CMSIS, если очень хочется, то можно и SPL подключить. И да не будет холивар, что хал — дерьмо, настоящие пацаны пишут на регистрах )))

Я с вами согласен в целом, но все же на следующий Новый год я попрошу Деда мороза повесить каждому менеджеру ST волшебный ошейник. Что бы когда очередной noname_user будет плакать над примерами ST или документацией по волшебном ошейник пробегало вольт 300...


P. S. Самое обидное, что-бы вычистить код примеров нужны копейки, а человеко/лет user тратится порядочно.

int i;


volatile int i;

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

Не только. :)
Ничто не помешает компилятору выкинуть пустой цикл, как бесполезный при включении оптимизации.

Локальные переменные

Часто для создания небольших задержек пользуются такими функциями:

void Delay (char D)
{
char i;
for (i = 0; i < D; i++) continue;
}

Однако, некоторые компиляторы видят в этих функциях бесполезный код и вообще не включают его в результирующий объектный код. Если эта задержка применялась для снижения скорости программного i2c (или SPI) под компилятором, например, HT-PICC, то при переносе на ядро AVR с компилятором WinAVR программа перестанет работать, вернее, она будет работать так быстро, что управляемая микросхема не будет успевать обрабатывать сигналы из-за того, что все вызовы функции Delay будут упразднены.

Чтобы этого не происходило, нужно использовать квалификатор volatile:

void Delay (char D)
{
volatile char i;
for (i = 0; i < D; i++) continue;
}
ваш пример вообще не самый лучший, так скажем. Строить квадратную шину на таких задержках это далеко не образец программирования, а собственно for сам по себе не самый правильный оператор, есть много программистов, которые им стараются не пользоваться, так как это «синтаксический сахар»
Положим, это фрагмент статьи, на которую указывает ссылка.

Боюсь представить, что с вами будет, если я подключу std::for_each. :)

Так, а что вам не нравиться в цикле for? Любой ваш оператор цикла это по сути if и goto обернутые в красивое название (синтаксический сахар).

Лично я ничего не имею против, равно как и за. Это сродни предыдущему заявлению, что я был обязан указать volatile, человек считает, что я обязан, и его ничего не волнует.

Мне кажется вы слишком резко восприняли критику, volatile, мне кажется, в данном случае нужен, так как эта статья позиционируется как учебный материал и было бы полезно сразу знать о граблях. Я не увидел в словах того заявления принуждения к этому, только совет с объяснением почему.
Я использую в кейле 6.13 компилятор с настройкой оптимизации balance и подобные циклы порой исчезают.

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


Меня волнует, что ряды «Не включайте оптимизацию! В компиляторе ошибка — цикл теряется.» пополнятся очередным адептом. И виноваты в этом будете вы со своей статьёй. А вот это уже скверно.

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

мы рады, что вам известно назначение volatile, но именно эта минимальная программа здесь и сейчас в нём не нуждается.
Блажен, кто верует. ;)
мне явлено чудо, задержка работает. Масштабировать и переносить на другой камень в планы не входит
Ну тут афоризм про трусы и крестик. Либо вы пишете, как надо и с некоторой гарантией переносимости, либо верите своему компилятору и убеждаете себя, что ему не придёт в голову оптимизировать вашу задержку, и этот код не покинет те условия, при которых был собран. Обычно, люди хотят, чтобы их программы не зависели от обстоятельств компиляции, ибо обратно чревато приличным геморроем в случае, когда компилятор возьмётся перекраивать такой код.
либо вы пишете всю программу по правилам хорошего тона, здравого смысла и правил программирования и конкретно этого языка, либо отбрасываете вообще всё, что может отвлекать и в конкретных учебных целях оставляете самый минимум. Здесь есть много того, за что можно развести критику до небес, но вы разглядели только volatile. К тому же, эта программа работает в дебаге, этопошаговый режим и эти задержки здесь не нужны вообще. Цель включить вручную тактирование, настроить порт и подрыгать ножкой, ставя галку мышкой.
Здесь есть много того, за что можно развести критику до небес, но вы разглядели только volatile


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

При компиляции gcc с ключом -Os (стандарт для МК) volatile не нужен, при -O2 и выше цикл должно выкинуть. Как ведёт себя keil или пиковский компилятор не знаю, документацию на них за ненадобностью не читал.

Разницы никакой
Оптимизм — это хорошо. Повышу вам за него карму. :)
«Голубая таблетка» это не STM32F103C6T8, это STM32F103C8T6. Исправьте.
пофиксил
Прикольно! Правильно описан ужас вначале разработки на STM, часто нигде не упоминается, откуда берутся операторы и какие они могут быть ещё. А тут по действиям понятно. Я также, когда начинал постигать VBA, включал запись макроса, делал действия, смотрел код.

По поводу дебага на AVR — зачем? ну есть JTAG-отладчики, но кому это надо? в голове или симуляторе не дебажится? Сколько всего делал на AVR, поэтому недоумеваю.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории