Pull to refresh
6
0
Никита Булаев @bulaev

User

Send message

Современные Unix программы

Reading time3 min
Views25K
Наше внимание привлёк один интересный репозиторий, который называется Modern Unix. В нём собраны, в основном, современные альтернативы классическим Unix-командам. Всего там имеется почти три десятка описаний таких команд. Надеемся, вы найдёте среди них что-то такое, что вам пригодится.


Читать дальше →
Total votes 68: ↑62 and ↓6+56
Comments48

std::move vs. std::forward

Reading time8 min
Views41K

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

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

Предельная скорость USB на STM32F103, чем она обусловлена?

Reading time18 min
Views18K
У данной статьи тяжёлая история. Мне надо было сделать USB-устройства, не выполняющие никакой функции, но работающие на максимальной скорости. Это были бы эталоны для проверки некоторых вещей. HS-устройство я сделал на базе ПЛИС и ULPI, загрузив туда «прошивку» на базе проекта Daisho. Для FS-устройства, разумеется, была взята «голубая пилюля». Скорость получалась смешная. Прямо скажем, черепашья скорость.



Но я же крутой, у меня теперь есть USB-анализатор (его разработка была описана в блоке из нескольких предыдущих статей). Посмотрев логи, я понял, что похоже, знаю, почему скорость невозможно поднять, даже если STM32F103 обслуживает исключительно USB и ничего больше. Даже начал писать о результатах… Но потом решил, что кому-то это будет не интересно, а кто-то скажет, что и так это знал.

Но неожиданно, с тех пор мне по работе уже трижды приходилось пересказывать эти результаты то Заказчикам, то коллегам. Все они считали, что этот контроллер может больше. И мне приходилось вновь и вновь показывать физическую суть. Поэтому сделать документ было нужно хотя бы чтобы давать его прочесть тем, кто вновь будет говорить, что шина шустрая, контроллер быстрый… Ну, а если и делать документ, то почему бы не оформить его в виде статьи и не выложить на всеобщее обозрение?

Итак, давайте выясним, почему именно STM32F103C8T6 не может прокачать по шине USB данные на скорости 12 мегабит, заняв всю ширину предоставленного канала, и можно ли с этим что-то сделать.
Читать дальше →
Total votes 61: ↑59 and ↓2+57
Comments73

Парсим протобаф на скорости больше 2 Гб/с.: как я научился любить хвостовую рекурсию в C

Reading time10 min
Views12K


Отличную функцию недавно добавили в основную ветку компилятора Clang. С помощью атрибутов [[clang::musttail]] или __attribute__((musttail)) теперь можно получить гарантированные хвостовые (tail) вызовы в C, C++ и Objective-C.

int g(int);
int f(int x) {
    __attribute__((musttail)) return g(x);
}

(Онлайн-компилятор)
Читать дальше →
Total votes 41: ↑40 and ↓1+39
Comments12

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

Reading time11 min
Views7.6K

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

Полезные консольные Linux утилиты

Reading time13 min
Views107K

В этой подборке представлены полезные малоизвестные консольные Linux утилиты. В списке не представлены Pentest утилиты, так как у них есть своя подборка.


Осторожно много скриншотов. Добавил до ката утилиту binenv.


binenv — cамая интересная утилита для установки новых популярных программ в linux, но которых нет в пакетном менеджере.

Читать дальше →
Total votes 118: ↑114 and ↓4+110
Comments110

Программа для создания deb-пакетов

Reading time2 min
Views7.2K

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

Читать далее
Total votes 14: ↑12 and ↓2+10
Comments12

Валидация UTF-8 меньше чем за одну инструкцию на байт

Reading time9 min
Views23K


Даниэль Лемир – профессор Заочного квебекского университета (TÉLUQ), придумавший способ очень быстро парсить double – совместно с инженером Джоном Кайзером из Microsoft опубликовали ещё одну свою находку: валидатор UTF-8, обгоняющий библиотеку UTF-8 CPP (2006) в 48..77 раз, ДКА от Бьёрна Хёрманна (2009) – в 20..45 раз, и алгоритм Google Fuchsia (2020) – в 13..35 раз. Новость об этой публикации на хабре уже постили, но без технических подробностей; так что восполняем этот недочёт.
Читать дальше →
Total votes 122: ↑122 and ↓0+122
Comments14

Лайфхак: как спарсить гигабайт double-ов в секунду

Reading time6 min
Views23K


Как в коде на C++ прочитать значение double из строки?

std::stringstream in(mystring);
while(in >> x) {
   sum += x;
}

На Intel Skylake с компилятором GCC 8.3, такой код парсит 50 МБ/с. Жёсткие диски запросто обеспечивают последовательное чтение со скоростью в несколько ГБ/с, так что вне всякого сомнения, нас ограничивает не скорость чтения с диска, а именно скорость парсинга. Как его ускорить?

Первое, что напрашивается – отказаться от удобств, предоставляемых потоками в C++, и вызывать strtod(3) напрямую:

do {
    number = strtod(s, &end);
    if(end == s) break;
    sum += number;
    s = end; 
} while (s < theend);

Скорость вырастает до 90 МБ/с; профайлинг показывает, что при чтении из потока выполняется ~1600 инструкций на каждое читаемое число, при использовании strtod – ~1100 инструкций на число. Стандартные библиотеки Си и C++ можно оправдать требованиями универсальности и переносимости; но если ограничиться парсингом только double и только на x64, то можно написать намного более эффективный код: хватит 280 инструкций на число.
Читать дальше →
Total votes 104: ↑102 and ↓2+100
Comments62

Как имитировать марсианский рассвет: обзор умных систем освещения Nanoleaf Shapes

Reading time6 min
Views6.6K

Мечтаете украсить дом цветными огнями светодиодной подсветки, но не знаете, с чего начать? Что же, теперь у вас есть вариант: новая серия умных модульных систем освещения Nanoleaf Shapes. Она так называется, потому что все модули, или панели, имеют разную форму. А значит, с этой системой можно сделать куда больше, чем с ее предшественницами: Aurora (переименована в Light) и Canvas.

Рассказываем, в чем прелесть световых панелей новой серии Shapes.

Ну, и в чем же?
Total votes 6: ↑6 and ↓0+6
Comments1

Multithreading

Reading time77 min
Views176K

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

Читать далее
Total votes 22: ↑20 and ↓2+18
Comments3

Часть 2. MPI — Учимся следить за процессами

Reading time5 min
Views18K

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

Познакомимся с MPI поближе
Total votes 6: ↑6 and ↓0+6
Comments5

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

Reading time9 min
Views8.6K

В первых двух статьях цикла мы рассмотрели четыре способа упорядочить доступ к памяти: 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

Составное устройство USB на STM32. Часть 4: Два-в-одном

Reading time11 min
Views10K

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

Работа составных частей устройства была описана во второй и третьей частях публикации.

Ответы на вопрос, зачем это всё было затеяно, даются в начале первой части и в конце четвёртой.
Читать дальше →
Total votes 34: ↑34 and ↓0+34
Comments13

Вышли ожидаемые релизы от Google: Flutter 2 и язык Dart 2.12

Reading time3 min
Views15K

Корпорация Google продолжает развивать свои продукты. Несколько дней назад была представлена новая версия построения интерфейса пользователя Flutter 2. Она, по словам разработчиков, стала универсальным фреймворком, который позволяет разрабатывать любые типы программ. Это могут быть приложения как для десктопов, так и web-сервисы.

Flutter в процессе эволюции стал неплохой альтернативой React Native. Его главное достоинство — возможность на основе одной кодовой базы создавать приложения для разных платформ, включая iOS, Android, Windows, macOS и Linux. Плюс можно разрабатывать и чисто браузерные приложения. И да, обновление до 2 версии не влияет на поддержку продуктов, написанных на Flutter 1. Они без дополнительного редактирования кода могут быть адаптированы для работы на рабочем столе и в Web.
Читать дальше →
Total votes 42: ↑42 and ↓0+42
Comments19

Кунг-фу стиля Linux: разбираемся с последовательными портами

Reading time8 min
Views21K
Раньше последовательные порты были буквально повсюду. И они, в каком-то смысле, никуда и не делись, так как многое, что подключается к компьютеру по USB, на самом деле, выглядит для системы как последовательный порт. Проблема тут заключается в том, что в наши дни всё в мире завязано на компьютерные сети. Конечно, можно купить терминальный сервер, который преобразует последовательный порт в интерфейс Ethernet. Но это совсем не интересно. Здесь я хочу рассказать о том, как пробрасывать последовательные порты по сети с использованием существующих Linux-инструментов. Решение это не идеальное, оно оказывается работоспособным далеко не всегда, но если оно работает, то работает оно хорошо.


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

Умный print для C

Reading time3 min
Views18K

Для тех кто пишет на С, возможно, будет интересно как мне удалось создать умную функцию print(), в которую можно кидать переменные любого типа — дженерик print.

show me the code
Total votes 90: ↑87 and ↓3+84
Comments30

АЦП преобразования в указанные моменты времени на STM32

Reading time5 min
Views22K

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

Читать далее
Total votes 28: ↑27 and ↓1+26
Comments14

Решение уравнения тетраэдра доказано спустя десятки лет после компьютерного поиска

Reading time8 min
Views9.3K
Как четыре математика решили вопрос о базовых геометрических фигурах, создав полный список тетраэдров с рациональными углами при помощи методов теории чисел.

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

Тетраэдр — это простейшая трехмерная фигура с плоскими сторонами. Его основные свойства озадачивали пытливые умы еще во времена Платона и Аристотеля. А в ноябре 2020 было опубликовано окончательное доказательство, в котором достоверно идентифицированы все существующие особые тетраэдры. В этой работе математики отвечают на вопрос о древней фигуре благодаря передовым технологиям, которые дают возможность использовать новый метод поиска решений определенных уравнений.
Читать дальше →
Total votes 23: ↑18 and ↓5+13
Comments14

Юноше, обдумывающему электронику. Ключи к материалу для самостоятельного изучения

Reading time6 min
Views19K
Перевод учебника «Искусство схемотехники» пополнился Частью 3, в которой разбираются полевые транзисторы. Книга приобрела целостный, хотя всё ещё не окончательный, вид. На данный момент отсутствуют три части — 11 («Программируемая логика»), 14 («Компьютеры, контроллеры и шины данных»), 15 («Микроконтроллеры») — и таблицы. Таблицы отложены до завершения перевода (там почти одни цифры, с которыми можно ознакомиться и в оригинале), а остающиеся темы при всём уважении к авторам лучше изучать по другим источникам. В анонсе перевода среди жалоб на несовершенство мира была высказана мысль о необходимости грамотного руководства освоением нового материала. Здесь предлагается метод изучения, рационализирующий данный процесс и некоторые соображения о повышении КПД знаний, относящиеся к системе Цеттелкастен.
Читать дальше →
Total votes 31: ↑29 and ↓2+27
Comments18

Information

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