Pull to refresh
14
0
Александр @Saalur

Пользователь

Send message

Современные возможности C++ и проверенные паттерны: активный объект, внешний полиморфизм и корутины

Reading time14 min
Views15K

В этой статье я покажу, как внешний полиморфизм (реализация полиморфного поведения вне объекта, для которого такое поведение требуется) помогает писать красивые и чистые программы, и расскажу о некоторых базовых и продвинутых способах реализации. Примером будет служить старый добрый паттерн многопоточного программирования “активный объект”. В конце я покажу, как просто реализовать этот паттерн с помощью корутин из стандарта C++20, и как вы можете использовать их, чтобы сделать активный объект еще лучше, добавив в него настоящие асинхронные функции.

Читать далее
Total votes 13: ↑12 and ↓1+11
Comments22

Как я пишу на C по состоянию на конец 2023 года

Level of difficultyMedium
Reading time9 min
Views27K
Этот год выдался переломным для моих навыков по программированию на C. Можно сказать, что я пережил слом парадигмы, что побудило меня пересмотреть привычки и весь стиль программирования. Это была крупнейшая метаморфоза моего личного профессионального стиля за долгие годы, так что я решил написать этот пост в качестве «мгновенного снимка» моих нынешних суждений и профессионального существования. Эти перемены во многом пошли на пользу моей продуктивности и организованности, поэтому, при всей субъективности того, что я скажу, в посте наверняка будут описаны и вполне объективные вещи. Я не утверждаю, что на С нужно писать именно так, как рассказано ниже, а я сам, выступая контрибьютором некоторого проекта, придерживаюсь того стиля, который там заведен. Но описанные ниже приёмы, как оказалось, очень пригодились мне при работе.
Читать дальше →
Total votes 49: ↑37 and ↓12+25
Comments91

STM32. Подготавливаем среду разработки в Linux

Level of difficultyEasy
Reading time21 min
Views18K
В недавнем времени получилось так, что у меня появилась пара интересных проектов, где одна из составных частей — микроконтроллер STM32. И каждый раз при смене ноутбука или ОС на домашнем компе приходится настраивать окружение для разработки как в первый раз. Плюсом, последние проекты, которые я делал для STM32 — выполнял в Windows, в демо-версии Keil uVision. Но поскольку я давно переехал в Linux — возникла необходимость основательно разобраться и изложить процесс настройки окружения для будущих применений.

Всем, кому интересно — добро пожаловать под кат.

Читать дальше →
Total votes 63: ↑62 and ↓1+61
Comments31

Руководство по CMake для разработчиков C++ библиотек

Reading time18 min
Views78K

Данное руководство позволит читателю составить полную картину того, как организовать сборку C++ библиотек с использованием современных возможностей CMake. Предполагается, что читатель имеет представление о базовых понятиях из мира CMake и динамических/статических C++ библиотек, так как в руководстве они могут не объясняться.

Читать далее
Total votes 71: ↑71 and ↓0+71
Comments49

Проверка корректности адресов в памяти на Cortex-M0/M3/M4/M7

Reading time9 min
Views14K
Привет, Хабр!

По поводу случившегося на днях послабления режима, возмущения в комментариях одного соседнего поста о том, что статьи про микроконтроллеры — сплошь мигание светодиодом, а также безвременной гибели моего стандалон-блога, восстанавливать который мне пока лень, переложу сюда полезный материал об одном прискорбно мало освещаемом прессой трюке в работе с ядрами Cortex-M — проверке произвольных адресов на валидность.


Одна из весьма полезных и при этом почему-то в готовом виде нигде не описанных возможностей на микроконтроллерах Cortex-M (всех) — это возможность проверки корректности адреса в памяти. С её помощью можно определять размеры флэша, ОЗУ и EEPROM, определять наличие на конкретном процессоре конкретной периферии и регистров, прибивать упавшие процессы при сохранении общей работоспособности ОС и т.п.
Читать дальше →
Total votes 72: ↑72 and ↓0+72
Comments42

Яндекс выложил в опенсорс бету фреймворка userver

Reading time10 min
Views74K
Сегодня мы анонсируем выход в опенсорс фреймворка userver для создания высоконагруженных приложений. Для нас это важный способ поделиться опытом в разработке микросервисов, который мы накопили. Вот ссылка на Гитхаб-репозиторий c исходным кодом, документацией, примерами, шаблоном для создания своих сервисов (с настроенным CI, сборкой и тестовым окружением) и сервисом динамических конфигов. Всё это опубликовано под лицензией Apache 2.0.



🐙userver позволяет быстро создавать эффективные микросервисы на языке C++ и уже много лет активно используется в Яндекс Go, Еде, Лавке, Доставке, Маркете, финтехе и других проектах. Вот из каких требований мы исходили в процессе разработки:

  • Простота. Стажёр или студент, приходя к нам, может уже через неделю написать и отправить в продакшен новый микросервис.
  • Надёжность. Многие ошибки, в том числе и связанные с многопоточностью, можно поймать на этапе компиляции. Кроме того, фреймворк даёт подсказки по исправлению проблем.
  • Полнота. В userver есть всё необходимое для тестирования, работы с разными базами данных, кеширования, логирования, трейсинга, распределённых блокировок, работы с JSON, BSON, YAML, изменения параметров сервиса на лету и так далее.

Сейчас я расскажу о том, как возникла идея userver, как фреймворк развивался, в каких задачах его сейчас используют и почему именно выход в опенсорс был логичным следующим шагом. А затем приведу пример написания нового микросервиса.
Читать дальше →
Total votes 177: ↑173 and ↓4+169
Comments142

Holy C++

Reading time5 min
Views30K

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

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

1 - union - сумм тип из 70х, в С идея хранения одного типа из нескольких в одном участке памяти выглядит неплохо и сейчас, ведь там все типы это набор байт с заданным размером.

В С++ же использование union это автоматическое undefined behavior, например:

Читать далее!
Total votes 90: ↑63 and ↓27+36
Comments362

Обнаружение наличия функциональности в C++ на этапе компиляции

Reading time10 min
Views4.9K

Иногда, при реализации очередной "шаблонной магии" очень хочется на этапе компиляции иметь сакральное знание о том, а если у типа нужный метод, чтобы его вызвать или нет?

Хорошо, если есть поддержка концептов или рефлексии. А что делать, если их ещё нет, или они не в полной мере поддерживаются?

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

Читать далее
Total votes 12: ↑11 and ↓1+10
Comments6

C++20: Пулы потоков в cppcoro

Reading time5 min
Views5.3K

Этот пост является заключительным в моей мини-серии из трех постов о cppcoro. cppcoro — это библиотека абстракций корутин от Льюиса Бейкера (Lewis Baker). Сегодня я покажу вам пулы потоков (thread pools).

 

Читать далее
Total votes 10: ↑9 and ↓1+8
Comments1

Что делать, если поймал HardFault?

Reading time6 min
Views32K
Что делать, если поймал HardFault? Как понять, каким событием он был вызван? Как определить строчку кода, которая привела к этому? Давайте разбираться.

Всем привет! Сложно найти программиста микроконтроллеров, который ни разу не сталкивался с тяжелым отказом. Очень часто он никак не обрабатывается, а просто остаётся висеть в бесконечном цикле обработчика, предусмотренном в startup файле производителя. В то же время программист пытается интуитивно найти причину отказа. На мой взгляд это не самый оптимальный путь решения проблемы.

В данной статье я хочу описать методику анализа тяжелых отказов популярных микроконтроллеров с ядром Cortex M3/M4. Хотя, пожалуй, «методика» — слишком громкое слово. Скорее, я просто разберу на примере то, как я анализирую возникновение тяжелых отказов, и покажу, что можно сделать в подобной ситуации. Я буду использовать программное обеспечение от IAR и отладочную плату STM32F4DISCOVERY, так как эти инструменты есть у многих начинающих программистов. Однако это совершенно не принципиально, данный пример можно адаптировать под любой процессор семейства и любую среду разработки.


Читать дальше →
Total votes 23: ↑23 and ↓0+23
Comments12

Как писать bash-скрипты надежно и безопасно: минимальный шаблон

Reading time8 min
Views67K

Скрипты на Bash. Как много в этом слове. Любому разработчику рано или поздно приходится их писать. Почти никто не скажет "да, я люблю писать bash-скрипты", и поэтому этой теме уделяют мало внимания.

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

Читать далее
Total votes 109: ↑109 and ↓0+109
Comments27

Открытый проект файловой системы для внутренней памяти STM32H

Reading time8 min
Views7.8K

Зачем ставить внешнюю IC памяти или SD карту если в микроконтроллере осталось много свободной Flash памяти! 

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

Как сделать из внутренней Flash подобие EEPROM сравнительно неплохо написано в этом апноуте от ST. Но с некоторого уровня комплексности встроенного ПО хранить данные в именованных файлах удобнее чем в жёстких структурах. Файлы упрощают реюзинг, облегчают поддержку преемственности версий, апгрейды и даунгрейды. Файлы освобождают от хлопот с планированием размещения во флэш и разруливанием конфликтов размещения, особенно если приложение модульное и модули разрабатываются отдельно. 

Читать далее
Total votes 20: ↑19 and ↓1+18
Comments19

Задачка о функции-обертке, принимающей аргументы в произвольном порядке, и ее решение на C++17

Reading time5 min
Views11K

Недавно на Хабре проскакивала новость о Magnit Tech++ Meet Up, и в ней упоминалась задачка, которая меня заинтересовала. В оригинале задачка формулируется так:

Определена функция с сигнатурой:

void do_something(bool a, int b, std::string_view c)

Определить функцию, принимающую в произвольном порядке аргументы типов boolintstd::string_view и вызывающую функцию do_something с переданными параметрами в качестве аргументов.

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

Итак, поехали...
Total votes 35: ↑34 and ↓1+33
Comments53

Безопасно рисуем иконки в ПЗУ и ловим UB в C++ коде на IAR компиляторе

Reading time10 min
Views4.3K

Доброго времени суток хабровчане. Давненько я не писал, был довольно сильно занят семьей, начались тренировки и нужно каждый день возить детей. Но вот наконец-то есть время чтобы немного вспомнить про разработку ПО.

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

Но мы не ищем простых путей, поэтому иконку будем рисовать сами на С++ для CortexM4 микроконтроллера и сразу в ПЗУ, чтобы не зависеть от всех этих внешних программ, заодно и посмотрим как можно отловить ошибки в уже существующем коде (студентов), которые никто не заметил (даже PVS-Studio).

А еще некоторые компиляторы запрещают делать UB для кода исполняющегося во времени компиляции, поэтому можно отлавливать и UB. Например, мой IAR прекрасно ловит переполнения int. Но обо всем поподробнее.

Чтобы было просто — рисовать будем круг.

Читать далее
Total votes 18: ↑17 and ↓1+16
Comments37

Использование статического анализатора PVS-Studio при разработке для встраиваемых систем на C и C++

Reading time5 min
Views4.1K
Из этой статьи вы узнаете, как запустить проверку embedded-проекта и как работать с отчетом анализатора. Анализатор PVS-Studio поддерживает ряд компиляторов для встраиваемых систем. В текущей версии возможна проверка проектов при сборке одним из следующих компиляторов под Window, Linux и macOS:

Читать дальше →
Total votes 42: ↑38 and ↓4+34
Comments3

Bluetooth Low Energy: подробный гайд для начинающих

Reading time16 min
Views70K

Создание кастомного сервиса и тем более клиента Bluetooth Low Energy – прогулка по граблям с завязанными глазами. По крайне мере так было для меня 4 года назад, когда я только начинал работать с BLE-устройствами. Сейчас почти каждый мой проект предусматривает использование этого протокола, поэтому в свое время пришлось в нем долго и мучительно разбираться. 

Разложить все по полкам помогла книга Мохаммада Афане "Intro to Bluetooth Low Energy" и серия постов на Novel Bits. Лично для меня эта книга стала настоящим открытием. Изначально я делал ее перевод на русский для своих коллег, не имеющим опыт работы с BLE. С согласия автора (огромное ему спасибо) решил опубликовать свою работу здесь. Надеюсь, перевод окажется полезным.

Это первая часть перевода (всего их будет 5), которая рассказывает, что такое BLE, ее возможности и отличия от Bluetooth Classic и описывает архитектуру протокола.

Читать далее
Total votes 29: ↑29 and ↓0+29
Comments19

Асинхронная работа с libusb 1.0

Reading time25 min
Views6.7K
Несколько статей назад мы рассмотрели методику работы с USB-устройством при помощи библиотеки libusb. Данные в устройстве у нас формировались по таймеру, поэтому мы были не просто уверены, что рано или поздно они придут к нам, но даже могли предсказать, через какой срок это произойдёт. Однако в анализаторе (который является конечной целью разработки) данные идут непредсказуемо. Будут данные или нет – зависит от поведения объекта контроля.

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

Сегодня мы научимся обращаться к библиотеке libusb асинхронным методом. Это позволит и грубо отслеживать объём уже пришедших данных, и прерывать работу в любой момент, и даже повысить общую производительность системы. Причём всё это будет сделано только за счёт вызова штатных функций libusb. Код для FX3 и ПЛИС мы для этого дорабатывать не будем. Итак, приступаем.


Читать дальше →
Total votes 14: ↑14 and ↓0+14
Comments2

Учимся работать с USB-устройством и испытываем систему, сделанную на базе контроллера FX3

Reading time20 min
Views29K
В двух предыдущих статьях мы сделали USB 3.0 систему на базе контроллера FX3. Пришла пора научиться работать с нею из своих программ для PC. Ну, и попутно понять, насколько получившаяся система пригодна для практического применения. Действительно ли ширины канала хватает на весь поток? И не теряются ли единичные байты из потока? Кто хоть немного поработал тестировщиком, не поверит в то, что если система в принципе работает, значит, работает и в деталях. А я на этой должности проработал лет пять, не меньше, поэтому привык проверять всё на практике. В общем, приступаем.


Читать дальше →
Total votes 18: ↑17 and ↓1+16
Comments12

К вопросу о TI

Reading time19 min
Views6.1K
«Сейчас я покажу вам портрет… Хм… Я предупреждаю вас, что это именно портрет… Во всяком случае, прошу отнестись к нему, как к портрету...

В данном посте пойдет речь о разработке и отладке программ для МК СС1350 в рекомендованной производителем среде разработки CCS. Будут затронуты достоинства (а они есть) и недостатки (а как же без них) вышеупомянутых продуктов. В тексте не будет скриншотов, призванных показать (обведенное кружочком) расположение иконки компиляции в интегрированной среде программирования или выбора файла в директории. Признавая принципиальную возможность статей в подобном стиле, я постараюсь сосредоточиться на концептуальных моментах в надежде, что мой читатель сам сможет разобраться в деталях.

Целью данного опуса, помимо передачи полученного опыта, является попытка возбудить здоровую зависть у отечественных производителей МК, являющихся прямыми конкурентами TI (»на территории страны, где мы с Вами и процветаем") — задача откровенно неблагодарная, но говорят, что капля камень точит.
Читать дальше →
Total votes 18: ↑16 and ↓2+14
Comments11

Простой цифровой радиоприемник на базе контроллера STM32G4 своими руками

Reading time44 min
Views34K

Обучающие проекты по созданию простого цифрового радиоприемника на базе микроконтроллера STM32G431KB.

Читать далее
Total votes 85: ↑85 and ↓0+85
Comments52

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity