Вышел релиз TinyUSB 0.19 — компактного кроссплатформенного USB-стека для встраиваемых систем
На днях состоялся релиз версии 0.19 проекта TinyUSB — легковесного и кроссплатформенного USB-стека, ориентированного на работу во встраиваемых системах. Библиотека реализована на языке C и распространяется под лицензией MIT, что делает её доступной для интеграции в широкий спектр проектов с открытым и закрытым исходным кодом.
TinyUSB предоставляет реализацию как USB-устройств (Device), так и USB-хостов (Host), позволяя встраиваемым платформам как эмулировать USB-периферию, так и управлять подключаемыми устройствами. Архитектура стека полностью независима от операционной системы, что позволяет использовать его в “bare-metal” решениях без необходимости в ОС. В то же время, для тех, кто использует RTOS, предусмотрены адаптационные модули для интеграции с такими системами, как FreeRTOS, RT-Thread и Apache Mynewt.
Одним из приоритетов при разработке TinyUSB стала безопасность. В частности, стек полностью исключает использование динамического выделения памяти, что снижает вероятность ошибок, связанных с утечками, фрагментацией или повреждением памяти. Это особенно важно для микроконтроллеров с ограниченными ресурсами и отсутствием аппаратной защиты памяти (MMU).
В многопоточной среде TinyUSB обеспечивает корректную синхронизацию доступа к общим ресурсам. Все события, связанные с прерываниями, не обрабатываются немедленно в контексте ISR (Interrupt Service Routine), а помещаются в очередь, которая разбирается в основном цикле приложения. Такой подход предотвращает гонки данных и повышает предсказуемость поведения системы. Для защиты общих ресурсов, таких как буферы CDC (Communication Device Class), используются мьютексы и семафоры.
Новая версия 0.19 принесла ряд заметных улучшений. В первую очередь, расширен API как для хостов, так и для устройств, что упростило разработку и интеграцию новых классов. В частности, в хост-режиме стала доступна поддержка устройств с несколькими конфигурациями — это позволяет корректно работать с более сложными USB-гаджетами, предоставляющими несколько интерфейсов.
В числе новых аппаратных платформ, для которых добавлена поддержка, — микроконтроллеры и платформа на базе Raspberry Pi Pico, а также некоторые другие популярные решения на ARM Cortex-M. Кроме того, в стек добавлена начальная реализация протокола USB Power Delivery 3.0, что открывает возможности управления питанием через интерфейс USB Type-C — например, выбором профиля напряжения или отслеживанием уровня потребляемой энергии.
TinyUSB предоставляет возможность расширения функциональности за счёт подключения собственных USB-классов. Это особенно важно для разработчиков специализированных устройств, которым нужно реализовать нестандартную логику взаимодействия по USB. При этом не требуется модификация самого стека — достаточно подключить пользовательский модуль через предоставляемый API.
На текущий момент TinyUSB поддерживает следующие стандартные классы USB-устройств:
- CDC (виртуальный COM-порт),
- HID (клавиатуры, мыши, джойстики),
- MSC (накопители),
- MIDI (музыкальные контроллеры),
- DFU (Device Firmware Upgrade),
- WebUSB.
Для режима USB-хоста реализована поддержка:
- HID-устройств,
- MSC-накопителей,
- CDC-интерфейсов,
- USB-хабов.
Однако стоит отметить, что в ряде случаев при использовании USB-хабов могут возникать сложности, особенно при холодной загрузке системы. Некоторые концентраторы не определяются автоматически до тех пор, пока не будут физически переподключены. Такие проблемы чаще всего связаны с аппаратными особенностями самих хабов, а не с USB-стеком. Тем не менее, разработчики TinyUSB продолжают работу над улучшением взаимодействия с такими устройствами, включая реализацию более гибкой логики инициализации при старте.
Также стоит отметить, что TinyUSB оптимизирован для использования на микроконтроллерах без MMU, где вся память доступна напрямую. Это упрощает модель работы, но требует особой осторожности со стороны разработчиков, так как ошибки в коде могут легко повредить критически важные участки памяти. Отказ от динамической аллокации и предсказуемое управление ресурсами позволяют минимизировать такие риски.
Интересно, что при всей своей простоте TinyUSB не реализован на C++, несмотря на потенциальные преимущества использования таких механизмов, как смарт-указатели. Однако выбор в пользу языка C обусловлен его универсальностью, компактностью и совместимостью с большинством микроконтроллеров, включая те, где невозможна полноценная поддержка C++-рантайма. Тем не менее, в сообществе обсуждаются возможные варианты улучшения безопасности и удобства, включая использование техник типа "defer", доступных через расширения компиляторов.
Дополнительно стоит отметить энергосберегающие функции TinyUSB. Библиотека поддерживает переход в спящий режим и пробуждение по USB-событиям, что особенно важно для портативных устройств и IoT-сенсоров, работающих от батарей. Это позволяет значительно сэкономить заряд, не теряя при этом возможности немедленного реагирования на внешние сигналы.
В ближайших релизах разработчики планируют расширить набор поддерживаемых USB-классов и улучшить совместимость с разнообразными аппаратными платформами. Также ведётся работа над улучшением поддержки USB 3.0 и более глубоким внедрением Power Delivery на уровне API.
В целом TinyUSB остаётся одним из наиболее удобных, лёгких и надёжных решений для реализации USB-коммуникаций на микроконтроллерах. Его гибкость, модульность и активное развитие делают стек привлекательным как для промышленных применений, так и для хоббийных проектов.



