Стивестронг
Ср 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, как можно лучше.
Если вы думаете, что это стоит, мы могли бы даже отправиться в мастер -филиал.
Любое предложение/комментарий приветствуется.
Я публикую здесь, потому что в последнее время работал над проектом, который включает в себя быстрый 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.
Что означает, что ограничение находится в коде пользователя.
Изменения можно найти здесь.
Я тоже переработал часть 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 ?
Какая скорость передачи вы предлагаете для максимальной выходной сигнала TX KB/SEC ?
Стивестронг
Вт 8 ноября 2016 г. 10:32 утра
Чтобы установить скорость передачи, на самом деле излишнее, поскольку USB -сериал будет толкать байты так быстро, насколько это возможно, независимо от настройки пользователя.
Я опубликую тестовый код вечером.
Обратите внимание, что скорость TX сильно ограничена кодом пользователя. В своем простом тесте я просто снова и снова нажимаю на USB -сериал USB.
Если вы попытаетесь загрузить данные, скажем, с SD -карты, то скорость USB TX быстро падает ниже ~ 60 кбит / с, ограниченная скоростью чтения из карты.
Я опубликую тестовый код вечером.
Обратите внимание, что скорость TX сильно ограничена кодом пользователя. В своем простом тесте я просто снова и снова нажимаю на USB -сериал USB.
Если вы попытаетесь загрузить данные, скажем, с SD -карты, то скорость USB TX быстро падает ниже ~ 60 кбит / с, ограниченная скоростью чтения из карты.
michael_l
Вт 8 ноября 2016 г., 10:50 утра
Хорошо, спасибо!
Я понимаю, что SD -карта ограничит производительность. В моем случае проблема, по -видимому, заключается в том, что с операцией TX будет блокировать (слишком долго), которые, кажется, влияют на другую часть программы.
Кстати: мне пришлось сделать одну небольшую модификацию, чтобы скомпилировать патч:
usb_serial.час
строка 68: size_t write (const uint8* uint32);
Я понимаю, что 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);
usb_serial.час
строка 68: size_t write (const uint8* uint32);
michael_l
Вторник 8 ноября 2016 г. 12:12
Спасибо, я просто смотрел на коммит, но не понял, что вы уже исправили.
Это мой код печати. Интересно, будет ли производительность лучше, если я создам температурный буфер, сначала заполняющий данные, и отправлю все это за один вызов в сериал.println ? Я думаю, да, потому что каждый байт отправляется в один USB -пакет. Я использую этот же код в ESP8266, и он, похоже, не заблокируется так же, как. Хорошо, это другой MCU, но все же...
Это мой код печати. Интересно, будет ли производительность лучше, если я создам температурный буфер, сначала заполняющий данные, и отправлю все это за один вызов в сериал.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.
В то время как 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.
Затем я начал работать над SPI и совершил некоторые изменения в моем репо, который приземлился также в USB -серийном PR, я не знаю, как.
К сожалению, я не знаю, как удалить эти поздние коммиты из USB -серийного PR, поэтому, пожалуйста, удалите его, если можете, и только возьмите эти соответствующие PRS.
Martinayotte
Ср. 09 ноября 2016 г., 19:54
Любой GIT Commits из одной и той же ветви всегда включен в ожидающий пиар.
Единственный способ различить различную работу на разных пиара - это иметь несколько ветвей.
Итак, у Роджера не будет другого выбора, чтобы сделать немного "сбора вишни" ...
Единственный способ различить различную работу на разных пиара - это иметь несколько ветвей.
Итак, у Роджера не будет другого выбора, чтобы сделать немного "сбора вишни" ...
Rogerclark
Ср. 09 ноября 2016 г., 19:55
@stevestrong
Хорошо.
Я не уверен, есть ли GIT, способный участвовать только PR, но я могу сделать это вручную.
Я сделаю это позже сегодня (четверг здесь
Хорошо.
Я не уверен, есть ли GIT, способный участвовать только PR, но я могу сделать это вручную.
Я сделаю это позже сегодня (четверг здесь
Rogerclark
Ср. 09 ноября 2016 г., 19:56
Спасибо, Мартин, это то, что я думал
Стивестронг
Ср. 09 ноября 2016 г., 8:00 вечера
Спасибо Мартину за информацию, кажется, что я должен сделать еще одну филиал для собственного развития и вставить соответствующие изменения в главную филиал только тогда, когда был совершен предыдущий пиар.
Вы, ребята, справляетесь с этим так же?
Вы, ребята, справляетесь с этим так же?
Rogerclark
Ср. 09 ноября 2016 г., 8:06 вечера
Я положил новый разработ.
Я не совершаю изменений в разные ошибки одновременно, но я знаю, что PR содержит несколько коммитов.
Я не совершаю изменений в разные ошибки одновременно, но я знаю, что PR содержит несколько коммитов.
Стивестронг
Ср. 09 ноября 2016 г., 8:11 вечера
Хорошо, я понял, отныне только чистые пиары от меня
Rogerclark
Ср. 09 ноября 2016 г., 20:57
@stevestrong
В Arduino STM32 Repo я делаю непосредственно в главную ветвь, это зависит от сложности и масштаба коммита
эн.глин. Если это всего лишь новый вариант, он довольно сдерживается и просто новая папка + обновленные доски.текст
Для PR's я объединяю простые прямо в главную ветку
Но для более сложных, я создаю ветвь для PR (обычно на основе имени пользователя) и тяну к этой ветви, затем проверяю, а затем объединяю эту ветвь обратно в мастер
КСТАТИ. У нас есть дроссец "вестибюль" https: // gitter.im/stm32duino/lobby, Что иногда удобно для обсуждения этого материала, но, независимо от того, являются ли многие люди одновременно в Интернете, варьируется
В Arduino STM32 Repo я делаю непосредственно в главную ветвь, это зависит от сложности и масштаба коммита
эн.глин. Если это всего лишь новый вариант, он довольно сдерживается и просто новая папка + обновленные доски.текст
Для PR's я объединяю простые прямо в главную ветку
Но для более сложных, я создаю ветвь для PR (обычно на основе имени пользователя) и тяну к этой ветви, затем проверяю, а затем объединяю эту ветвь обратно в мастер
КСТАТИ. У нас есть дроссец "вестибюль" https: // gitter.im/stm32duino/lobby, Что иногда удобно для обсуждения этого материала, но, независимо от того, являются ли многие люди одновременно в Интернете, варьируется
michael_l
Сб 27 мая 2017 г. 12:04
Так что это уже было объединено с мастером ? РЕДАКТИРОВАТЬ: Похоже, это так