Как стать автором
Обновить

Комментарии 37

хорошо, но мало...)))
как бы рассмотреть проект, РАБОЧИЙ девайс для СКОРОСТНОГО обмена по USB(USB3), так сказать на максималках…
лучше с использованием HAL…
В некоторое время назад, пробовал реализовать такой обмен, но по замерам скорости, результат был исключительно плачевным…
причем и помощь «вселенского» разума не помогла, все сошлись что дескрипторы верные… НО...((((, кристаллы пробовал F1,F4,F7+USB3 модуль навесной…
в общем не вышел каменный цветок у Данилы…
РАБОЧИЙ девайс для СКОРОСТНОГО обмена по USB(USB3), так сказать на максималках…
У контроллера едва на 12 Мб/с скорости хватает, а вы гигабиты хотите. Да и типичная память — SD-карта — может не потянуть. Вон в той статье автор уперся не столько в USB, сколько в карту.
MSD на контроллерах имеет смысл скорее для другого — представлять произвольные данные в виде файлов на лету. С этим тоже, конечно, хочется повозиться, но придется долго файловые системы копать.
лучше с использованием HAL…
Однозначно нет.
В той статье автор упёрся в SD потому что SPI. Но в целом, да, я на F7 на 100 мбитах догонялся только до ~85. Fsmc <-> ETH. Упирается именно в процессор/DMA. Так что и USB 2 (480) вряд ли удастся забить, не то что USB3
Да даже без SPI. У устройства, описанного в этой статье, скорость 650 — 750 кБ/с при том что чтение идет из флешки контроллера, то есть накладных расходов на доступ к периферии нет вообще. Ну хорошо, может можно еще чуть-чуть повысить за счет двойной буферизации, но не думаю что намного.
У меня с HAL на stm32f103c8t6 ADC -> USB точно 625KB/s (сейчас накидал для проверки). Вообще пишут, что в FS (12 Mb) можно в принципе пропихнуть (bulk -ом) только 1MB/s ( 8Mb ). Так что у Вас вполне нормальный результат. И да, эти STM-ки ( от F0 до H7) — это не про USB3 однозначно.
Полагаю, что 1 МБ/с это теоретический предел. Скорость обмена у нас 12 Мб/с, то есть 1,5 МБ/с. Добавляем небольшую просадку на добавку нулей после каждых 0b111111, добавляем маркер-пакеты и handshake'и, добавляем коррекцию ошибок и повторную отправку вот и получается что 1 МБ/с это еще оптимистично.
Ну а именно в случае MSD добавляется предписанное стандартом ограничение пропускной способности (вроде как там какой-то процент канала резервируется на прерывания и контролы). Так что да, больше 800 — 900 кБ/с вряд ли возможно выжать даже теоретически.
Не постесняюсь процитировать свою же статью:
В любом случае, делать полноценную флешку на контроллере общего назначения не самая удачная идея

Здесь можно выехать на нестандартных задачах вроде переходника для чтения с перфокарт, ЦМД-памяти и прочей дичи, для которой готовых железяк просто нет. Ну и эмуляция какого-нибудь fat12 — fat64 чтобы отображать на файлы какие-то другие параметры. Ну не знаю, настройки там.
Здесь можно выехать на нестандартных задачах вроде переходник
У меня спросили простой логгер на 8-10 каналов ADC 16КSPS с поключением к PC подешевле. Так вот я и накидал товарищу код на STM32F103C8T6 (Blue pill) за день. Со стороны PC тоже.
Надеюсь, вы значения АЦП не в виде файлов отображали? Я-то говорил именно про применение MSD класса, сделанного не контроллере.
А мысль интересная — каждый канал в отдельном файлике :)

увы, нет. Размер файликов будет ограничен файловой системой. То есть данные вы будете снимать хоть до бесконечности, но рано или поздно закончатся свободные кластеры того же fat'а. А обновлять в реальном времени ОС может и не захотеть — это же флешка.
Тут лучше CDC как предлагает Sdima1357, либо, как делал я, HID (но у меня измерения "по запросу" и редкие), либо вообще изобразить аудиоустройство или что-то подобное.

Согласен, это больше как шутка. Но в линуксе ядерные модули могут создавать файлы из которых можно читать бесконечно.
И это очень удобно. У меня похожая штука и используется, только из юзерспейса — средствами ядра создается ramfs, монтируется куда надо с нужными правами, а «драйвер» там создает файлы с актуальными измерениями.
Вот только эмулировать модобное железом уже странно. Как минимум, некоторые системы могут… удивиться… трем десяткам накопителей, на которых не хватит букв латинского алфавита.
У CDC есть плюсы.
1 Бесплатный Manufacturer::product ID
2 Простой и гибкий USER SPACE interface. Типовые демоны не стремятся его подергать
Кстати про подергать. Давным давно для завода наливающего бетон в бетономешалки попросили написать и нарисовать схему управления наливанием бетона на pc. Попросила девушка, которая писала какую то логику на бейсике под Виндоус 3хх.
Короче кончилось тем, что секретарша послала на этот параллельный порт, по ошибке, печатать документ. Вообщем все отлично напечаталось бетоном на машинках. Так что не стоит приспосабливать выход на не предназначенные для этого порты.
Нет конечно. Тупо ADC ->USB CDC -> PC.
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{
	if(speedReady>115200)
	{
		CDC_Transmit_FS(&ADC_BUFF[0],HSAMPLES/2*sizeof(ADC_BUFF[0]));
	}

}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	if(speedReady>115200)
	{
		CDC_Transmit_FS(&ADC_BUFF[HSAMPLES/2],HSAMPLES/2*sizeof(ADC_BUFF[0]));
	}
}


Там товарищу не важно потерять часть данных. Да и код накидал просто для примера. Можно добавить коррекцию ошибок или ретрансмит.

а почему бы и нет? надо данные — открыл файл и читай.
там единственные грабли это заставить винды каждый раз при новом обращении не из кэша данные брать, а с "флэшки".

А если так и так костылить доступ, не проще использовать нормальные протоколы?

ну вот если бы не костыли с файловым кэшем в виндах, то с масстораджем никаких протоколов со стороны ПК не надо вообще, хоть каким-угодно матлабом/математикой/гнуплотом сразу файл открывай да смотри данные.
да хоть по сети шарь, cdc да и usb вообще тоже конечно можно, но не без плясок с бубном.

А что мешает из /dev/ttyACMx читать данные потоком? Я так делал когда надо было оцифровывать данные с 8 фотодиодов.
Может быть проблема если данные будут нужны разным софтинам. Ну там канал 0 заберет себе, скажем, датчик температуры, а канал 1 уже программа логирования чего-то там. Но тут аппаратные решения вряд ли помогут, проще написать драйвер и уже он пусть отображает хоть на файлы, хоть на память.

мешает виндовс у пользователей железки.
ну и какой-то протокол городить всё равно придётся.

А виндузятники пускай страдают, им не привыкать пишут «драйвер», который бы преобразовывал поток \\.\COM1 в stdout, который уже можно перенаправить. Ну или сразу нарисовать график или еще как обсчитать. Так я тоже делал при помощи glut и lua.

да, именно так и сделано, некая измерительная железка которая время от времени около килобайта данных за раз отдаёт по нажатию пользователем кнопки, CDC, скрипт на lua обработки/сохранения и gnuplot для отображения.


но тут граждане учОные какой только дичью не пользуются вроде origin, igor, labview,… так вот выдать им тупо "флэшку" с которой надо только файл с данными открыть было бы куда проще, чем делать всякие разные обёртки для каждого случая.

WinUSB сейчас умеет в кастомные устройства без драйверов.
А еще можно драйвер написать. И то и другое сложнее прямого чтения потока из «файла» вроде /dev/ttyACM0 и отображения на графике.
cat /dev/ttyACM0 | feedgnuplot --lines --domain --stream

драйвера писать совсем не хочется.
речь была про виндовс.
gnuplot конечно здорово, а теперь давайте это будет, например, вольфрамовская математика, где можно было бы сделать
data=Import["F:\data.txt"]
без вызова всяких дополнительных обёрток которые данные заберут из CDC и положат в файл.
и такая "эмуляция" MSD будет на самом деле работать кроссплатформенно, хоть в OS/2 без дополнительных плясок с бубном.

Это уже обсуждали выше: обычные файловые системы не позволяют обновлять файл в обход операционки. Тем более винды, у которой список поддерживаемых файловых систем и без того куцый.
То есть если нам нужно взаимодействие с прибором, представление его в виде замороженного слепка на файловой системе не годится. Нужно ему какие-то параметры задавать (это как раз через MSD возможно) и читать (а вот это уже нет).
Иначе говоря, данные с прибора это обычно поток. Реже состояние и совсем редко событие. Первое неплохо отображается на CDC или аудио, второе и третье — на HID. На MSD не ложится ничего.

Зато с сокетами все дружат, а сетевую карту реализуют CDC ECM / EEM / NCM без доп. драйверов. Соответственно, все абстракции сетевые доступны.

Не хотите написать на эту тему статью? Ну то есть как передавать поток данных через CDC или HID статей написано изрядно (собственно, по custom-HID статей больше чем по любому другому варианту). А вот по эмуляции сетевого адаптера лично мне не попадались. А было бы интересно.

ну не то что бы совсем не позволяют, есть костыли которыми с кэшами ФС в виндах вроде побороться можно.
https://www.uwe-sieber.de/ntcacheset_e.html


и "поток", и уж тем более "состояние" можно было бы и из "файла" с MSD забирать с отключенным кэшем. да и события поллить можно.
так что на MSD оно вполне ложится: параметры поправил прямо в конфиг файле на "устройстве",
созданием/удалением всяких lock файлов (с обоих сторон) можно всякими небыстрыми процессами управлять, а если прибор быстрый, то просто по получению SCSI_READ можно всё что надо померить и данные сразу же отдать.
да, со стороны железки немного коряво выглядит, зато со стороны ПК вообще ничего не надо: "проводником" виндовс последовательный порт не откроешь, наследие ДОСа в виде copy //./COM1 ххх, в обе стороны одновременно плохо работает.
а вот файл открыть чем угодно можно не написав ни строчки кода для этого.


ну и если не MSD, следующий "шаг" это поднять "сетевую карту" через USB и там уже через http/nfs/samba/… отдавать данные.

Да, статические данные отображать в виде файлов сделать реально. Кстати, этим тоже хочу позаниматься, но пока других задач хватает.
ну не то что бы совсем не позволяют, есть костыли которыми с кэшами ФС в виндах вроде побороться можно.
Насколько код такого отключения окажется больше простой работы с COM-портами? Что-то мне подсказывает, что оно того не стоит. Плюс вспоминаем ограничение на количество букв дисков и любовь винды иногда привязку устройства к букве терять. Если для человека это просто неприятно, то для автоматики смертельно.
Так что у Вас вполне нормальный результат.
Напомнили вы мне первые опыты с этим протоколом. Уже не помню где именно я накосячил, но скорость составляла что-то около 1 кБ/с. Кажется, какой-то запрос криво обрабатывался, так что операционка поминутно пыталась «флешку» ребутнуть и дочитать наконец память. На тот момент меня даже это радовало, мол «я наконец-то научился изображать слоупочную флешку, не сохраняющую данные при отключении, классно!». Даже прикидывал сколько дней через нее будет записываться 4-гигабайтная SD-карта. Результат почему-то не вдохновлял :)

USB3 — это в основном удел cortex-a многоядерных. STM32 даже от потока USB high-speed поперхнётся при обработке. Он только копировать куда -то данные успеет с такой скоростью. А так, есть же cyusb3014 и ft600, вот, пожалуй, и всё почти.

ну в свое время вопрос стоял, кидать булки на PC с максимально возможной скоростью, и соответсвенно минимизировать интерфейсные аппаратные накладные расходы…
в сети много «многомудрых героев», бъющих себя пяткой в грудь, в том, что немерянное количество мегабайт пропихивают через USB… но НИ ОДНОГО реального теста нетути…
дабы было чтобы пощупать, подумать… Вобщем закинуто было в долгий ящик, НО возможно, это кому то нужно прямо сейчас…

ЗЫ…
либо барыги сплошные… бабок хотят…

А чем вас девборды и примеры от производителей не устраивают? На тот же fx3 есть и исходник тестовой прошивки, и исходник утилиты для компа. Вчера запускал — 300 с копейками мегабайт в секунду на fx3, 43 мегабайта в секунду на fx2lp.

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

fx3sdk
и
github.com/Ho-Ro/cyusb_linux (форк из cypress usb suite for linux)
ещё примеры под fx2 я брал bulkloop, пример slave из cypress AN61345

Только внешним чипом PHY, что требует кучи ног контроллера и разводки платы с учётом волнового сопротивления. Отлично работает на 480 Мbit. 200MHz контроллер даже успевал загружать на 100%. USB3.0 я даже не и не видел интегрированных на ширпотребный контроллерах — «обычный» ARM уже не успеет такой поток данных готовить.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории