Pull to refresh

Comments 19

Ух, большое спасибо за ссылки, не попадались мне при поиске. Отличный источник хороших идей

По поводу драйвера USART:

Шел 2021 год, мыши плакали .... программисты продолжали писать в регистры.

Я кайфую с этого :) Причем это отличный способ разобраться в деталях как все работает. Не люблю HAL и прочие нагромождения. LL разве только, но это просто обертки.

Микроконтроллеры программирую только в своих хобби проектах и их не нужно портировать на другие процы.

Это лично мои убеждения. В больших проектах писать драйвера на регистрах излишне, но тут можно и развлечься :)

Наверное стоит написать почему я пришел с этим убеждениям. Раньше я использовал HAL, но в новом проекте у меня перестал работать USART. Я потратил много времени на отладку и оказалось, что в HAL не правильно вычислялся baudrate (подробностей не помню, было давно).

После этого я соскочил с него.

Причем это отличный способ разобраться в деталях как все работает.

Поддерживаю. Более того, иногда это единственный способ сделать код ещё и быстрым.

не нужно портировать на другие процы.

если честно, не могу понять, кому вообще в здравом уме придет идея создавать новый проект под новый МК сохраняя при этом функциональность. Отсюда получается что HAL дико избыточен по своему функционалу. Есть у кого-то опыт, где реально был с десяток разных МК и прям нужно было переносить код (практически один к одному) и HAL в этом случае реально помог. Интересно было бы послушать.

У меня был такой опыт.
Поэтому всегда топлю за HAL с минимально возможными вставками регистровых обращений.
А все из за того, что на предыдущем месте работы в течении полугода силами нескольких человек приходилось перетаскивать наработки между семействами МК.
Вот представьте себе ситуацию, вы сделали какой то супер пупер прибор, у вас написаны свои драйвера и библиотечки для АЦП, Ethernet, гироскопов, модбасов и прочих МЭК протоколов, модули удаленного обновления ПО через протоколы верхнего уровня и пр и все это ну допустим под STM32F3. И тут к вам приходит заказ — сделать похожий прибор с теми же функциями, но с дисплеем и прочими плюшками. А это уже STM32F7. Срок 2-3 мес вместе с железом. Если все писать на регистрах и LL — то за 2-3 мес перенести можно, но потом нужно будет менять работников после выгорания.
Проекты, которые изначально написаны на HAL и не имеют прямых обращений к регистрам — переносятся одним человеком за пару дней.
Клиенту нужен рабочий прибор, а не оптимально написанный код на регистрах.
В хоббийных проектах хоть на асме можно писать, а коммерция — это всегда минимизация сроков и затрат на разработку, поэтому только HAL.

Спасибо, вполне реальный пример. Но на мой взгляд, переход между F3 и F7 не такой уж и сложный. Большая часть периферии все же конфигурируется одинаково. у ST только I2C да DMA сильно менялись при выходе новых моделей. GPIO\TIMER\SPI так вообще практически неизменны. (за исключением F1 серии, там все другое). А например переход между F1 и L4+ семействами был бы повеселее как мне кажется.

Клиенту нужен рабочий прибор, а не оптимально написанный код на регистрах.

Ещё и нужен вчера. Но тут как посмотреть, иногда ведь клиент хочет чтоб железка была маленькой и от батарейки работала вечно. Вот тут в оптимизацию топишь по максимуму. И тогда вместо F7 ставишь тот же F3, перечитывая историю одного байти).

Вот представьте себе ситуацию, вы сделали какой то супер пупер прибор, у вас написаны свои драйвера и библиотечки для АЦП, Ethernet, гироскопов, модбасов и прочих МЭК протоколов, модули удаленного обновления ПО через протоколы верхнего уровня и пр и все это ну допустим под STM32F3.

Это могу представить, у меня в работе как раз есть отдаленно похожая вещь. Есть прибор где связка nrf52840 + stm32l4r, а есть где просто nrf52840. В добавок некоторый код переносится с DSP. И особых проблем не испытываю.

драйвера и библиотечки для АЦП, Ethernet, гироскопов, модбасов и прочих МЭК протоколов

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

Я пробовал HAL от нордиков, когда подключал внешнюю NAND память. Да приятно и удобно, вызвал инит и забыл: оно работает само, правда на ките и только с 8 МБ памятью. Переход на больший объем оказался сложным, так как в HAL забыли добавить возможность отправки кастомной команды для перехода на 32-битную адресацию по шине. Недели две ушло на то, чтобы понять из какого места это правильно и безопасно сделать. Абстракция над абстракцией и абстракцией погоняет. Три или четыре уровня, с постоянным переименованием методов и переменных для вызова 6 строк записи в регистры. Это разве удобно?!

Ну вы не путайте HAL от STM и HAL от нордика.
У STM один уровень над железом и относительно устоявшимися именами функций.
А код либ для нордика какие то наркоманы пишут. Причем судя по всему они еще от версии к версии SDK забывают что там писали ранее и начинают выдумывать снова.
Поэтому любое обновление версий либ — это трэш лютейший.
Но в целом нордик мне нравится, под него действительно надо писать свои обертки на регистрах.

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

В общем, дело вкуса как говорится)

Обожаю его, и с небольшой обёрткой работает на всех устройствах.

А что мешает открывать и закрывать сессии с помощью УП? Тогда выкидываем один провод и получаем универсальность. Можно использовать RS485, да хоть радиоканал.

Я физически выдернул провод во время ввода команды, куда УП посылать? Соответственно сервер об этом не узнает

Зато сервер узнает когда сессия снова началась.

Общался по двум проводам (не считая земли) с апельсинкой, не заметил проблем. Может если когда-нибудь напишу свою реализацию, то пойму в чём проблема, но, похоже, терминалы десятилетиями работают просто по tx/rx и горя не знают.

Насколько помню, FreeRTOS и NuttX предоставляют в своих сборках/либах терминал. NuttX так вообще POSIX подобная RTOS.

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

В своём похожем проекте я использовал УП ESC[K - очистить строку от курсора справа (курсор при этом в начале). Это делаю перед выводом команды из истории. Статью на тему своего терминального интерфейса я напишу в скором времени. А в целом ваша статья очень полезна. Даже редактирование команды в середине строки реализовано, чего я ещё пока не сделал. Считаю, что такие функции, как история и редактирование команд, должны быть возложены на терминал. Точнее, должен быть такой режим, как предварительный редактор. Если такого терминала не существует, его можно написать самому.

Sign up to leave a comment.

Articles