Как стать автором
Обновить
15
0
Гудин Владимир @Gudin

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

Отправить сообщение

Пишем обобщённую хеш-таблицу с открытой адресацией на чистом C

Время на прочтение28 мин
Количество просмотров19K

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

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

К разработке этой библиотеки и написанию статьи меня натолкнуло отсутствие незаброшенной библиотеки эффективных хеш-таблицы для C.

Читать далее
Всего голосов 24: ↑20 и ↓4+22
Комментарии38

Изобретаем библиотеку vusb

Время на прочтение27 мин
Количество просмотров18K

Введение


После прочтения названия может возникнуть закономерный вопрос: зачем в наше время изучать программную реализацию low-speed USB, когда существует куча дешевых контроллеров с аппаратным модулем? Дело в том, что аппаратный модуль, скрывая уровень обмена логическими уровнями, превращает протокол USB в своеобразную магию. Для того же, чтобы прочувствовать как эта «магия» работает, нет ничего лучше, чем воспроизвести ее с нуля, начиная с самого низкого уровня.


С этой целью попробуем изготовить на основе контроллера ATmega8 устройство, прикидывающееся USB-HID'ом. В отличие от распространенной литературы, мы пойдем не от теории к практике, от самого нижнего уровня к верхнему, от логических напряжений на выводах, и закончим «изобретением» той самой vusb, после каждого шага проверяя, работает ли код как ожидалось. Отдельно отмечу, что не изобретаю альтернативу этой библиотеке, а напротив, последовательно воспроизвожу ее исходный код, максимально сохраняя оригинальную структуру и названия, поясняя, для чего служит тот или иной участок. Впрочем, привычный для меня стиль написания кода отличается от стиля авторов vusb. Сразу же честно признаюсь, что помимо альтруистического интереса (рассказать другим сложную тему) имею и корыстный — изучить тему самостоятельно и через объяснение выловить для себя максимум тонких моментов. Отсюда же следует, что какой-то важный момент может быть упущен, или какая-то тема не до конца раскрыта.


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


Также отмечу, что рассматривается только low-speed USB, даже без упоминания, чем отличаются более скоростные разновидности.

Читать дальше →
Всего голосов 33: ↑33 и ↓0+33
Комментарии22

USB на регистрах: bulk endpoint на примере Mass Storage

Время на прочтение13 мин
Количество просмотров9.7K


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

В прошлый раз мы познакомились с общими принципами организации USB и собрали простое устройство, иллюстрирующее работу конечной точки типа Control. Пришло время изучать следующий тип — Bulk. Конечные точки такого типа предназначены для обмена большими объемами информации, причем чувствительной к надежности, но не скорости обмена.

Классические примеры — запоминающие устройства и переходники вроде USB-COM. Но переходники требуют еще наличия конечной точки типа Interrupt, которую мы пока «не проходили», так что остановимся на эмуляции флешки. Точнее, двух флешек одновременно.
Читать дальше →
Всего голосов 19: ↑19 и ↓0+19
Комментарии37

USB на регистрах: виртуальная FAT16

Время на прочтение15 мин
Количество просмотров12K

image
USB на регистрах: STM32L1 / STM32F1
USB на регистрах: bulk endpoint на примере Mass Storage


Уже довольно давно я пытался разобраться, как же устроена классическая файловая система FAT и вот наконец критическая масса обрывочных сведений в моей голове привела к качественному скачку и закономерному воплю "а что, все действительно настолько просто?!". Нет, разумеется, в FAT полно причудливых костылей, наросших за время ее эволюции, но сама идея и правда проста. Настолько, чтобы реализовать ее эмуляцию на контроллерах вроде stm32f103, stm32l151 в достаточном для ряда задач объеме. То есть наше устройство будет прикидываться флешкой смешного объема, запись и чтение которой будут не приводить к перезаписи памяти, а обрабатываться исключительно кодом.

Читать дальше →
Всего голосов 40: ↑40 и ↓0+40
Комментарии5

Виртуальный COM-порт на STM32 или как управлять контроллером через USB не привлекая внимания санитаров

Время на прочтение24 мин
Количество просмотров28K

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

как же оно всё-таки работает
Всего голосов 28: ↑26 и ↓2+34
Комментарии9

Отладка микроконтроллера через Type-C кабель

Время на прочтение4 мин
Количество просмотров7.7K

Как избавиться от дополнительных разъемов на печатной плате IoT-устройств при наличии разъема Type-C?

Этим вопросом мы задались, когда в своих разработках начали переход с micro-USB на 24pin Type-C. В этой статье я постараюсь описать наш опыт использования Type-C, расскажу о распиновке разъемов Type-C для устройств с ESP32, STM32, Миландра, RISC-V или ARM, а также о том, что внутри кабеля Type-C и как его выбрать.

Читать далее
Всего голосов 23: ↑22 и ↓1+30
Комментарии14

Бюджет потерь USB 3.2

Время на прочтение17 мин
Количество просмотров30K

Откуда столько названий стандартов USB? Какие допустимые потери сигнала в кабеле по спецификации, и почему почти никто ей не следует? Как измерить потери в дифференциальной линии и не продать почку?

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

Страх и ненависть в спецификации USB
Всего голосов 122: ↑121 и ↓1+154
Комментарии60

Оболочка и терминал Unix — это одно и то же?

Время на прочтение18 мин
Количество просмотров21K

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

А как же правильно? И почему эта штука местами такая странная? Без исследования древних машин, принципов общения с ними и легаси ПО тут никак не разобраться.

Осторожно: very long read!
Всего голосов 59: ↑58 и ↓1+74
Комментарии20

Магия ssh

Время на прочтение12 мин
Количество просмотров66K

Разве что ленивый не писал про ssh и несмотря на это, данный протокол и его возможности не перестают меня восхищать. Здесь я хочу поделиться исключительно своим опытом использования сего замечательного инструмента в своих задачах (При этом активно применяю его даже при разработке на Windows).

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

  • Удалённый доступ — логично, ведь для этого он и предназначался.
  • Монтирование папок по сети — очень удобно для работы с кодом на удалённой машине.
  • Удалённое выполнение команд — нечастая, но используемая мной операция. Удобно получать выхлоп команды в канал другой команды на текущей машине.
  • Запуск графических приложений на удалённой машине.
  • Проксирование трафика — способ перенаправления трафика. Этакий быстрый и простой аналог VPN.
  • Обратный ssh — использую для проброса портов к системам, находящимися за NAT, когда лень настраивать firewall.

Далее вкратце разберу каждый пункт, и особенно пути эффективного и простого использования под Windows.
Читать дальше →
Всего голосов 82: ↑74 и ↓8+89
Комментарии133

Разработка драйвера сетевого адаптера для Linux. Часть 1

Время на прочтение25 мин
Количество просмотров26K

В этой статье мы рассмотрим как устроен драйвер сетевого адаптера для Linux.

Cтатью разделим на две части.

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

Хотя при разработке драйверов необходимо использовать стандартные ядерные фреймворки, такие как clock, reset, libphy и пр., поначалу мы будем работать с адаптером напрямую через регистры состояния и управления. Это позволит нам детально разобраться с аппаратной частью.

Во второй части статьи приведем драйвер к нормальному виду, с использованием стандартных фреймворков и описанием того, что надо указать в Device Tree, и рассмотрим как передавать сетевые пакеты.

Нам нужна макетная плата с сетевым адаптером, на которую можно поставить Linux. Возьмем Orange Pi Zero на платформе Allwinner H2+. В состав платформы входят четыре процессорных ядра Cortex-A7, поддерживается ОЗУ стандартов LPDDR2, LPDDR3, DDR3, широкий спектр соединений и интерфейсов, в том числе сетевой адаптер, для которого мы будем разрабатывать драйвер. Подробное описание платформы тут, документация на платформу Allwinner H3 Datasheet.

Читать далее
Всего голосов 71: ↑71 и ↓0+71
Комментарии19

FizzBuzz по-сениорски

Время на прочтение7 мин
Количество просмотров116K

- Добрый день, я на интервью на позицию старшего разработчика.

- Здравствуйте, давайте начнем с небольшого теста, пока я ваше CV смотрю. Напишите программу, которая выводила бы числа от 1 до, скажем, миллиарда, притом если число кратно трем, то вместо числа выводится Fizz, если кратно пяти, то Buzz, а если и трем, и пяти, то FizzBuzz.

Серьезно, FizzBuzz? Задачка для начальной школы, на сениорскую позицию? Ну ладно.

Читать далее
Всего голосов 295: ↑288 и ↓7+369
Комментарии306

Элементы языка С, которые являются неподдерживаемыми в языке С++

Время на прочтение7 мин
Количество просмотров32K

Нижеприведенный список является моей небольшой коллекцией примеров кода на языке С, которые не являются корректными с точки зрения языка С++ или имеют какое-то специфичное именно для языка С поведение. (Именно в эту сторону: С код, являющийся некорректным с точки зрения С++.)

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

Разумеется, язык С имеет много существенных отличий от языка С++, т.е. не составит никакого труда привести примеры несовместимостей, основанные, скажем, на ключевых словах или других очевидных эксклюзивных свойствах С99. Таких примеров вы не найдете в списке ниже. Мой основной критерий для включения примеров в этот список заключался именно в том, что пример кода должен выглядеть на первый взгляд достаточно "невинно" для С++-наблюдателя, т.е. не содержать бросающихся в глаза С-эксклюзивов, но тем не менее являться специфичным именно для языка С.

Читать далее
Всего голосов 104: ↑103 и ↓1+138
Комментарии80

Оптимизация энергопотребления STM32: практическое руководство

Время на прочтение19 мин
Количество просмотров54K
Привет, Хабр!

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

Тем временем, в связи с бурным развитием умных домов и всевозможного IoT тема становится всё более актуальной — в таких системах многие компоненты имеют батарейное питание, и при этом от них ожидаются годы непрерывной работы.

Восполнять данный пробел мы будем на примере STM32L1 — контроллера весьма популярного, достаточно экономичного и при этом имеющего некоторые специфические именно для этой серии проблемы. Практически всё сказанное будет также относиться к STM32L0 и STM32L4, ну и в части общих проблем и подходов — к другим контроллерам на ядрах Cortex-M.



Практический результат должен выглядеть примерно так, как на фотографии выше (и да, о применимости мультиметров и других средств измерения к подобным задачам тоже поговорим).
Читать дальше →
Всего голосов 95: ↑92 и ↓3+89
Комментарии95

CAN-USB адаптер из stm32vldiscovery

Время на прочтение15 мин
Количество просмотров142K


При разработке устройств с CAN-интерфейсом желательно иметь удобный инструмент для отслеживания сообщений в сети. Для RS232/485 существует множество бюджетных USB адаптеров и куча разнообразного софта, а вот для CAN мне не удалось найти недорогое готовое решение.

В то же самое время на сайтах автолюбителей находились самодельные устройства для подключения к CAN шине автомобиля. Одними из готовых проектов были USB<>CAN Bus Interface (CAN Hacker), реализованный на Atmega+SJA1000 и проект STM32-CAN-Busadapter, реализованный на STM32F105. Работают они с программой CAN Hacker, которая выглядит достаточно удобной для работы. Беглый анализ протокола команд по USB показал, что эти устройства представляются COM портом, и дальнейшее общение происходит в виде передачи команд из ASCII символов.

В закромах была найдена плата STM32VLDiscovery, которая и стала объектом испытаний. На ней мы будем повторять «STM32-CAN-Busadapter».
Что из этого получилось
Всего голосов 27: ↑26 и ↓1+25
Комментарии9

Издеваемся над USB

Время на прочтение3 мин
Количество просмотров109K

В очередной раз втыкая скоростную USB флешку в порт USB 3.0, я увидел надпись "Это устройство может работать быстрее...". Но подождите, я и так его воткнул в порт 3.0! Неужели контакт барахлит? И если так, то как флешка определяет, на какой скорости ей работать? Ведь современные ПК поддерживают целых три стандарта соединения — USB 1.1, 2.0 и 3.0. Можно ли «понизить» стандарт USB, насильно заставив устройство работать, к примеру, на USB 1.1? Не на все эти вопросы в сети удалось найти ответ, и я решил разобраться сам, по ходу столкнувшись с довольно неочевидными ситуациями.
Читать дальше →
Всего голосов 190: ↑190 и ↓0+190
Комментарии127

STM32 USB Mass Storage Bootloader

Время на прочтение12 мин
Количество просмотров74K
Известно, что софт можно дописывать вечно, а всякого рода недочёты на плате полностью исправляются ревизии так к третьей. И если с железом уже ничего не поделаешь, то для обновления микропрограмм придумали неплохой способ обхода ограничений пространства и времени — Bootloader.

Загрузчик — это удобно и полезно, не правда ли? А если загрузчик собственной реализации, то это еще более удобно, полезно и гибко и не стабильно. Ну и конечно же, очень круто!

Так же, это прекрасная возможность углубиться и изучить особенности используемой вычислительной машины — в нашем случае микроконтроллера STM32 с ядром ARM Cortex-M3.

На самом деле, загрузчик — это проще, чем кажется на первый взгляд. В доказательство, под cut'ом соберём свой собственный USB Mass Storage Bootloader!

image
Читать дальше →
Всего голосов 37: ↑36 и ↓1+35
Комментарии34

Корректная реализация разностной схемы ПИД регулятора

Время на прочтение7 мин
Количество просмотров86K
ПИД-регулятор является простейшим регулятором, имеющим эффективные аппаратные аналоговые реализации, и потому применяемый наиболее широко. Для своей работы требует настройки 3х коэффициентов под конкретный объект, позволяющие подобрать процесс регулирования согласно требованиям. Обладая простым физическим смыслом и простой математической записью, применяется широко и часто в регуляторах температуры, регуляторах расхода газа и других системах, где требуется поддерживать некий параметр на заданном уровне, с возможными переходами между разными заданными уровнями. Разумеется, существуют более сложные регуляторы, позволяющие более точно и быстро и с меньшими перерегулированиями выходить на заданные параметры, а так же учитывающие нелинейность или гистерезис регулируемого объекта, однако они обладают большей вычислительной сложностью и сложнее в настройке.

Несмотря на свою простоту как физического смысла, так и математической записи:

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

Причем проверить качество реализации ПИД регулятора крайне легко.
Читать дальше →
Всего голосов 43: ↑43 и ↓0+43
Комментарии27

Векторное управление электродвигателем «на пальцах»

Время на прочтение17 мин
Количество просмотров323K
— Что такое векторное управление?
— Держать ток под 90 градусов.


Термин «векторное управление» электродвигателями знаком всем, кто хоть как-то интересовался вопросом, как с помощью микроконтроллера управлять двигателем переменного тока. Однако обычно в любой книге по электроприводу глава про векторное управление находится где-нибудь ближе к концу, состоит из кучи волосатых формул с отсылками ко всем остальным главам книги. Отчего разбираться в этом вопросе совсем не хочется. И даже самые простые объяснения всё равно держат путь через дифференциальные уравнения равновесия, векторные диаграммы и кучу другой математики. Из-за чего появляются примерно вот такие вот попытки как-то закрутить двигатель без использования мат.части. Но на самом деле векторное управление – это очень просто, если понимать принцип его работы «на пальцах». А там уже и с формулами разбираться в случае надобности будет веселее.
Читать дальше →
Всего голосов 46: ↑46 и ↓0+46
Комментарии48

Игровая консоль stm32

Время на прочтение6 мин
Количество просмотров16K
Немного шутеров для stm32; как, зачем, что получилось.



Предисловие


Будучи поклонником «старой» школы шутеров с одной стороны и embedded-разработчиком с другой, я всегда испытывал интерес, как и почему авторам той эпохи удавалось воплощать новый жанр, требующий совершенно новых подходов на весьма «скромном» железе. И я решил попробовать запустить нечто подобное используя решения на основе современных МК — тут и bare-metal и «скромные» ресурсы и довольно мощный инструмент отладки (stm32, имхо). И так, мой выбор пал на плату разработчика stm32f769i discovery.

Примечания


На текущий момент сборка возможна только из среды Keil MDK (загрузчик, игры) или же с помощью arm-gcc + make (только загрузчик). На данный момент доступны порты для — Quake I (+mods), Doom (+mods), Duke Nukem (+mods), Hexen, Heretic. С учетом всех модификаций, список может быть значительно расширен.

Начнем


В настоящей статье я постараюсь коротко изложить основные идеи и принципы их реализации на пути к созданию игровой консоли в частности для stm32f769i discovery. Так же, я постараюсь избегать развернутых технических подробностей, я скорее преследую цель познакомить читателя с еще одним вариантом использования современных МК. Под «игровой консолью» — я подразумеваю самостоятельное устройство с возможностью запуска «пользовательских» приложений без обновления основного ПО.
Всего голосов 29: ↑29 и ↓0+29
Комментарии11

Как начать использовать USB Type-C в своих разработках

Время на прочтение13 мин
Количество просмотров48K

В современных embedded-устройствах используется огромное количество различных разъемов, таких как USB Type-B, miniUSB, microUSB и так далее. Все они отличаются форм-фактором, максимальной пропускной способностью и другими различными характеристиками. Самым верным решением в данной ситуации было бы минимизировать количество используемых разъемов и остановиться на каком-то одном, «едином» для большинства разработок. Наиболее перспективным выглядит использование разъема Type-C. В нем объединены невероятная пропускная способность с высокой мощностью питания. Такие производители, как Apple, Huawei, Sony уже внедряют разъем Type-C в свои разработки, постепенно отказываясь от использования «старых» разъемов. А чем embedded-разработчики хуже?


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

Читать дальше →
Всего голосов 52: ↑52 и ↓0+52
Комментарии57
1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность