Jump to content

    
IvanPletnev

STM32 LWIP HTTP Server packets retransmission

Recommended Posts

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

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

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

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

Screenshot_67.png

Screenshot_66.png

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

 

Share this post


Link to post
Share on other sites
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. Только с моими файлами и путями. Только в примере она работает, как нужно, а у меня пока нет. Сейчас смотрю в сторону приоритетов прерываний, сравниваю пример с моими.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
7 часов назад, IvanPletnev сказал:

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

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

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

Edited by mantech

Share this post


Link to post
Share on other sites
10 hours ago, IvanPletnev said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

В общем, экспериментальным путём я выяснил, что эта проблема появляется, когда код генерируется 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. Пока не разбирался, в чём там отличия.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 hour ago, cybersonner said:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.