From 2696a127dedc0eab1f94b720a9ab1e5117dc9e30 Mon Sep 17 00:00:00 2001 From: David McCurley <44048235+mrengineer7777@users.noreply.github.com> Date: Tue, 5 Dec 2023 09:23:40 -0600 Subject: [PATCH 1/4] Example: ResetReason2 (#8105) * Create ResetReason2.ino * Separate Reset Examples Moved examples to separate sub folders --- .../{ => ResetReason}/ResetReason.ino | 0 .../ResetReason/ResetReason2/ResetReason2.ino | 64 +++++++++++++++++++ 2 files changed, 64 insertions(+) rename libraries/ESP32/examples/ResetReason/{ => ResetReason}/ResetReason.ino (100%) create mode 100644 libraries/ESP32/examples/ResetReason/ResetReason2/ResetReason2.ino diff --git a/libraries/ESP32/examples/ResetReason/ResetReason.ino b/libraries/ESP32/examples/ResetReason/ResetReason/ResetReason.ino similarity index 100% rename from libraries/ESP32/examples/ResetReason/ResetReason.ino rename to libraries/ESP32/examples/ResetReason/ResetReason/ResetReason.ino diff --git a/libraries/ESP32/examples/ResetReason/ResetReason2/ResetReason2.ino b/libraries/ESP32/examples/ResetReason/ResetReason2/ResetReason2.ino new file mode 100644 index 00000000000..e0aa81ad523 --- /dev/null +++ b/libraries/ESP32/examples/ResetReason/ResetReason2/ResetReason2.ino @@ -0,0 +1,64 @@ +//---------------------------------------------------------------------------------- +// ResetReason2.ino +// +// Prints last reset reason of ESP32 +// This uses the mechanism in IDF that persists crash reasons across a reset. +// See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/misc_system_api.html#software-reset +// +// This example uses esp_reset_reason() instead of rtc_get_reset_reason(0). +// This example forces a WDT timeout in 10s. +// +// Note enableLoopWDT() cannot be used here because it also takes care of +// resetting WDT. See cores/esp32/main.cpp::loopTask(). +// +// Author: David McCurley +// Public Domain License +//---------------------------------------------------------------------------------- +// 2023.04.21 r1.0 Initial release +//---------------------------------------------------------------------------------- + +#include "esp_task_wdt.h" + +//Converts reason type to a C string. +//Type is located in /tools/sdk/esp32/include/esp_system/include/esp_system.h +const char * resetReasonName(esp_reset_reason_t r) { + switch(r) { + case ESP_RST_UNKNOWN: return "Unknown"; + case ESP_RST_POWERON: return "PowerOn"; //Power on or RST pin toggled + case ESP_RST_EXT: return "ExtPin"; //External pin - not applicable for ESP32 + case ESP_RST_SW: return "Reboot"; //esp_restart() + case ESP_RST_PANIC: return "Crash"; //Exception/panic + case ESP_RST_INT_WDT: return "WDT_Int"; //Interrupt watchdog (software or hardware) + case ESP_RST_TASK_WDT: return "WDT_Task"; //Task watchdog + case ESP_RST_WDT: return "WDT_Other"; //Other watchdog + case ESP_RST_DEEPSLEEP: return "Sleep"; //Reset after exiting deep sleep mode + case ESP_RST_BROWNOUT: return "BrownOut"; //Brownout reset (software or hardware) + case ESP_RST_SDIO: return "SDIO"; //Reset over SDIO + default: return ""; + } +} + +void PrintResetReason(void) { + esp_reset_reason_t r = esp_reset_reason(); + if(r==ESP_RST_POWERON) { + delay(6000); //Wait for serial monitor to connect + } + Serial.printf("\r\nReset reason %i - %s\r\n", r, resetReasonName(r)); +} + +void setup() { + Serial.begin(115200); + PrintResetReason(); + + //Start WDT monitor + if(esp_task_wdt_add(NULL) != ESP_OK) { + log_e("Failed to add current task to WDT"); + } +} + +//Enable esp_task_wdt_reset() below to prevent a WDT reset +void loop() { + Serial.printf("Alive %lums\r\n", millis()); + //esp_task_wdt_reset(); + delay(1000); //1s delay +} \ No newline at end of file From c005319c0ac8ea6a27aeceacc106b44888099cab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:14:52 +0100 Subject: [PATCH 2/4] fix examples path (#8963) --- idf_component.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idf_component.yml b/idf_component.yml index 1eba05aa48d..cb56652e9ed 100644 --- a/idf_component.yml +++ b/idf_component.yml @@ -66,5 +66,5 @@ dependencies: rules: - if: "target in [esp32s3]" examples: - - path: ../idf_component_examples/ + - path: idf_component_examples/ From 8520725eb722c916c79dfdc0f53836600bc7818c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:54:35 +0100 Subject: [PATCH 3/4] install arduino-cli instead Arduino IDE (#8961) Co-authored-by: Lucas Saavedra Vaz --- .github/scripts/tests_build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/scripts/tests_build.sh b/.github/scripts/tests_build.sh index f7e4b7aaed2..724e2171b13 100755 --- a/.github/scripts/tests_build.sh +++ b/.github/scripts/tests_build.sh @@ -46,7 +46,8 @@ while [ ! -z "$1" ]; do shift done -source ${SCRIPTS_DIR}/install-arduino-ide.sh +#source ${SCRIPTS_DIR}/install-arduino-ide.sh +source ${SCRIPTS_DIR}/install-arduino-cli.sh source ${SCRIPTS_DIR}/install-arduino-core-esp32.sh args="-ai $ARDUINO_IDE_PATH -au $ARDUINO_USR_PATH" From 51cb927712e512664a0a0f7b1219fdc18e11b857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Sch=C3=A4ffersmann?= <117294155+MattiasTF@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:54:53 +0100 Subject: [PATCH 4/4] Fix race condition in WiFiGenericClass::hostByName (#8672) dns_gethostbyname, as used in hostByName, is required to run in lwIP's TCP/IP context. This can be verified by enabling LWIP_CHECK_THREAD_SAFETY in the sdkconfig. Calling dns_gethostbyname from the Arduino task can trigger race conditions in lwIP or lower layers. One possibility is a corruption of IDF's Ethernet buffers, causing an unstoppable flood of "insufficient TX buffer size" errors, effectively severing all Ethernet connectivity. This patch makes sure to call dns_gethostbyname from lwIP's TCP/IP context. --- libraries/WiFi/src/WiFiGeneric.cpp | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 56843429a34..8ef803064c4 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -37,6 +37,7 @@ extern "C" { #include #include #include +#include #include "lwip/ip_addr.h" #include "lwip/opt.h" #include "lwip/err.h" @@ -1559,6 +1560,22 @@ static void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, v xEventGroupSetBits(_arduino_event_group, WIFI_DNS_DONE_BIT); } +typedef struct gethostbynameParameters { + const char *hostname; + ip_addr_t addr; + void *callback_arg; +} gethostbynameParameters_t; + +/** + * Callback to execute dns_gethostbyname in lwIP's TCP/IP context + * @param param Parameters for dns_gethostbyname call + */ +static esp_err_t wifi_gethostbyname_tcpip_ctx(void *param) +{ + gethostbynameParameters_t *parameters = static_cast(param); + return dns_gethostbyname(parameters->hostname, ¶meters->addr, &wifi_dns_found_callback, parameters->callback_arg); +} + /** * Resolve the given hostname to an IP address. If passed hostname is an IP address, it will be parsed into IPAddress structure. * @param aHostname Name to be resolved or string containing IP address @@ -1570,13 +1587,15 @@ int WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResult) { if (!aResult.fromString(aHostname)) { - ip_addr_t addr; + gethostbynameParameters_t params; + params.hostname = aHostname; + params.callback_arg = &aResult; aResult = static_cast(0); waitStatusBits(WIFI_DNS_IDLE_BIT, 16000); clearStatusBits(WIFI_DNS_IDLE_BIT | WIFI_DNS_DONE_BIT); - err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult); - if(err == ERR_OK && addr.u_addr.ip4.addr) { - aResult = addr.u_addr.ip4.addr; + err_t err = esp_netif_tcpip_exec(wifi_gethostbyname_tcpip_ctx, ¶ms); + if(err == ERR_OK && params.addr.u_addr.ip4.addr) { + aResult = params.addr.u_addr.ip4.addr; } else if(err == ERR_INPROGRESS) { waitStatusBits(WIFI_DNS_DONE_BIT, 15000); //real internal timeout in lwip library is 14[s] clearStatusBits(WIFI_DNS_DONE_BIT);