Перейти к содержанию
    

STM32 LWIP HTTP Server packets retransmission

Уважаемые коллеги, здравствуйте!

Делаю http сервер на sockets API, всё в целом работает, но во-первых, иногда (не всегда) страница 60кб довольно долго грузится (3-4c), а во-вторых, wireshark показывает ретрансмиты (см. картинку). Статистика LWIP показывает, что всего хватает. И памяти, и буферов. Ошибки в статистике все по нолям. И в общем, эти ретрансмиты не мешают, но всё равно хочется избавиться от них.

Пробовал делать параллельный сервер (отдельная задача на каждый сокет), но во-первых это не помогло уйти от ретрансмитов, а во-вторых появилась проблема некорректного закрытия сокетов, которые со временем накапливались и вешали приложение напрочь.

В общем, подскажите, пожалуйста, может у кого-то есть решение вышеперечисленных проблем?

Screenshot_67.png

Screenshot_66.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, и еще. Вставляю свою страницу в пример от ST, меняю пути к файлам, всё работает отлично. Хотя в lwipopts у меня гораздо больше ресурсов, чем в примере от ST.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как я понял, slip/ppp ? покажите свою функцию передачи

 

Или сами прлверьте - поддерживается ли многосегментный pbuf

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void http_server_serve(struct netconn *conn)
{
 struct netbuf *inbuf;
 err_t recv_err;
 char* buf;
 u16_t buflen;
 struct fs_file file;

 /* Read the data from the port, blocking if nothing yet there.
  We assume the request (the part we care about) is in one netbuf */
 recv_err = netconn_recv(conn, &inbuf);

 if (recv_err == ERR_OK)
 {
   if (netconn_err(conn) == ERR_OK)
   {
     netbuf_data(inbuf, (void**)&buf, &buflen);

     /* Is this an HTTP GET command? (only check the first 5 chars, since
     there are other formats for GET, and we're keeping it very simple )*/
     if ((buflen >=5) && (strncmp(buf, "GET /", 5) == 0))
     {
       if ((strncmp((char const *)buf,"GET / ",6)==0)||(strncmp((char const *)buf,"GET /index.html",15)==0))
       {
         fs_open(&file, "/index.html");
         netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
         fs_close(&file);
       }
       else if (strncmp((char const *)buf,"GET /port1.html",15)==0)
		  {
			fs_open(&file, "/port1.html");
			netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
			fs_close(&file);
		  }
		  else if (strncmp((char const *)buf,"GET /IMG/logo.png",17)==0)
       {
         fs_open(&file, "/IMG/logo.png");
         netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
         fs_close(&file);
       }
       else if (strncmp((char const *)buf,"GET /NotoSerif.woff",19)==0)
       {
         fs_open(&file, "/NotoSerif.woff");
         netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
         fs_close(&file);
       }
       else if (strncmp((char const *)buf,"GET /style.css",14)==0)
       {
         fs_open(&file, "/style.css");
         netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
         fs_close(&file);
       }
       else if (strncmp((char const *)buf,"GET /IMG/img1.jpg",17)==0)
       {
         fs_open(&file, "/IMG/img1.jpg");
         netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
         fs_close(&file);
       }
       else if (strncmp((char const *)buf,"GET /IMG/img2.jpg",17)==0)
       {
         fs_open(&file, "/IMG/img2.jpg");
         netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
         fs_close(&file);
       }
       else if (strncmp((char const *)buf,"GET /IMG/img3.jpg",17)==0)
       {
         fs_open(&file, "/IMG/img3.jpg");
         netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
         fs_close(&file);
       }
       else if (strncmp((char const *)buf,"GET /IMG/arrow.png",18)==0)
       {
         fs_open(&file, "/IMG/arrow.png");
         netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
         fs_close(&file);
       }
       else
       {
         fs_open(&file, "/404.html");
         netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY);
         fs_close(&file);
       }
       printf("Heap minimum size %u\r\n",xPortGetMinimumEverFreeHeapSize());
     }
   }
 }
 /* Close the connection (server closes in HTTP) */
 netconn_close(conn);

 /* Delete the buffer (netconn_recv gives us ownership,
  so we have to make sure to deallocate the buffer) */
 netbuf_delete(inbuf);
}

На самом деле, сейчас функция передачи это функция из примера ST. Только с моими файлами и путями. Только в примере она работает, как нужно, а у меня пока нет. Сейчас смотрю в сторону приоритетов прерываний, сравниваю пример с моими.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А это то зачем притащили? Показали бы функцию передачи из прмеров st...

То что она из примеров не гарантирует что там все правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сегодня проверил то же самое с F746-DISCO. Собрал пример от ST, закинул свою страницу, запустил. Всё работает отлично, несмотря на то, что стек жалуется на нехватку памяти. Но с нехваткой памяти я знаю, как справиться. А когда генерирую новый проект из CubeIDE, http сервер работает медленно и генерирует ретрансмиты. Код сервера беру из этого же примера. Три дня уже потратил в поисках проблемы. Куда смотреть, подскажите пожалуйста. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем, коллеги, я совершенно не понимаю, почему, но когда я сгенерировал проект не в STM32CubeIDE, а в STM32CubeMX, проблема пропала сама собой. Теперь мой сервер работает отлично.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, IvanPletnev сказал:

STM32CubeIDE, а в STM32CubeMX, проблема пропала сама собой.

Ну вот и угадайка будет - где код более корявый, а где получше)))

А вообще, чем они отличаются все эти STM32CubeIDE и STM32CubeMX?

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, IvanPletnev said:

я совершенно не понимаю, почему, но когда я сгенерировал проект не в STM32CubeIDE, а в STM32CubeMX, проблема пропала сама собой

А в чем разница этих проектов (кроме запуска генератора) ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Больше нет никакой разницы. Просто мне понадобился web интерфейс на устройство, которое уже почти готово. Для того, чтобы потренироваться с http сервером я не стал встраивать его сразу в устройство, а решил сначала сделать для него отдельный проект. Взял CubeIDE, настроил LWIP, сгенерировал, запустил. И потом несколько дней провозился собственно с сабжем. Пока не создал проект в CubeMX с точно такими же настройками. Всё совершенно одинаково, но проект из CubeMX работает хорошо, а из CubeIDE нет. Теперь вот надо прикручивать SGI и SSI. Если кто-то поделится опытом в этом смысле, буду благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем, экспериментальным путём я выяснил, что эта проблема появляется, когда код генерируется CubeMX v. 6.2.1 и STM32Cube F4 v. 1.26.1. 

Когда код сгенерирован CubeMX v. 6.1.1 или 6.1.2 и STM32Cube F4 v. 1.25.2 всё работает отлично. Заметил, что в версии 1.26.1 обновлена FreeRTOS до 10.3.1. Пока не разбирался, в чём там отличия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулся с аналогичной пролемой на STM32F207. Retransmission при передаче больших страниц. Долго искал проблемы в программной части, оказалось- проблемы с питанием. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, cybersonner said:

Столкнулся с аналогичной пролемой на STM32F207. Retransmission при передаче больших страниц. Долго искал проблемы в программной части, оказалось- проблемы с питанием. 

В моём случае точно не из-за питания, на одной и той же плате всё. Сейчас тестирую, всё работает отлично. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...