WiFi or TCP-IP Blocking high priority FreeRTOS tasks for over 10 seconds

GerryBriggs
Posts: 20
Joined: Tue Oct 24, 2023 10:11 pm

WiFi or TCP-IP Blocking high priority FreeRTOS tasks for over 10 seconds

Postby GerryBriggs » Sun Aug 04, 2024 10:55 pm

I have an audio streaming client running on ESP32-C3 and I have optimized all the buffers and even have the IRAM optimizations for TCP-IP and WIFI in sdk_config. My problem is that when I put the internet radio receiver into a difficult wifi environment, I seem to completely lose control of it. I have a regularly updating task that VTaskDelays for 100 milliseconds and normally is fine, and with priority set to 23 which is the same priority as WiFi's free-RTOS priority. TCP-IP is only set at 18 which is a lower FreeRTOS priority.

Is there way to break into the wifi stack and to tell it to give up after 2 seconds of nothing? It is just completely blocking everything else at the moment, and I need some kind of timeout callback or any means of killing the existing TCP socket (which I normally do at the application layer) when it takes too long.

GerryBriggs
Posts: 20
Joined: Tue Oct 24, 2023 10:11 pm

Re: WiFi or TCP-IP Blocking high priority FreeRTOS tasks for over 10 seconds

Postby GerryBriggs » Mon Aug 05, 2024 2:31 am

Nevermind I solved it - it is the .timeout_ms field in esp_http_client_config_t which determines how long the TCP-IP is allowed to block everything else

User avatar
mbratch
Posts: 303
Joined: Fri Jun 11, 2021 1:51 pm

Re: WiFi or TCP-IP Blocking high priority FreeRTOS tasks for over 10 seconds

Postby mbratch » Mon Aug 05, 2024 2:24 pm

Good find!
Do you know what the default is for the `.timeout_ms` setting? I couldn't find it in the documentation for `esp_http_client_config_t`

GerryBriggs
Posts: 20
Joined: Tue Oct 24, 2023 10:11 pm

Re: WiFi or TCP-IP Blocking high priority FreeRTOS tasks for over 10 seconds

Postby GerryBriggs » Tue Aug 06, 2024 1:58 pm

In ADF they seem to set it at 30,000 milliseconds (or 30 seconds) and that's done when the client is initialized. The original ADF coder does the HTTP Client initialize like this:

esp_http_client_config_t http_cfg = {
.url = uri,
.event_handler = _http_event_handle,
.user_data = self,
.timeout_ms = 30 * 1000,
.buffer_size = HTTP_STREAM_BUFFER_SIZE, // originally 5120 bytes
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 1, 0)
.buffer_size_tx = 1024,
#endif
.cert_pem = http->cert_pem,
#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)) && defined CONFIG_MBEDTLS_CERTIFICATE_BUNDLE
.crt_bundle_attach = http->crt_bundle_attach,
#endif // (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)) && defined CONFIG_MBEDTLS_CERTIFICATE_BUNDLE
.user_agent = http->user_agent,
};

http->client = esp_http_client_init(&http_cfg);

Who is online

Users browsing this forum: No registered users and 350 guests