реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32F4+lwip медленно работает.
Oleg_IT
сообщение Oct 31 2016, 06:01
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Проект сгенерил в STM32Cube. Работает нормально. Возникла необходимо увеличить скорость передачи, данные 512 байт, очередную порцию передаю по приходу ответа с принимающей стороны. Скорость получается всего 4 Гц да ещё с периодическим замиранием секунды на две, три. Если игнорировать сообщение о получении данных и слать чаще, то возникает ошибка памяти и пакеты теряются. Как ускорить передачу?
Приемная сторона или 100 Мбит или 1Гбит (пробую на двух компах), ARM автоматом определяет 10 Мб, если при генерации проекта ставлю 100 Мбит картина не меняется.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 31 2016, 07:25
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Oleg_IT @ Oct 31 2016, 09:01) *
данные 512 байт, очередную порцию передаю по приходу ответа с принимающей стороны.

TCP? UDP? Если TCP - погуглите по ключевым словами "LwIP delayed ack" и "LwIP nagle algorithm", возможно найдете что-то полезное.

QUOTE (Oleg_IT @ Oct 31 2016, 09:01) *
Если игнорировать сообщение о получении данных и слать чаще, то возникает ошибка памяти и пакеты теряются.
Может стоит выделить больше буферов?

QUOTE (Oleg_IT @ Oct 31 2016, 09:01) *
ARM автоматом определяет 10 Мб, если при генерации проекта ставлю 100 Мбит картина не меняется.
Я не знаю, что там генерит куб, но если есть прерывание от PHY, то нужно в его обработчике читать из физики получившиеся параметры канала (реальную скорость и дуплекс/полудуплекс) и прописывать их в ETH->MACCR, а также вызывать netif_set_link_up()/netif_set_link_down(). Если прерывания физики нет - периодически читать физику и ловить состояние Auto Negotiation Complete и Link Down и по ним проделывать вышеописанные действия. Физика, разумеется, должна быть настроена на Auto Negotiation со всеми возможными для вашей реализации параметрами (10/100, Full/Halfduplex).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 31 2016, 08:44
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Да, не уточнил у меня TCP.

По буферам посмотрю, но со временем и они забьются.

Auto Negotiation возвращает 10 Мбит.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Oct 31 2016, 17:56
Сообщение #4


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



[quote name='Oleg_IT' date='Oct 31 2016, 11:44' post='1458636']
...у меня TCP.[quote]

из моего города - отсюда не видно что у там в 25 строчке кода, посему для начала приведите свой кусок кода на приёме.
ну и встречный вопрос -
Вы в курсе чем отличается протокол TCP от UDP?

боюсь именно тут собака порылась..

(круглый)
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Nov 1 2016, 05:24
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Чем TCP от UDP отличается я знаю, это так к сведениюsm.gif Для уточнений можно, например сюда обратится https://electronix.ru/forum/index.php?showtopic=115578 , там и на стандарты ссылки есть.
На приемной стороне, т.е. на РС стоит Qt-шная программа с кодом приёма передачи из её, Qt родного примера, обработка полученного массива данных и генерация передаваемых данных естественно свои, с начало передача ответа, потом обработка.
Go to the top of the page
 
+Quote Post
Sanya_kv
сообщение Nov 3 2016, 10:26
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 25-02-09
Из: Россия
Пользователь №: 45 369



Цитата(Oleg_IT @ Oct 31 2016, 10:01) *
Проект сгенерил в STM32Cube. Работает нормально. Возникла необходимо увеличить скорость передачи, данные 512 байт, очередную порцию передаю по приходу ответа с принимающей стороны. Скорость получается всего 4 Гц да ещё с периодическим замиранием секунды на две, три. Если игнорировать сообщение о получении данных и слать чаще, то возникает ошибка памяти и пакеты теряются. Как ускорить передачу?
Приемная сторона или 100 Мбит или 1Гбит (пробую на двух компах), ARM автоматом определяет 10 Мб, если при генерации проекта ставлю 100 Мбит картина не меняется.

Возможно проблема в задержке (200 млСек) получения подтверждения. Проблему задержки можно решить 2-я способами:
1) Нужно отправлять по 2 пакета.
2) Правка реестра https://support.microsoft.com/ru-ru/kb/321098

Более подробно о проблеме здесь: https://support.microsoft.com/ru-ru/kb/214397
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Nov 5 2016, 07:45
Сообщение #7


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Oleg_IT @ Nov 1 2016, 08:24) *
Чем TCP от UDP отличается я знаю, это так к сведениюsm.gif ...


меня насторожило Ваше это высказывание:

Цитата(Oleg_IT @ Nov 1 2016, 08:24) *
...данные 512 байт, очередную порцию передаю ...


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

удачи вам
(круглый)
ЗЫ
По указанной Вами ссылке нет Вашего кода приёмника...

Сообщение отредактировал kolobok0 - Nov 5 2016, 07:47
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Nov 7 2016, 05:36
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



По моей ссылки кода нет, там теория TCP для новичков.
Проект на PC достаточно большой, приёмная часть это класс QTcpSocket и его окружение из примера. Обработка пока вообще ни какая, просто беру и вывожу номер пакета, а пвкет это те самые 512 байт.

По поводу двух пакетов, заметил, что lwip собирает два павкета, не всегда, но часто и передаёт их в двух пакетах, но с другими длиними, 588 и 436 байт. Увеличивал и уменьшал объём передаваемых данных в два раза, результат тотже.
Go to the top of the page
 
+Quote Post
sadat
сообщение Nov 7 2016, 16:07
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 117
Регистрация: 6-07-05
Из: Белгород
Пользователь №: 6 575



Что показывает мониторинг программой wireshark или подобными? Советую использовать в качестве примера что-то более рабочее, чем пустой куб - в библиотеках куба есть примеры для демо-плат.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Nov 7 2016, 18:43
Сообщение #10


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Oleg_IT @ Nov 7 2016, 08:36) *
....Обработка пока вообще ни какая, просто беру и вывожу номер пакета, а пвкет это те самые 512 байт....


ну тогда давайте от печки...

в TCP нет пакетов(!!!!) прочувствуйте фразу = от слова СОВСЕМ НЕТ!

(круглый)
ЗЫ
Практика приёма на работу программистов показывает, что мало кто действительно понимает эту фразу sad.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 7 2016, 19:03
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(kolobok0 @ Nov 7 2016, 21:43) *
в TCP нет пакетов(!!!!) прочувствуйте фразу = от слова СОВСЕМ НЕТ!

Не надо изображать из себя злого преподавателя на экзамене. Сегменты ведь есть? И вообще, лучше по делу. Хотя бы просто "RTFM" и ссылка на материал.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 8 2016, 07:07
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (scifi @ Nov 7 2016, 22:03) *
И вообще, лучше по делу. Хотя бы просто "RTFM"

Не помогает...
QUOTE (Сергей Борщ @ Oct 31 2016, 10:25) *
погуглите по ключевым словами "LwIP delayed ack" и "LwIP nagle algorithm"



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Nov 8 2016, 09:48
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Wireshark показывает Test1.JPG из приложения. IP …18 это модуль на ARM, …150 это PC с Windows XP.
Получается, что тормоза идут от модуля. И откуда такие залипания, на 4 секунды, строки 36-37? Как в модуле проверить, что данные ушли в контроллёр изернет?
Реестр поменял по рекомендации Sanya_kv Реестр.JPG из приложения. Результата не видно.

Фрагмент кода приёмника
Код
void MainWindow::slotReadyRead()
{
    if (m_pTcpSocket == NULL || m_pTcpSocket->isOpen() == false)
        return;

    slotSendToServer();

    QByteArray dAll;
    dAll.clear();
    dAll = m_pTcpSocket->readAll();
    SizeAll = dAll.count();
    if (AddData(dAll.data(),SizeAll,(uint8_t*)m_Data.Data) == true)
        WidgetMain->DrawGr();
}

void MainWindow::slotSendToServer()
{
    if (m_pTcpSocket == NULL || m_pTcpSocket->isOpen() == false)
        return;
    GetControlToModul(m_ControlToModul);
    m_pTcpSocket->write((const char*)&m_ControlToModul,sizeof(ControlToModul));
}

GetControlToModul(…) заполняет передаваемую структуру.
AddData(...) обработка принятых данных, сейчас только извлечения номера посылки, который приходит из модуля.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 8 2016, 09:59
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Oleg_IT @ Nov 8 2016, 12:48) *
Как в модуле проверить, что данные ушли в контроллёр изернет?

Если данные для отправки идут маленькими кусочками, lwip старается отложить отправку, пока не наберётся сегмент, приближающийся по размеру к MSS. Это чтобы не было кучи мелких сегментов. Если считаете, что вам виднее, можете просто вызывать tcp_output(), тогда всё, что накопилось к этому моменту, будет отправлено немедленно.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Nov 8 2016, 10:23
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(scifi @ Nov 8 2016, 13:59) *
Если данные для отправки идут маленькими кусочками, lwip старается отложить отправку, пока не наберётся сегмент, приближающийся по размеру к MSS. Это чтобы не было кучи мелких сегментов. Если считаете, что вам виднее, можете просто вызывать tcp_output(), тогда всё, что накопилось к этому моменту, будет отправлено немедленно.

Еслиб это было так, lwip, у меня, ни чего не копит, в начале я говорил, что если посылать чаще, то пакеты теряются, подпрограмма tcp_write выдаёт ошибку памяти.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016