Skocz do zawartości

STM32 F207 LWIP serwer HTTP netconn FreeRtos - blokowanie netconn_write() podczas wysyłania danych


szczygiel256

Pomocna odpowiedź

Cześć,

na początek chciałbym się przywitać. Nie pamiętam czy pisałem coś na forum, a jeżeli tak to musiało być bardzo dawno.

Zaprojektowałem urządzenie serwera HTTP na bazie stm32f207 i DP83848 (PHY). Oprogramowanie wygenerowałem z użyciem najnowszego CubeMX oraz wersji biblioteki dla procesora stm32f207 v1.9. Wykorzystałem LWIP jako stos TCP/IP oraz FreeRtos-a jako system, komunikacja TCP za pomocą netconn.

Wygenerowany szablon zmodyfikowałem na wzór dostarczonego przez ST. Utworzyłem wątek http_server_netconn_thread(), w którym oczekuję na informacje ze strony. Nic odkrywczego. Pierwsza linia to utworzenie nowego wątku a poniżej jest sam wątek.

httpTaskHandle = sys_thread_new("HTTP", http_server_netconn_thread, NULL, 4095, osPriorityHigh);

void http_server_netconn_thread(void *arg)
{
	static struct netconn *TCPListener, *newconn;
	static err_t err, conn_check, deleteErr;

	TCPListener = netconn_new(NETCONN_TCP);

	if (TCPListener != NULL)
	{
		err = netconn_bind(TCPListener, IP_ADDR_ANY, PORT_60662);

      if (err == ERR_OK)
		{
			netconn_listen(TCPListener);

			while(1)
			{
				netconn_set_recvtimeout(TCPListener, TIME_DELAY_500_MS);
				conn_check = netconn_accept(TCPListener, &newconn);
				if(osOK == osTimerStart (timeOutHttpServerHandle, TIME_DELAY_60_SECONDS))
				{
					timerHttpStatus = TIMER_RUN;
				}

				if(ERR_OK == conn_check)
				{
					http_server_serve(newconn);
					netconn_close(newconn);
					netconn_delete(newconn);
				}
				osTimerStop(timeOutHttpServerHandle);
			}
		}
		else
		{
			netconn_close(newconn);
			netconn_delete(newconn);
		}
	}
}

Funkcja http_server_serve(newconn)() sprawdza czy przyszło zapytanie http i na nie reaguje. Również nic odkrywczego.

void http_server_serve(struct netconn *conn)
{
    connCheck = netconn_recv(conn, &inbuf);
    if(connCheck == ERR_OK)
    {
        if (netconn_err(conn) == ERR_OK)
        {
          // pobranie danych do bufora
            netbuf_data(inbuf, (void**)&buf, &buflen);
            analiza_metody_GET(buf);
            analiza_metody_POST(buf);
        }
    }
    netconn_close(conn);
    netbuf_delete(inbuf);
}

Jeżeli przyszło zapytanie ze strony, program wysyła odpowiedź na to zapytanie. I mógłbym powiedzieć, że wszystko działa. Program działa dobrze do czasu gdy pracuje w sieci lokalnej.

Problemy zaczęły się gdy udostępniłem stronę poza sieć lokalną. Szczególnie zauważalne to jest gdy chcę wyświetlić stronę na smartfonie poprzez sieć komórkową.

Dane do przeglądarki przesyłam za pomocą funkcji netconn_write_partly(). 

netconnResult = netconn_write_partly(conn,  buffer_send, len, NETCONN_NOCOPY, &written);

Niestety po pewnym czasie program blokuje się na tej funkcji i pozostaje już tylko reset. 

Sytuacje taką zauważyłem przy przesyłaniu do przeglądarki pakietów danych o objętości 6,5 kB. Przy przesyłaniu pakietów o objętości poniżej 1kB takich problemów nie zauważyłem.

Przeglądając internet znalazłem parę wątków o problemach z oprogramowaniem od ST. Niestety nie pomogły mi rozwiązać mojego problemu. 

Pytanie do osób przerabiających temat serwera www na stm32 czy przerabiały podobny problem lub czy istnieje możliwość włączenia dla tej funkcji timeout-u umożliwiającego jej opuszczenie i dalsze działanie urządzenia?

 

 

 

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.