Повторный USB CDCACM (USB Serial), как RX, так и TX

Стивестронг
Ср 19 октября 2016 г., 22:14
Всем привет,
Я публикую здесь, потому что в последнее время работал над проектом, который включает в себя быстрый USB -серийный прием огромного количества данных (~ 150 КБ) на Maple Mini (Blue Pill).
@primateio выяснил, и я признал, что из -за некоторых проблем в текущей версии модуля USB CDCACM некоторые байты были потеряны.
См. Тема Связанный форум здесь, и на GitHub.

Теперь я разработал версию, которая преодолевает обнаруженные проблемы и, таким образом, обеспечивает скорость RX до ~ 600 Кбит / с, сильно влияя вовлеченный USB -хост (ПК) и его ежедневное настроение (по крайней мере, на моей машине Win10)... Тем не менее, кажется, что я больше не потерял байтов.
В качестве положительного побочного эффекта размер буфера RX был уменьшен (сейчас 256 байтов, ранее 512).

Кроме того, я также переработал сторону TX, потому что текущая версия не позволяет отправлять более 64 байтов одновременно. Он ждет, пока они не будут полностью отправлены, и только после того, как эти новые байты будут приняты, чтобы отправить, снова. Это довольно неэффективно и, следовательно, медленно.
Вместо этого я внедрил кольцевую трансмиссию, аналогичную части RX.
Размер буфера TX в настоящее время устанавливается на 256 байтов (сохраненные байты образуют деталь RX, поэтому в целом нет оперативной памяти). Это означает, что TX блокирует только в том случае, если вы очень быстро отправляете более 256 байтов.

Я протестировал новую версию (прикрепленную), до сих пор не обнаружено проблем.
Но все же, я хотел бы попросить некоторых из вас, кто заинтересован в этом, проверить часть RX и TX, как можно лучше.

Если вы думаете, что это стоит, мы могли бы даже отправиться в мастер -филиал.

Любое предложение/комментарий приветствуется.

Стивестронг
Пт 21 октября 2016 г., 8:42 вечера
ОБНОВЛЯТЬ
Я тоже переработал часть TX. На самом деле я могу достичь скорости ~ 300 Кбит / с для TX, независимо от размера буфера USB TX.
Что означает, что ограничение находится в коде пользователя.
Изменения можно найти здесь.

Rogerclark
Пт 21 октября 2016 г., 8:47 вечера
Похоже, это готово к большому времени

Вы можете отправить пиар ?

Стивестронг
Пт 21 октября 2016 г., 21:09
Привет, Роджер, пиар отправляется.

Rogerclark
Пт 21 октября 2016 г., 23:48
Спасибо

Я протестирую позже

michael_l
Вт 8 ноября 2016 г., 10:20 утра
@Stevestrong: Был бы у вас любой тестовый эскиз, доступный для тестирования производительности? Я хотел бы попробовать это и сравнить числа с текущим мастером и вашим патчем. Спасибо.

Какая скорость передачи вы предлагаете для максимальной выходной сигнала TX KB/SEC ?

Стивестронг
Вт 8 ноября 2016 г. 10:32 утра
Чтобы установить скорость передачи, на самом деле излишнее, поскольку USB -сериал будет толкать байты так быстро, насколько это возможно, независимо от настройки пользователя.

Я опубликую тестовый код вечером.

Обратите внимание, что скорость TX сильно ограничена кодом пользователя. В своем простом тесте я просто снова и снова нажимаю на USB -сериал USB.
Если вы попытаетесь загрузить данные, скажем, с SD -карты, то скорость USB TX быстро падает ниже ~ 60 кбит / с, ограниченная скоростью чтения из карты.

michael_l
Вт 8 ноября 2016 г., 10:50 утра
Хорошо, спасибо!

Я понимаю, что SD -карта ограничит производительность. В моем случае проблема, по -видимому, заключается в том, что с операцией TX будет блокировать (слишком долго), которые, кажется, влияют на другую часть программы.


Кстати: мне пришлось сделать одну небольшую модификацию, чтобы скомпилировать патч:

usb_serial.час

строка 68: size_t write (const uint8* uint32);

Стивестронг
Вторник 8 ноября 2016 г. 12:04
michael_l написал: Кстати: мне пришлось сделать одну небольшую модификацию, чтобы скомпилировать патч:
usb_serial.час
строка 68: size_t write (const uint8* uint32);

michael_l
Вторник 8 ноября 2016 г. 12:12
Спасибо, я просто смотрел на коммит, но не понял, что вы уже исправили. :)

Это мой код печати. Интересно, будет ли производительность лучше, если я создам температурный буфер, сначала заполняющий данные, и отправлю все это за один вызов в сериал.println ? Я думаю, да, потому что каждый байт отправляется в один USB -пакет. Я использую этот же код в ESP8266, и он, похоже, не заблокируется так же, как. Хорошо, это другой MCU, но все же...
void printMsg() { Serial.print(micros()); Serial.print(",ID: "); Serial.print(id, HEX); Serial.print(",Data: "); for(int i = 0; i

Стивестронг
Вторник 8 ноября 2016 г. 12:28
В общем, с тех пор, как TX также буферирован, лучше отправлять больше байтов за один выстрел.
В то время как USB отправляет байты из собственного буфера, основная рутина может выполнять другие задачи.

У меня были лучшие результаты, используя временный буфер из 1024 байтов для заполнения с помощью данных с SD -карты. Тогда я только что назвал «сериал.написать (буфер, длина); ". За время отправки USB я читал следующие 2 блока, каждые 512 байт данных из карты. Размер буфера USB TX сохраняется по значению по умолчанию 256.
Но в любом случае, пожалуйста, имейте в виду, что USB -хозяин оказывает сильное влияние на скорость TX. Чем быстрее приложение хоста, тем выше скорость USB TX.

РЕДАКТИРОВАТЬ
Мне не хватает Millis () в конце передачи данных в вашем коде.

Edit2
Что касается скорости обработки UC, я недавно узнал, что Core Family Family работает с двумя дополнительными состояниями ожидания. Это означает, что UC фактически считывает код из Flash и выполняет его с 24 МГц, а не с 72, как можно было бы ожидать. Это намного меньше, чем 80 МГц ядра ESP.

michael_l
Вторник 8 ноября 2016 г., 16:10
Первые быстрые тесты с вашим патчем, и разница в скорости «удивительно» ! Спасибо, это действительно имеет значение.

Стивестронг
Вт 8 ноября 2016 г., 8:42 вечера
Я счастлив, что кто -то может использовать это.
К сожалению, мне не удастся опубликовать сегодня примеры из -за отсутствия времени.

michael_l
Ср. 09 ноября 2016 г., 10:22
Вот короткий фрагмент моего журнала. Первый отпечаток - Millis (), а последнее значение - Millis (). Как мы видим, обычно требуется менее 1 мс или иногда (последняя строка), чтобы распечатать их на сериал.
35511,00,ID: 000,Data: F5 00 CF C0 FC, 35511 35511,15,ID: 000,Data: B0 15 00 1F D0 07 00 60, 35512 35512,20,ID: 000,Data: AF 02 80 00 08 30 0A 35, 35512 35513,F0,ID: 000,Data: 01 0F FC 00 00 FF F1, 35513 35513,A0,ID: 000,Data: 2F 0A 00 00 7D 00 F0 02, 35514

Стивестронг
Ср. 09 ноября 2016 г., 10:29
Для такого мало данных это просто копирование в буфере TX, который требует времени, остальное обрабатывается в фоновом режиме.

Rogerclark
Ср. 09 ноября 2016 г., 19:42
Ребята

К вашему сведению. Я не объединил пиар для этого, потому что это звучит так, будто он все еще находится.

Я хочу подождать, пока он станет стабильным и чисто слиянием, прежде чем я поступил на пиар.

Стивестронг
Ср. 09 ноября 2016 г., 19:47
Роджер, часть с USB -сериалом сделана, больше не работайте над ней.
Затем я начал работать над SPI и совершил некоторые изменения в моем репо, который приземлился также в USB -серийном PR, я не знаю, как.
К сожалению, я не знаю, как удалить эти поздние коммиты из USB -серийного PR, поэтому, пожалуйста, удалите его, если можете, и только возьмите эти соответствующие PRS.

Martinayotte
Ср. 09 ноября 2016 г., 19:54
Любой GIT Commits из одной и той же ветви всегда включен в ожидающий пиар.
Единственный способ различить различную работу на разных пиара - это иметь несколько ветвей.
Итак, у Роджера не будет другого выбора, чтобы сделать немного "сбора вишни" ...

Rogerclark
Ср. 09 ноября 2016 г., 19:55
@stevestrong

Хорошо.

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

Я сделаю это позже сегодня (четверг здесь ;-)

Rogerclark
Ср. 09 ноября 2016 г., 19:56
Спасибо, Мартин, это то, что я думал

Стивестронг
Ср. 09 ноября 2016 г., 8:00 вечера
Спасибо Мартину за информацию, кажется, что я должен сделать еще одну филиал для собственного развития и вставить соответствующие изменения в главную филиал только тогда, когда был совершен предыдущий пиар.
Вы, ребята, справляетесь с этим так же?

Rogerclark
Ср. 09 ноября 2016 г., 8:06 вечера
Я положил новый разработ.

Я не совершаю изменений в разные ошибки одновременно, но я знаю, что PR содержит несколько коммитов.

Стивестронг
Ср. 09 ноября 2016 г., 8:11 вечера
Хорошо, я понял, отныне только чистые пиары от меня :)

Rogerclark
Ср. 09 ноября 2016 г., 20:57
@stevestrong

В Arduino STM32 Repo я делаю непосредственно в главную ветвь, это зависит от сложности и масштаба коммита

эн.глин. Если это всего лишь новый вариант, он довольно сдерживается и просто новая папка + обновленные доски.текст

Для PR's я объединяю простые прямо в главную ветку

Но для более сложных, я создаю ветвь для PR (обычно на основе имени пользователя) и тяну к этой ветви, затем проверяю, а затем объединяю эту ветвь обратно в мастер

КСТАТИ. У нас есть дроссец "вестибюль" https: // gitter.im/stm32duino/lobby, Что иногда удобно для обсуждения этого материала, но, независимо от того, являются ли многие люди одновременно в Интернете, варьируется

michael_l
Сб 27 мая 2017 г. 12:04
Так что это уже было объединено с мастером ? РЕДАКТИРОВАТЬ: Похоже, это так