|
STM32F4+lwip медленно работает. |
|
|
|
 |
Ответов
|
Nov 7 2016, 05:36
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
По моей ссылки кода нет, там теория TCP для новичков. Проект на PC достаточно большой, приёмная часть это класс QTcpSocket и его окружение из примера. Обработка пока вообще ни какая, просто беру и вывожу номер пакета, а пвкет это те самые 512 байт.
По поводу двух пакетов, заметил, что lwip собирает два павкета, не всегда, но часто и передаёт их в двух пакетах, но с другими длиними, 588 и 436 байт. Увеличивал и уменьшал объём передаваемых данных в два раза, результат тотже.
|
|
|
|
|
Nov 7 2016, 18:43
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Oleg_IT @ Nov 7 2016, 08:36)  ....Обработка пока вообще ни какая, просто беру и вывожу номер пакета, а пвкет это те самые 512 байт.... ну тогда давайте от печки... в TCP нет пакетов(!!!!) прочувствуйте фразу = от слова СОВСЕМ НЕТ! (круглый) ЗЫ Практика приёма на работу программистов показывает, что мало кто действительно понимает эту фразу
|
|
|
|
|
Nov 8 2016, 09:48
|
Знающий
   
Группа: Свой
Сообщений: 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(...) обработка принятых данных, сейчас только извлечения номера посылки, который приходит из модуля.
Эскизы прикрепленных изображений
|
|
|
|
|
Nov 8 2016, 19:27
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Oleg_IT @ Nov 8 2016, 12:48)  ... Фрагмент кода приёмника Код 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(); } ... Подкорректируйте меня если я обшибаюсь... Вы очищаете массив(закос под кути или порт кутишный). Считываете всё что пришло в ку-байт-эррэй. получаете кол-во принятых байт. и далее передаёте на обработку.... Т.е. для этого кода, будет ликвиден и один байт, и два, и 100, и килобайт. Т.е. если например произошёл затор в сети, и ваши данные на IP уровне безбожно режутся хопами, вы можете получить очень и очень разные и замысловатые длины полезных данных. Представляйте себе трубу. С одной стороны в которую заливают данные, с другой вы эти данные последовательно выгребаете. Но если Вам нужна квантованность - то увы и ах, это Ваша личная забота. И то что Вы будете получать в одном тихом локальном сегменте сети апсолютно не даст гарантии того, что при ударной нагрузке либо потерях в сети Ваш код будет устойчиво работать. Обратите внимание на реализацию приёмников в грамотных кодах серваков - там кол-во байт которое необходимо принять передаётся в подпрограмму приёма. И подпрограмма действует по принципу либо всё либо ошибка. Длины данных обычно передают в хедере фиксированной длины. т.е. Ваш приёмник (как один из вариантов) должен быть реализован как приём фиксированной длины хедера, далее взятие из этого хедера длины данных, подготовка приёмного буффера, и собственно приём данных пришедшей из хидера. удачи вам (круглый) ЗЫ Есть ещё настройки TCP уровня по задержке перед передачей, но там задержки(по дефолту - не более нескольких мс). Т.е. если у Вас глюкало на секунды-минуты - это явно хромает консерватория... ЗЫ ЗЫ Ваш код приёмника (я сначала подумал что под армом пишете, но от этого рояль не меняется) может быть типа такого Код void CTcpClient::_slotAnswera() { if (m_baHeader.size() == 0) { if (m_pTcpSocket->bytesAvailable() < sizeof(HRBusinessLogic::Tools::SDataHeader)) return; // m_baHeader = m_pTcpSocket->read(sizeof(HRBusinessLogic::Tools::SDataHeader)); } // const HRBusinessLogic::Tools::SDataHeader* pReceiveData = reinterpret_cast<const HRBusinessLogic::Tools::SDataHeader*>(m_baHeader.constData()); // if (m_pTcpSocket->bytesAvailable() < pReceiveData->m_unSize) return; // QByteArray data = m_pTcpSocket->read(pReceiveData->m_unSize); data.push_front(m_baHeader); m_baHeader.clear(); emit eventProcessingData(data); }
Сообщение отредактировал kolobok0 - Nov 8 2016, 19:50
|
|
|
|
|
Nov 9 2016, 05:49
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
Буфер конечно не резиновый, но и о скорости 100500 я не говорю, первый же вызов tcp_write не дождавшись ответа, вызывает ошибку памяти и этот посланный пакет теряется. Из этого и сделал вывод, что «lwip, у меня, ни чего не копит» и на приёмной стороне номеров этих пакетов не получаю. По Qt. Цитата Вы очищаете массив(закос под кути или порт кутишный). Считываете всё что пришло в ку-байт-эррэй. получаете кол-во принятых байт. и далее передаёте на обработку.... Можно и не очищать. Да всё так. В обработчике AddData у меня стоит сборщик кусков, в пакете синхронизатор включён, а сам пакет постоянной длины, сделал этот код сам, проверено, работает. Пришлось сделать этот код, кода начал получать два пакета одинаковой длины в двух пакетах разной длины, я это уже отмечал. Сделал на PC имитатор стороны ARM, скорости держит несколько килогерц, специально вводил разбиение пакетов, связка работает стабильно. Цитата погуглите по ключевым словами "LwIP delayed ack" и "LwIP nagle algorithm", возможно найдете что-то полезное. Смотрел, информации по этим темам не много, пока чего-то туплю
|
|
|
|
|
Nov 9 2016, 19:02
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Oleg_IT @ Nov 9 2016, 08:49)  ..В обработчике AddData у меня стоит сборщик кусков,...Пришлось сделать этот код, кода начал получать... если Вы уверены в сборке - это конечно же хорошо. то что Вы дублируете два-раза-два-раза кэшширование и сборку полезных данных - ну значит Вам так проще осязать. осталось обратиться к барабашке  постарайтесь выкинуть всю обработку на приёме и сделать тупую отправку в сеть. если есть сетевой анализатор - то по любому адресу кроме 127.0.0.1 после этого посмотрите скорость и задержки. если их нет = проблемы в консерватории. ведь судя по трафику арм выдаёт запрос штатно, писюк выдаёт тайм-аут. собственно два вектора 1) почему писюк завис(не выдал подтверждения) 2) почему арм не пытается пропихнуть далее ситуацию(ретрансмит) обратите внимание на временной лаг ответа со стороны писюка и со стороны арма. со стороны арма - около 250 мс (что собственно слишком медленно, но не смертельно) со стороны писюка в 1000 раз быстрее. т.е. на писюке имеем запас по скорострельности более чем в 1000 раз. посему зависон со стороны арма(нет ретрансмишена) - это фигня по сравнению с зависоном со стороны писюка (он уже мог сотню раз принять решение). значит не может. думаю рыть надо в сторону писюка. зная не тривиальную обработку сокетов под кути, думаю что истина где то рядом... попытайтесь сделать передачу без вашей логики приёма и сбора пакетов. сразу на передачу. думаю ситуация сдвинется с мёртвой точки. удачи вам (круглый)
Сообщение отредактировал kolobok0 - Nov 9 2016, 19:03
|
|
|
|
Сообщений в этой теме
Oleg_IT STM32F4+lwip медленно работает. Oct 31 2016, 06:01 Сергей Борщ QUOTE (Oleg_IT @ Oct 31 2016, 09:01) данн... Oct 31 2016, 07:25 Oleg_IT Да, не уточнил у меня TCP.
По буферам посмотрю, н... Oct 31 2016, 08:44 kolobok0 [quote name='Oleg_IT' date='Oct 31 201... Oct 31 2016, 17:56 Oleg_IT Чем TCP от UDP отличается я знаю, это так к сведен... Nov 1 2016, 05:24 kolobok0 Цитата(Oleg_IT @ Nov 1 2016, 08:24) Чем T... Nov 5 2016, 07:45 Sanya_kv Цитата(Oleg_IT @ Oct 31 2016, 10:01) Прое... Nov 3 2016, 10:26    scifi Цитата(Oleg_IT @ Nov 8 2016, 12:48) Как в... Nov 8 2016, 09:59     Oleg_IT Цитата(scifi @ Nov 8 2016, 13:59) Если да... Nov 8 2016, 10:23      scifi Цитата(Oleg_IT @ Nov 8 2016, 13:23) Еслиб... Nov 8 2016, 10:31      HardEgor Цитата(Oleg_IT @ Nov 9 2016, 12:49) Буфер... Nov 9 2016, 06:53 sadat Что показывает мониторинг программой wireshark или... Nov 7 2016, 16:07 Сергей Борщ QUOTE (scifi @ Nov 7 2016, 22:03) И вообщ... Nov 8 2016, 07:07 Oleg_IT Я свои байты вижу четыре раза в секунду.
Может и ... Nov 9 2016, 10:06 scifi Цитата(Oleg_IT @ Nov 9 2016, 13:06) Не по... Nov 9 2016, 10:39 HardEgor Цитата(Oleg_IT @ Nov 9 2016, 17:06) Может... Nov 9 2016, 12:27 arhiv6 Не надо делать так:Код slotSendToServer();... Nov 10 2016, 04:56 Oleg_IT Цитата(arhiv6 @ Nov 10 2016, 08:56)
Слот... Nov 10 2016, 05:14 arhiv6 Но Вы запись в сокет делаете из этой же функции, к... Nov 10 2016, 06:04 Oleg_IT Цитата(arhiv6 @ Nov 10 2016, 10:04) Но Вы... Nov 10 2016, 08:44 Oleg_IT Пытаюсь вывести дубужную информацию, подключил тер... Nov 11 2016, 08:51 Oleg_IT Решил я свою проблему.
Код отсылки такой
Кодtcp_na... Nov 16 2016, 13:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|