• Разгоняем оптрон до сотни

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

    Читать далее
  • Металингвистический совратитель Си. Опус I: Предварительные ласки


      >> Осторожно, модерн! 2 — 0.1. Спор на баксы и девчонок


      Предисловие


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


      Но не всё так радужно… после моих экспериментов в написании нетривиальных метапрограмм на связке Boost/Preprocessor + Boost/VMD я осознал, что с текущими ограничениями удобное и предсказуемое метапрограммирование препроцессора — нечто недостижимое (вы сами в этом убедитесь). И это не решается только бережностью по отношению к коду, это решается обёрткой над стандартным языком препроцессора в виде встроенного метаязыка.


      Такой метаязык я создал, и назвал его Metalang99. Его цель — сделать встроенное в Си метапрограммирование удобоваримым (по сравнению с тем, что было). Это высокоуровневый язык программирования сам по себе, ведь он поставляет управляющие конструкции, типы данных (примитивные и пользовательские), коллекции и другие вещи, свойственные ЯВУ.


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


      Сегодняшняя программа:


      1. Уточним терминологию из CS.
      2. Рассмотрим базовые техники, без которых макросоводство на базе стандартного языка препроцессора невозможно.
      3. Разработаем предметно-ориентированный язык для тестирования ПО.

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

      Читать дальше →
    • Юнит тесты на Си — нет ничего проще

      Прочитав статью «Тестирование встроенных систем» и комментарии к ней я был несколько поражен тем фактом, что многие хабровчане знакомы с книгой «Test Driven Development for Embedded C (Pragmatic Programmers)» и framework-ом Unity, но не используют весь арсенал средств, которые предлагают ребята из throwtheswitch.org.

      Хочу кратко поделится опытом использования этих самых средств.
      Читать дальше →
    • C и Python: мост между мирами

      • Tutorial

      Вам интересно подключить всю мощь Python в свою программу на C? Отлично: в статье содержится минимальный крэш-курс по подключению интерпретатора Python, загрузке своего кода и взаимодействию с ним из программы на C.

      Приготовления завершены
    • USB на регистрах: STM32L1 / STM32F1



        Еще более низкий уровень (avr-vusb)
        USB на регистрах: bulk endpoint на примере Mass Storage
        USB на регистрах: interrupt endpoint на примере HID
        USB на регистрах: isochronous endpoint на примере Audio device

        С программным USB на примере AVR мы уже познакомились, пришла пора взяться за более тяжелые камни — STM32. Подопытными у нас будут классический STM32F103C8T6 а также представитель малопотребляющей серии STM32L151RCT6. Как и раньше, пользоваться покупными отладочными платами и HAL'ом не будем, отдав предпочтение велосипеду.
        Читать дальше →
      • Умный print для C

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

          show me the code
        • ARM и программирование без блокировок

          • Translation


          Выпуск ARM-процессора Apple M1 вдохновил меня на то, чтобы написать в Твиттер про опасности программирования без блокировок (lock-free). Этот твит вызвал бурную дискуссию. Обсуждение прошло довольно неплохо, учитывая то, что попытки втиснуть в рамки Твиттера обсуждениие такой сложной темы, как модели памяти центрального процессора, — в принципе бессмысленны. Но у меня осталось желание немного раскрыть тему.

          Этот пост задуман не только как обычная вводная статья про опасности программирования без блокировок (о которых я в последний раз писал около 15 лет назад), но и как объяснение, почему слабая модель памяти ARM ломает некоторый код, и почему этот код, вероятно, не работал изначально. Я также хочу объяснить, почему стандарт C++11 значительно улучшил ситуацию в программировании без блокировок (несмотря на возражения против противоположной точки зрения).
          Читать дальше →
        • Объяснение легковесных потоков в 200 строк на Rust

          • Translation

          Объяснение легковесных потоков в 200 строк на Rust


          Легковесные потоки (ligthweight threads, coroutines, корутины, green threads) являются очень мощным механизмом в современных языках программирования. В этой статье Carl Fredrik Samson попытался реализовать рантайм для легковесных потоков на Раст, попутно объясняя, как они устроены "под капотом".


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


          Переводил для себя большей частью. Обо всех замечаниях пишите — оперативно исправлю. Старался переводить близко к тексту, но в некоторых местах переформулировал, чтобы читалось легче и было понятнее.
          Читать дальше →
          • +25
          • 7.8k
          • 8
        • saneex.c: try/catch/finally на базе setjmp/longjmp (C99) быстрее стандартных исключений C++¹

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




            Меня всегда восхищала стандартная библиотека Си, да и сам Си — при всей своей минималистичности от них так и веет духом тех самых первых красноглазиков хакеров. В черновике первого официального стандарта (ANSI C, он же C89, он же ANS X3.159-1989, он же, позднее, C90 и IEC 9899:1990) определяется 145 функций и макросов, из них около 25 — это вариации (ввиду отсутствия в языке перегрузок), а 26 чисто математических. K&R во второй редакции² приводят 114 функций (плюс математические), считая остальные за экзотику. В черновике³ C11 функций уже 348, но больше сотни — математика, а еще штук 90 это «перегрузки». А теперь посмотрим на Boost, где одних только библиотек — 160. Чур меня…


            И среди этой сотни-полутора функций всегда были: обработка сигналов, вариативные функции (которые до интерпретируемого PHP дошли 25 лет спустя, а в Delphi, бурно развивавшемся одно время, их нет до сих пор) и порядка 50 строковых функций вроде printf() (м-м-м… JavaScript), strftime() (…) и scanf() (дешевая альтернатива регуляркам).



            А еще всегда были setjmp()/longjmp(), которые позволяют реализовать привычный по другим языкам механизм исключений, не выходя за рамки переносимого Си. Вот о них и поговорим — Quake World, стеки, регистры, ассемблеры и прочая матчасть, а вишенкой будет занятная статистика (спойлер: Visual Studio непостоянна, как мартовский заяц, а throw saneex.c в два раза быстрее всех).


            Текста много, не порежьтесь!
          • Ручное управление памятью в языке Go

            • Translation
            Привет, Хабр!

            Наши читатели не могли не заметить нашего растущего интереса к языку Go. Наряду с книгой из предыдущего поста, у нас найдется на эту тему немало интересного. Сегодня мы хотим предложить вам перевод материала «для профи», в котором демонстрируются интересные аспекты ручного управления памятью на Go, а также одновременное выполнение операций над памятью на Go и C++.
            Читать дальше →
            • +13
            • 6.6k
            • 6
          • C и C++: межъязыковые интерфейсы

            • Translation
            Как известно, C и C++ — это родственные языки между которыми есть много общего. Но их пути, с годами, расходятся всё сильнее. В общих чертах дело обстоит так: код, написанный на одном из этих языков, не может быть скомпилирован под видом кода, написанного на другом. Этому мешает множество больших и маленьких различий между языками. Причём, речь идёт не только о синтаксических различиях. Некоторые общие синтаксические конструкции могут иметь разную семантику. Поэтому обычно нет никакого смысла в том, чтобы компилировать код, написанный на C, с помощью C++-компилятора. Не стоит доверять тем, кто утверждает обратное.

            Правда, есть одна сфера, где обычно наблюдается согласие между C и C++. Это — ABI (Application Binary Interface, двоичный интерфейс приложений). Структуры данных и функции одного языка могут быть, в той или иной мере, использованы в другом языке. C и C++, кроме того, достаточно сильно пересекаются в области спецификаций интерфейсов, вследствие чего один и тот же заголовочный файл можно использовать из кода, написанного на обоих языках.



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

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

              Читать далее
            • Docs as Code. Часть 2: получаем документацию из кода



                Продолжаем рассказывать о применении на практике принципа работы с документацией как с кодом. В этот раз разберём получение спецификации Swagger напрямую из комментариев к коду API. В статье рассматривается роль технического писателя в процессе адаптации команды к использованию нового инструмента, а также приводятся конкретные инструкции по применению swagger-php в реальном проекте.
                Читать дальше →
                • +21
                • 3.8k
                • 4
              • Настраиваем простой VPN с WireGuard и Raspberry Pi в качестве сервера

                • Translation
                • Tutorial
                Поскольку WireGuard станет частью будущего ядра Linux 5.6, я решил посмотреть, как лучше всего интегрировать этот VPN с моим LTE-маршрутизатором/точкой доступа на Raspberry Pi.

                Оборудование


                • Raspberry Pi 3 с модулем LTE и публичным IP-адресом. Здесь будет VPN-сервер (далее в тексте он называется edgewalker)
                • Телефон на Android, который должен использовать VPN для всех коммуникаций
                • Ноутбук Linux, который должен использовать VPN только внутри сети

                Каждое устройство, которое подключается к VPN, должно иметь возможность подключаться ко всем другим устройствам. Например, телефон должен иметь возможность подключаться к веб-серверу на ноутбуке, если оба устройства являются частью сети VPN. Если настройка получится достаточно простой, то можно подумать о подключении к VPN и десктопа (по Ethernet).
                Читать дальше →
                • +19
                • 30.8k
                • 2
              • Двоичные и побитовые операции в PHP

                • Translation

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

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

                А теперь к делу! В этой статье я расскажу много интересного о побитовых операциях, двоичной и шестнадцатеричной обработке, которые будут полезны в ЛЮБОМ языке.
                Читать дальше →
              • Трюки с виртуальной памятью

                • Translation

                Я уже довольно давно хотел написать пост о работе с виртуальной памятью. И когда @jimsagevid в ответ на мой твит написал о ней, я понял, что время пришло.

                Виртуальная память — очень интересная штука. Как программисты, мы прекрасно знаем, что она есть (по крайней мере, во всех современных процессорах и операционных системах), но часто забываем о ней. Возможно, из-за того, что в популярных языках программирования она не присутствует в явном виде. Хотя иногда и вспоминаем, когда наш софт начинает тормозить (а не падать) из-за нехватки физической оперативной памяти.

                Но, оказывается, с помощью виртуальной памяти можно делать довольно интересные вещи.

                Читать далее
              • Описание HDCP

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

                Ознакомиться
                • +24
                • 4.6k
                • 2
              • Сервер очень точного времени stratum 1 на Garmin GPS

                  GPS приемники можно использовать не только для определения местоположения, но и для получения сигналов точного времени. В статье я покажу как настроить сервер точного времени, использующий в качестве источника GPS и работающий с точностью до нескольких микросекунд. В качестве примера я использую приемник Garmin и ОС FreeBSD, но статья также будет полезна обладателям Linux и Windows.



                  UPD: сервер доступен по адресу stratum1.net Веб-морда: www.stratum1.net.

                  Читать дальше →
                • Поточный шифр SNOW

                  Зима. Время валяться в сугробах и играть в снежки. Или почитать статью о поточных шифрах. Кому что больше нравится.

                  Данная статья является обзорной. Мы поговорим об устройстве 1 версии SNOW 1.0, вкратце об различных совершенных на шифр атаках и об применении его модификаций.

                  Читать далее
                  • +22
                  • 1.8k
                  • 2