2023-08-22 05:25 AM
Hi,
I am trying to set up an http server on STM32H750B-DK (on STM32CubeIDE) with LwIP. When I program it without implementing FreeRTOS I call the function MX_LWIP_Process in while function in main:
* Function given to help user to continue LwIP Initialization * Up to user to complete or change this function ... * Up to user to call this function in main.c in while (1) of main(void) *----------------------------------------------------------------------- * Read a received packet from the Ethernet buffers * Send it to the lwIP stack for handling * Handle timeouts if LWIP_TIMERS is set and without RTOS * Handle the llink status if LWIP_NETIF_LINK_CALLBACK is set and without RTOS */ void MX_LWIP_Process(void) { ethernetif_input(&gnetif); sys_check_timeouts(); Ethernet_Link_Periodic_Handle(&gnetif); }
The IP address pings fine and the http server is set up. But when I enable FreeRTOS the declaration of this function does not happen:
#if !WITH_RTOS /* Function defined in lwip.c to: * - Read a received packet from the Ethernet buffers * - Send it to the lwIP stack for handling * - Handle timeouts if NO_SYS_NO_TIMERS not set */ void MX_LWIP_Process(void); #endif /* WITH_RTOS */
Even if I define it outside the if function it doesn’t work. I guess this should work in another way when working with RTOS. I tried calling http_server_init in StartDefaultTask:
static void http_server(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 */ recv_err = netconn_recv(conn, &inbuf); if (recv_err == ERR_OK) { if (netconn_err(conn) == ERR_OK) { /* Get the data pointer and length of the data inside a netbuf */ netbuf_data(inbuf, (void**)&buf, &buflen); /* Check if request to get the index.html */ if (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 { /* Load Error page */ fs_open(&file, "/404.html"); netconn_write(conn, (const unsigned char*)(file.data), (size_t)file.len, NETCONN_NOCOPY); fs_close(&file); } } } /* 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); } static void http_thread(void *arg) { struct netconn *conn, *newconn; err_t err, accept_err; /* Create a new TCP connection handle */ conn = netconn_new(NETCONN_TCP); if (conn!= NULL) { /* Bind to port 80 (HTTP) with default IP address */ err = netconn_bind(conn, IP_ADDR_ANY, 80); if (err == ERR_OK) { /* Put the connection into LISTEN state */ netconn_listen(conn); while(1) { /* accept any incoming connection */ accept_err = netconn_accept(conn, &newconn); if(accept_err == ERR_OK) { /* serve connection */ http_server(newconn); /* delete connection */ netconn_delete(newconn); } } } } } void http_server_init() { sys_thread_new("http_thread", http_thread, NULL, DEFAULT_THREAD_STACKSIZE, osPriorityNormal); }
Still doesn’t work. Can anyone help me?
2023-08-24 02:13 AM
Hello @AK16 ,
I can't help you on this subject as my knowledge concerning it is limited, and your question doesn't seem to be related to TouchGFX. I suggest you move your thread to the Embedded Software (MCU) forum you'll have a better chance of getting an answer.
2023-08-24 03:59 AM - edited 2023-08-24 04:00 AM
@AK16 Note that functions in ethernetif.c may be implemented differently with and without RTOS. Make sure that your ethernetif.c follows the right type.