Explorar o código

Merge branch 'bugfix/silent_asserts_v4.3' into 'release/v4.3'

freertos/lw ip: Support silent assertions (v4.3)

See merge request espressif/esp-idf!13011
Angus Gratton %!s(int64=4) %!d(string=hai) anos
pai
achega
7703fcbd8d

+ 3 - 2
components/bootloader/subproject/CMakeLists.txt

@@ -28,10 +28,11 @@ set(COMPONENTS
     micro-ecc
     main
     efuse
-    esp_system)
+    esp_system
+    newlib)
 set(BOOTLOADER_BUILD 1)
 include("${IDF_PATH}/tools/cmake/project.cmake")
-set(common_req log esp_rom esp_common esp_hw_support hal)
+set(common_req log esp_rom esp_common esp_hw_support hal newlib)
 if(LEGACY_INCLUDE_COMMON_HEADERS)
     list(APPEND common_req soc hal)
 endif()

+ 8 - 1
components/freertos/Kconfig

@@ -141,18 +141,25 @@ menu "FreeRTOS"
 
     choice FREERTOS_ASSERT
         prompt "FreeRTOS assertions"
-        default FREERTOS_ASSERT_FAIL_ABORT
+        default FREERTOS_ASSERT_FAIL_ABORT if !COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE
+        default FREERTOS_ASSERT_DISABLE if COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE
         help
             Failed FreeRTOS configASSERT() assertions can be configured to
             behave in different ways.
 
+            By default these behave the same as the global project assert settings.
+
         config FREERTOS_ASSERT_FAIL_ABORT
             bool "abort() on failed assertions"
+            depends on !COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE
             help
                 If a FreeRTOS configASSERT() fails, FreeRTOS will abort() and
                 halt execution. The panic handler can be configured to handle
                 the outcome of an abort() in different ways.
 
+                If assertions are disabled for the entire project, they are also
+                disabled in FreeRTOS and this option is unavailable.
+
         config FREERTOS_ASSERT_FAIL_PRINT_CONTINUE
             bool "Print and continue failed assertions"
             help

+ 3 - 7
components/freertos/port/riscv/include/freertos/FreeRTOSConfig.h

@@ -88,7 +88,7 @@
 
 /* configASSERT behaviour */
 #ifndef __ASSEMBLER__
-#include <stdlib.h> /* for abort() */
+#include <assert.h>
 #include "esp32c3/rom/ets_sys.h"
 
 #if defined(CONFIG_FREERTOS_ASSERT_DISABLE)
@@ -98,12 +98,8 @@
         esp_rom_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__,  \
                    __FUNCTION__);                                           \
     }
-#else /* CONFIG_FREERTOS_ASSERT_FAIL_ABORT */
-#define configASSERT(a) if (unlikely(!(a))) {                               \
-        esp_rom_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__,  \
-                   __FUNCTION__);                                           \
-        abort();                                                            \
-        }
+#elif defined(CONFIG_FREERTOS_ASSERT_FAIL_ABORT)
+#define configASSERT(a) assert(a)
 #endif
 
 #if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION

+ 3 - 7
components/freertos/port/xtensa/include/freertos/FreeRTOSConfig.h

@@ -119,7 +119,7 @@ int xt_clock_freq(void) __attribute__((deprecated));
 
 /* configASSERT behaviour */
 #ifndef __ASSEMBLER__
-#include <stdlib.h> /* for abort() */
+#include <assert.h>
 #include "esp_rom_sys.h"
 #if CONFIG_IDF_TARGET_ESP32
 #include "esp32/rom/ets_sys.h"  // will be removed in idf v5.0
@@ -138,12 +138,8 @@ int xt_clock_freq(void) __attribute__((deprecated));
         esp_rom_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__,  \
                    __FUNCTION__);                                           \
     }
-#else /* CONFIG_FREERTOS_ASSERT_FAIL_ABORT */
-#define configASSERT(a) if (unlikely(!(a))) {                               \
-        esp_rom_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__,  \
-                   __FUNCTION__);                                           \
-        abort();                                                            \
-        }
+#elif defined(CONFIG_FREERTOS_ASSERT_FAIL_ABORT)
+#define configASSERT(a) assert(a)
 #endif
 
 #if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION

+ 6 - 2
components/lwip/Kconfig

@@ -771,9 +771,13 @@ menu "LWIP"
     config LWIP_ESP_LWIP_ASSERT
         bool "Enable LWIP ASSERT checks"
         default y
+        depends on !COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE
         help
-            Enable this option allows lwip to check assert.
-            It is recommended to keep it open, do not close it.
+            Enable this option keeps LWIP assertion checks enabled.
+            It is recommended to keep this option enabled.
+
+            If asserts are disabled for the entire project, they are also disabled
+            for LWIP and this option is ignored.
 
     menu "Hooks"
 

+ 10 - 3
components/lwip/port/esp32/include/arch/cc.h

@@ -75,13 +75,20 @@ typedef int sys_prot_t;
 #include <stdio.h>
 
 #define LWIP_PLATFORM_DIAG(x)   do {printf x;} while(0)
-// __assert_func is the assertion failure handler from newlib, defined in assert.h
-#define LWIP_PLATFORM_ASSERT(message) __assert_func(__FILE__, __LINE__, __ASSERT_FUNC, message)
 
 #ifdef NDEBUG
-#define LWIP_NOASSERT
+
+#define LWIP_NOASSERT 1
+
 #else // Assertions enabled
 
+#if CONFIG_OPTIMIZATION_ASSERTIONS_SILENT
+#define LWIP_PLATFORM_ASSERT(message) abort()
+#else
+// __assert_func is the assertion failure handler from newlib, defined in assert.h
+#define LWIP_PLATFORM_ASSERT(message) __assert_func(__FILE__, __LINE__, __ASSERT_FUNC, message)
+#endif
+
 // If assertions are on, the default LWIP_ERROR handler behaviour is to
 // abort w/ an assertion failure. Don't do this, instead just print the error (if LWIP_DEBUG is set)
 // and run the handler (same as the LWIP_ERROR behaviour if LWIP_NOASSERT is set).

+ 6 - 0
components/newlib/CMakeLists.txt

@@ -1,3 +1,9 @@
+if(BOOTLOADER_BUILD)
+    # Bootloader builds need the platform_include directory (for assert.h), but nothing else
+    idf_component_register(INCLUDE_DIRS platform_include)
+    return()
+endif()
+
 set(srcs
     "abort.c"
     "heap.c"