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

 
 
> 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
 
Start new topic
Ответов
Oleg_IT
сообщение Nov 7 2016, 05:36
Сообщение #2


Знающий
****

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



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

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


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

Группа: Участник
Сообщений: 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
Сообщение #4


Гуру
******

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



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

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


Знающий
****

Группа: Свой
Сообщений: 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
kolobok0
сообщение Nov 8 2016, 19:27
Сообщение #6


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

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - Oleg_IT   Буфер конечно не резиновый, но и о скорости 100500...   Nov 9 2016, 05:49
|- - HardEgor   Цитата(Oleg_IT @ Nov 9 2016, 12:49) Буфер...   Nov 9 2016, 06:53
|- - kolobok0   Цитата(Oleg_IT @ Nov 9 2016, 08:49) ..В о...   Nov 9 2016, 19:02
- - 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


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

 


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


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