Pull to refresh
-8
0

User

Send message

Приёмы неблокирующего программирования: введение в compare-and-swap

Reading time11 min
Views7.7K

В первой части этого цикла статей мы рассмотрели теорию, стоящую за одновременным доступом в моделях памяти, а также применение этой теории к простым чтениям и записям в память. Правда, этих примитивов оказывается недостаточны для построения высокоуровневых механизмов синхронизации вроде спинлоков, мьютексов и условных переменных. Хоть и полные барьеры памяти позволяют синхронизировать потоки с помощью приёмов, рассмотренных в предыдущей части (алгоритм Деккера), современные процессоры позволяют получить нужный эффект проще, быстрее и гибче — да, всё сразу! — с помощью операций compare-and-swap.


Для программистов ядра Linux операция обмена compare-and-swap выглядит так:


    T cmpxchg(T *ptr, T old, T new);

где T может быть либо числовым типом не больше указателя, либо указателем на что-нибудь. Так как в C нет обобщённых функций, то подобный полиморфизм реализуется макросами. cmpxchg() — это очень аккуратно реализованный макрос, который ведёт себя как функция (например, вычисляет аргументы только один раз). В Linux также есть макрос cmpxchg64(), который работает с 64-битными целыми числами и недоступен на 32-битных платформах.


cmpxchg() читает значение по указателю *ptr и, если оно равно old, то заменяет его на new. Иначе же после чтения ничего не происходит. Считанное значение возвращается как результат операции, независимо от того, произошла ли запись. И всё это выполняется атомарно: если другой поток одновременно с cmpxchg() записывает что-то по адресу *ptr, то cmpxchg() ничего не меняет. Либо old становится new, либо текущее значение остаётся нетронутым. Поэтому cmpxchg() называют атомарной операцией read-modify-write.

Читать дальше →
Total votes 12: ↑9 and ↓3+6
Comments0

Что детям нужно знать про зубы пожилых родственников

Reading time11 min
Views21K
image
Минимальный вариант протезирования, позволяющий жевать стейк лет этак в 75.

Взрослые дети часто не знают, что у пожилых родителей есть проблемы с зубами. Родители могут не поделиться по разным причинам и по нашему опыту нередко пытаются решить что-то своими силами, когда уже поздно и неэффективно. А зубы очень сильно влияют на качество жизни пожилого человека и его самоощущение. Когда можно спокойно жевать пищу, не испытывать неудобство в разговоре (чтобы зубы не выпадали) — это уже хорошо. Но многие привыкли хранить зубы в стаканчике, даже не зная, что давно уже можно сделать всё гораздо лучше и удобнее. Правда, конечно, не в рамках ОМС. То есть часто сами они позволить себе такое не могут, а обременять детей не хотят. Детям же надо знать, что стоматологическое здоровье влияет на здоровье всего организма, и снижение воспалительной нагрузки сильно облегчит прогнозы многих заболеваний.

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

Я хочу рассказать про относительно малоинвазивные методики имплантации для пожилых, которые принципиально меняют качество жизни. И вообще про то, что вам как детям нужно знать про зубы своих родителей.
Total votes 54: ↑49 and ↓5+44
Comments29

Создание аналога посмертного сore dump для микроконтроллера

Reading time8 min
Views4.7K


При разработке программного обеспечения любого класса и назначения, зачастую приходится заниматься поиском ошибок, которые привели к краху всего приложения. И если в случае обычного компьютера, анализ логов и core dump`ов как правило не вызывает сложностей, то для устройств на основе микроконтроллеров бывает сложно получить «посмертную» информацию, необходимую для изучения проблемы.

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

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

Ну и в соответствии с собственным наблюдением Хабр — ума палата, буду рад любым комментариям и предложениям, которые помогут протестировать или улучшить предлагаемое решение.
Читать дальше →
Total votes 8: ↑8 and ↓0+8
Comments11

Про запуск трехфазных двигателей, косинус φ и не только…

Reading time16 min
Views57K

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

Читать далее
Total votes 64: ↑63 and ↓1+62
Comments73

Приёмы неблокирующего программирования: полные барьеры памяти

Reading time9 min
Views8.7K

В первых двух статьях цикла мы рассмотрели четыре способа упорядочить доступ к памяти: load-acquire и store-release операции в первой части, барьеры чтения и записи в память — во второй. Теперь пришла очередь познакомиться с полными барьерами памяти, их влиянием на производительность, и примерами использования полных барьеров в ядре Linux.


Рассмотренные ранее примитивы ограничивают возможный порядок исполнения операций с памятью четырьмя различными способами:


  • Load-acquire операции выполняются перед последующими чтениями и записями.
  • Store-release операции выполняются после предыдущих чтений и записей.
  • Барьеры чтения разделяют предыдущие и последующие чтения из памяти.
  • Барьеры записи разделяют предыдущие и последующие записи в память.

Внимательный читатель заметил, что одна из возможных комбинаций в этом списке отсутствует:

Чтение выполняется... Запись выполняется...
… после чтения smp_load_acquire(), smp_rmb() smp_load_acquire(), smp_store_release()
… после записи ??? smp_store_release(), smp_wmb()
Оказывается, обеспечить глобальный порядок записей и последующих чтений из памяти гораздо сложнее. Процессоры вынуждены прилагать отдельные усилия для этого. Сохранение такого порядка стоит недёшево и требует явных инструкций. Чтобы понять причину этих особенностей, нам придётся спуститься на уровнь ниже и присмотреться к тому, как процессоры работают с памятью.
Читать дальше →
Total votes 10: ↑10 and ↓0+10
Comments4

Новый поток в C++20: std::jthread

Reading time5 min
Views11K

Один из участников моего семинара в рамках CppCon 2018 спросил меня: «Может ли std::thread быть прерван (interrupted)?». Мой ответ тогда был - нет, но это уже не совсем так. С C++20 мы можем получить std::jthread (в итоге все таки получили - прим. переводчика).

Позвольте мне развить тему, поднятую на CppCon 2018. Во время перерыва в моем семинаре посвященному параллелизму я побеседовал с Николаем (Йосуттисом). Он спросил меня, что я думаю о новом предложении P0660: Cooperatively Interruptible Joining Thread. На тот момент я ничего не знал об этом предложении. Следует отметить, что Николай является одним из авторов этого предложения (наряду с Хербом Саттером и Энтони Уильямсом). Сегодняшняя статья посвящена будущему параллелизма в C++. Ниже я привел общую картину параллелизма в текущем и грядущем C++.

Читать далее
Total votes 14: ↑9 and ↓5+4
Comments2

Как «раскирпичить» STM32

Reading time3 min
Views46K

Здравствуйте! Меня зовут Дмитрий Руднев. В этой публикации я поделюсь своим горьким опытом.

В современной разработке широко используются микроконтроллеры STM32. Они обладают неплохим соотношением цена/производительность, вокруг них сложилась развитая «экосистема». Для прошивки этих микроконтроллеров и внутрисхемной отладки обычно используют интерфейс Serial Wire (SWD).

В процессе отладки бывает всякое. Не беда, если STM32 после прошивки ведёт себя неадекватно. Обидно, если при этом к нему не удаётся подключиться.

На этом месте не надо впадать в отчаяние, т.к. «убить насмерть» STM32 в процессе программирования непросто, и его работоспособность можно восстановить штатными средствами.
Как это сделать, читайте дальше
Total votes 61: ↑53 and ↓8+45
Comments37

Использование лямбда-выражений в необобщённом коде C++

Reading time6 min
Views7.2K

Появившиеся в C++11 лямбды стали одной из самых крутых фич нового стандарта языка, позволив сделать обобщённый код более простым и читабельным. Каждая новая версия стандарта C++ добавляет новые возможности лямбдам, делая обобщённый код ещё проще и читабельнее. Вы заметили, что слово «обобщённый» повторилось дважды? Это неспроста – лямбды действительно хорошо работают с кодом, построенным на шаблонах. Но при попытке использовать их в необобщённом, построенном на конкретных типах коде, мы сталкиваемся с рядом проблем. Статья о причинах и путях решения этих проблем.

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

Как подключить содержимое любых файлов для использования в коде C / C++

Reading time5 min
Views23K

Задача состояла в подключении файлов: HTML, JS, CSS; без специальной подготовки. Так же неудобно подключать бинарные файлы (например картинки) конвертируя их в HEX. Так как не хотелось конвертировать в HEX или разделять на строки, искал способ подключения файла в адресное пространство программы.

Читать дальше →
Total votes 84: ↑83 and ↓1+82
Comments33

Приёмы неблокирующего программирования: атомарные операции и частичные барьеры памяти

Reading time8 min
Views11K

В первой статье цикла мы познакомились с простыми неблокирующими алгоритмами, а также рассмотрели отношение “happens before”, позволяющее их формализовать. Следующим шагом мы рассмотрим понятие «гонки данных» (data race), а также примитивы, которые позволяют избежать гонок данных. После этого познакомимся с атомарными примитивами, барьерами памяти, а также их использованием в механизме “seqcount”.


С барьерами памяти некоторые разработчики ядра Linux уже давно знакомы. Первый документ, содержащий что-то похожее на спецификацию гарантий, предоставляемых ядром при одновременном доступе к памяти — он так и называется: memory-barriers.txt. В этом файле описывается целый зоопарк барьеров вместе с ожидаемым поведением многопоточного кода в ядре. Также там описывается понятие «парных барьеров» (barrier pairing), что похоже на пары release-acquire операций и тоже помогает упорядочивать работу потоков.


В этой статье мы не будем закапываться так же глубоко, как memory-barriers.txt. Вместо этого мы сравним барьеры с моделью acquire и release-операций и рассмотрим, как они упрощают (или, можно сказать, делают возможной) реализацию примитива “seqcount”. К сожалению, даже если ограничиться лишь наиболее популярными применениями барьеров — это слишком обширная тема, поэтому о полных барьерах памяти мы поговорим в следующий раз.

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

3. Частотные характеристики звеньев и систем автоматического управления. ч. 3.4 Апериодическое звено 2−го порядка

Reading time6 min
Views19K

Лекции по курсу «Управление Техническими Системами» читает Козлов Олег Степанович на кафедре «Ядерные реакторы и энергетические установки» факультета «Энергомашиностроения» МГТУ им. Н.Э. Баумана. За что ему огромная благодарность!

Данные лекции готовятся к публикации в виде книги, а поскольку здесь есть специалисты по ТАУ, студенты и просто интересующиеся предметом, то любая критика приветствуется.

В предыдущих сериях:
1. Введение в теорию автоматического управления.
2. Математическое описание систем автоматического управления 2.1 — 2.32.3 — 2.82.9 — 2.13.
3. ЧАСТОТНЫЕ ХАРАКТЕРИСТИКИ ЗВЕНЬЕВ И СИСТЕМ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ (РЕГУЛИРОВАНИЯ).
3.1. Амплитудно-фазовая частотная характеристика: годограф, АФЧХ, ЛАХ, ФЧХ.

3.2. Типовые звенья систем автоматического управления (регулирования). Классификация типовых звеньев. Простейшие типовые звенья.

3.3. Апериодическое звено 1–го порядка (инерционное звено). На примере входной камеры ядерного реактора.

Тема сегодняшней статьи:

3.4. Апериодическое звено второго порядка.

Как всегда будет жестко, познавательно и интересно.

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

Модели памяти C++ и CLR

Reading time16 min
Views37K

Это расшифровка-перевод доклада Саши Гольдштейна, признанного лучшим на конференции DotNext 2016 Piter. С годами этот доклад стал лишь актуальнее прежнего: появление Mac на ARM-процессорах — еще один пример, почему разработчикам сегодня нужно думать не только о x86-архитектуре.



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


То, что подходит процессорам Intel на архитектурах x86 и x86-64, может не подойти другой архитектуре. Как только вы перенесете свой код на другой процессор, например, на ARM для iPhone и Android, есть вероятность, что он перестанет работать как надо. Проблемы могут быть как очевидными (воспроизводиться с первого-второго раза), так и не очень (возникать только раз в миллион итераций). Вполне вероятно, что такие баги могут добраться до продакшна. Сегодня .NET и, конечно, C++ можно использовать не только на Windows и Intel, но и на других платформах, так что доклад будет полезен многим разработчикам.


Дисклеймер: статья предназначена для продвинутых читателей. Смотрите на свой страх и риск. За частое упоминание барьеров памяти и изменения порядка исполнения инструкций она получила возрастное ограничение 18+.
Читать дальше →
Total votes 72: ↑71 and ↓1+70
Comments4

Раскладываем по полочкам параметры АЦП

Reading time10 min
Views76K
Привет, Хабр! Многие разработчики систем довольно часто сталкиваются с обработкой аналоговых сигналов. Не все манипуляции с сигналами можно осуществить в аналоговой форме, поэтому требуется переводить аналог в цифровой мир для дальнейшей постобработки. Возникает вопрос: на какие параметры стоит обратить внимание при выборе микроконтроллера или дискретного АЦП? Что все эти параметры означают? В этой статье постараемся детально рассмотреть основные характеристики АЦП и разобраться на что стоит обратить внимание при выборе преобразователя.

image

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

RS485 — стандарт промышленных сетей. Какими особенностями обладает микросхема приемопередатчика?

Reading time9 min
Views81K

При построении сети для общения между большим количеством устройств, можно задуматься: а какой интерфейс выбрать? У каждого интерфейса есть свои плюсы и минусы, которые определяют их применение: CAN – автомобилестроение, RS485/RS232 – промышленность, Ethernet – потребительская электроника/сервера. Какие “фичи” микросхемы приёмопередатчика помогают обезопаситься от множества проблем при монтаже и эксплуатации? Как происходит процесс измерений и исследования микросхем приемопередатчиков? Новая микросхема RS485 готова к выходу на рынок!
Читать дальше →
Total votes 121: ↑120 and ↓1+119
Comments80

Достучаться до небес, или FSM на шаблонах

Reading time13 min
Views14K

Здравствуйте! Меня зовут Александр, я работаю инженером-программистом микроконтроллеров.

Пишу на С/С++, причем предпочитаю плюсы, ибо верую в их эволюционную неизбежность в embedded.

Мир встроенного ПО, язык С++ динамично развиваются, поэтому разработчикам важно не отставать и поддерживать свои скиллы и наработки актуальными моменту.

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

Некоторое время назад я посмотрел мощный доклад Сергея Федорова про построение конечного автомата с таблицей переходов на шаблонах.

Читать далее
Total votes 20: ↑17 and ↓3+14
Comments24

Неуловимый эталон времени: новый тип сверхточных атомных часов

Reading time9 min
Views6.5K


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

Еще один аспект бытия, который мы по своей наивности считаем подконтрольным нам, это время. Мы его уделяем, коротаем, экономим, измеряем и отсчитываем, но по большей степени мы его теряем. Атомные часы считаются идеальным инструментом измерения времени. Но с каждым новым таким устройством предыдущее теряет свой «эталонный» статус, а идеал, как ему это свойственно, становится на шаг ближе и на два шага дальше.

Сегодня мы познакомимся с исследованием ученых из МТИ (Массачусетский технологический институт, США), в котором они описывают новый тип атомных часов, способных отсчитывать время точнее своих предшественников. Каковы фундаментальные физические принципы, заложенные в данное устройство, как оно работает, и насколько точно в этот ученые отмеряют время? Ответы на эти вопросы ждут нас в докладе ученых. Поехали.
Читать дальше →
Total votes 17: ↑17 and ↓0+17
Comments1

Все ли автопроизводители хотят работать с собственными операционными системами

Reading time7 min
Views5K
image


Многие автомобильные OEM и Tier-1 компании завидуют Tesla. Осознавая, что самой большой проблемой автомобильной промышленности является программное обеспечение, производители автомобилей (от Volkswagen до Hyundai), занимаются разработкой собственных ОС – как у Tesla.

Это сложная задача (если вообще не фантастика). Чтобы тягаться с Tesla, компаниям нужно будет не просто разработать ПО, которое можно будет обновлять по воздуху, или сделать классный пользовательский интерфейс.

Им нужно будет разработать полноценные ОС.

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

В конце прошлого месяца компания Elektrobit (Эрланген, Германия) представила «первую в отрасли программную платформу» под названием EB xelor. Практически в то же время компания TTTech Auto (Вена, Австрия) анонсировала программную платформу для автопроизводителей. Их решение называется MotionWise – «проверенная программная платформа безопасности для автоматизированной езды». TTTech Auto также объявила о создании подразделения Car.OS, которое станет расширением команды MotionWise и поможет автопроизводителям в разработке собственных ОС.
Total votes 6: ↑5 and ↓1+4
Comments14

Запуск сложных C++ приложений на микроконтроллерах

Reading time8 min
Views12K
image Сегодня никого не удивить возможностью разрабатывать на C++ под микроконтроллеры. Проект mbed полностью ориентирован на этот язык. Ряд других RTOS предоставляют возможности разработки на С++. Это удобно, ведь программисту доступны средства объектно-ориентированного программирования. Вместе с тем, многие RTOS накладывают различные ограничения на использование C++. В данной статье мы рассмотрим внутреннюю организацию C++ и выясним причины этих ограничений.
Читать дальше →
Total votes 22: ↑21 and ↓1+20
Comments14

Как избавиться от if-else при помощи команд и обработчиков

Reading time6 min
Views30K


В этой статье я расскажу, как использую команды и обработчики, чтобы код был удобным и аккуратным. Я стремился не избавиться от if-elseif-else, а найти более подходящее решение.

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

Рассматриваемый в статье способ — просто один из многих.

Сама по себе конструкция if-else не так уж плоха. Мы просто попали в ситуацию «когда в руках молоток, всё вокруг кажется гвоздями». В основах программирования мы изучаем условные операторы и многим разработчикам не удаётся перерасти их использование.

Однако if-else и switch зачастую неидеальны. Программисты обычно пренебрегают более качественными решениями, например, полиморфическим исполнением и словарями.
Читать дальше →
Total votes 47: ↑37 and ↓10+27
Comments39

Заметки о Unix: системный вызов write(), на самом деле, не такой уж и атомарный

Reading time6 min
Views8.3K


Недавно я читал материал Эвана Джонса «Устойчивое хранение данных и файловые API Linux». Я полагаю, что автор этой довольно хорошей статьи ошибается, говоря о том, чего можно ожидать от команды write() (и в том виде, в каком она описана в стандарте POSIX, и на практике). Начну с цитаты из статьи:

Системный вызов write() определён в стандарте IEEE POSIX как попытка записи данных в файловый дескриптор. После успешного завершения работы write() операции чтения данных должны возвращать именно те байты, которые были до этого записаны, делая это даже в том случае, если к данным обращаются из других процессов или потоков (вот соответствующий раздел стандарта POSIX). Здесь, в разделе, посвящённом взаимодействию потоков с обычными файловыми операциями, имеется примечание, в котором говорится, что если каждый из двух потоков вызывает эти функции, то каждый вызов должен видеть либо все обозначенные последствия, к которым приводит выполнение другого вызова, либо не видеть вообще никаких последствий. Это позволяет сделать вывод о том, что все файловые операции ввода/вывода должны удерживать блокировку ресурса, с которым работают.

Означает ли это, что операция write() является атомарной? С технической точки зрения — да. Операции чтения данных должны возвращать либо всё, либо ничего из того, что было записано с помощью write(). […].
Читать дальше →
Total votes 46: ↑41 and ↓5+36
Comments7

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity