From b30ff28034ff7cc0ba22c04206aef04a5923f327 Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Thu, 27 Jan 2022 20:18:39 +0800 Subject: [PATCH 1/2] freertos: always inline xPortSetInterruptMaskFromISR and vPortClearInterruptMaskFromISR These were called from IRAM context where the caller expect them to be inlined and accessible when cache is disabled. This was not the case when compiled with -O0. Closes https://github.com/espressif/esp-idf/issues/8301 --- components/freertos/port/xtensa/include/freertos/portmacro.h | 2 +- tools/unit-test-app/configs/no_optimization_c3 | 3 +++ tools/unit-test-app/configs/no_optimization_esp32 | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 tools/unit-test-app/configs/no_optimization_c3 create mode 100644 tools/unit-test-app/configs/no_optimization_esp32 diff --git a/components/freertos/port/xtensa/include/freertos/portmacro.h b/components/freertos/port/xtensa/include/freertos/portmacro.h index 222a5ae801..19473a721e 100644 --- a/components/freertos/port/xtensa/include/freertos/portmacro.h +++ b/components/freertos/port/xtensa/include/freertos/portmacro.h @@ -105,7 +105,7 @@ typedef unsigned portBASE_TYPE UBaseType_t; // Cleaner solution allows nested interrupts disabling and restoring via local registers or stack. // They can be called from interrupts too. // WARNING: Only applies to current CPU. See notes above. -static inline unsigned portENTER_CRITICAL_NESTED(void) { +static inline unsigned __attribute__((always_inline)) portENTER_CRITICAL_NESTED(void) { unsigned state = XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL); portbenchmarkINTERRUPT_DISABLE(); return state; diff --git a/tools/unit-test-app/configs/no_optimization_c3 b/tools/unit-test-app/configs/no_optimization_c3 new file mode 100644 index 0000000000..00719f8712 --- /dev/null +++ b/tools/unit-test-app/configs/no_optimization_c3 @@ -0,0 +1,3 @@ +CONFIG_IDF_TARGET="esp32c3" +TEST_COMPONENTS=esp_ipc spi_flash +CONFIG_COMPILER_OPTIMIZATION_NONE=y diff --git a/tools/unit-test-app/configs/no_optimization_esp32 b/tools/unit-test-app/configs/no_optimization_esp32 new file mode 100644 index 0000000000..64114b1215 --- /dev/null +++ b/tools/unit-test-app/configs/no_optimization_esp32 @@ -0,0 +1,3 @@ +CONFIG_IDF_TARGET="esp32" +TEST_COMPONENTS=esp_ipc spi_flash +CONFIG_COMPILER_OPTIMIZATION_NONE=y From 491b95925edb721161000398c3a80c5f2b551fbe Mon Sep 17 00:00:00 2001 From: Marius Vikhammer Date: Mon, 7 Feb 2022 11:33:33 +0800 Subject: [PATCH 2/2] spi flash: fix cache accessed while disabled issues at -O0 mask_get_id and gpio_hal_iomux_func_sel were called while cache is disabled, but were not inlined as expected at -0O. Force these functions to always be inlined. --- components/driver/spi_bus_lock.c | 2 +- components/hal/esp32/include/hal/gpio_ll.h | 2 +- components/hal/esp32c3/include/hal/gpio_ll.h | 2 +- components/hal/esp32s2/include/hal/gpio_ll.h | 2 +- components/hal/esp32s3/include/hal/gpio_ll.h | 2 +- tools/ci/config/target-test.yml | 6 ++++++ tools/unit-test-app/configs/no_optimization_c3 | 3 --- tools/unit-test-app/configs/no_optimization_esp32 | 3 --- 8 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 tools/unit-test-app/configs/no_optimization_c3 delete mode 100644 tools/unit-test-app/configs/no_optimization_esp32 diff --git a/components/driver/spi_bus_lock.c b/components/driver/spi_bus_lock.c index 8308aa9b51..299e080184 100644 --- a/components/driver/spi_bus_lock.c +++ b/components/driver/spi_bus_lock.c @@ -172,7 +172,7 @@ typedef struct spi_bus_lock_t spi_bus_lock_t; #define REQUEST_BIT(mask) ((mask) << REQ_SHIFT) #define PENDING_BIT(mask) ((mask) << PENDING_SHIFT) #define DEV_MASK(id) (LOCK_BIT(1<