Jelajahi Sumber

esp32s2: Add USE_FIXED_STATIC_RAM_SIZE feature

This feature exists on ESP32 and missed for ESP32S2. This commit adds it for esp32s2 as well.

Closes: IDF-1800
KonstantinKondrashov 5 tahun lalu
induk
melakukan
96b3ab708a

+ 19 - 0
components/esp32s2/Kconfig

@@ -505,6 +505,25 @@ menu "ESP32S2-specific"
             This option allows to place .rtc_data and .rtc_rodata sections into
             This option allows to place .rtc_data and .rtc_rodata sections into
             RTC fast memory segment to free the slow memory region for ULP programs.
             RTC fast memory segment to free the slow memory region for ULP programs.
 
 
+    config ESP32S2_USE_FIXED_STATIC_RAM_SIZE
+        bool "Use fixed static RAM size"
+        default n
+        help
+            If this option is disabled, the DRAM part of the heap starts right after the .bss section,
+            within the dram0_0 region. As a result, adding or removing some static variables
+            will change the available heap size.
+
+            If this option is enabled, the DRAM part of the heap starts right after the dram0_0 region,
+            where its length is set with ESP32S2_FIXED_STATIC_RAM_SIZE
+
+    config ESP32S2_FIXED_STATIC_RAM_SIZE
+        hex "Fixed Static RAM size"
+        default 0x10000
+        range 0 0x34000
+        depends on ESP32S2_USE_FIXED_STATIC_RAM_SIZE
+        help
+            RAM size dedicated for static variables (.data & .bss sections).
+
     config ESP32S2_ALLOW_RTC_FAST_MEM_AS_HEAP
     config ESP32S2_ALLOW_RTC_FAST_MEM_AS_HEAP
         bool "Enable RTC fast memory for dynamic allocations"
         bool "Enable RTC fast memory for dynamic allocations"
         depends on !ESP32S2_MEMPROT_FEATURE
         depends on !ESP32S2_MEMPROT_FEATURE

+ 17 - 1
components/esp32s2/ld/esp32s2.ld

@@ -44,6 +44,17 @@
 
 
 #define I_D_RAM_SIZE   DATA_RAM_END - DRAM_ORG
 #define I_D_RAM_SIZE   DATA_RAM_END - DRAM_ORG
 
 
+#if defined(CONFIG_ESP32S2_USE_FIXED_STATIC_RAM_SIZE)
+
+ASSERT((CONFIG_ESP32S2_FIXED_STATIC_RAM_SIZE <= I_D_RAM_SIZE),
+          "Fixed static ram data does not fit.")
+
+#define STATIC_RAM_SIZE CONFIG_ESP32S2_FIXED_STATIC_RAM_SIZE
+
+#else
+#define STATIC_RAM_SIZE 0
+#endif
+
 MEMORY
 MEMORY
 {
 {
   /* All these values assume the flash cache is on, and have the blocks this uses subtracted from the length
   /* All these values assume the flash cache is on, and have the blocks this uses subtracted from the length
@@ -69,7 +80,7 @@ MEMORY
 
 
 
 
   /* Shared data RAM, excluding memory reserved for bootloader and ROM bss/data/stack. */
   /* Shared data RAM, excluding memory reserved for bootloader and ROM bss/data/stack. */
-  dram0_0_seg (RW) :                 org = DRAM_ORG, len = I_D_RAM_SIZE
+  dram0_0_seg (RW) :                 org = DRAM_ORG, len = I_D_RAM_SIZE - STATIC_RAM_SIZE
 
 
 #ifdef CONFIG_APP_BUILD_USE_FLASH_SECTIONS
 #ifdef CONFIG_APP_BUILD_USE_FLASH_SECTIONS
   /* Flash mapped constant data */
   /* Flash mapped constant data */
@@ -93,7 +104,12 @@ MEMORY
   rtc_data_seg(RW) :                 org = 0x3ff9e000, len = 0x2000 - ESP_BOOTLOADER_RESERVE_RTC
   rtc_data_seg(RW) :                 org = 0x3ff9e000, len = 0x2000 - ESP_BOOTLOADER_RESERVE_RTC
 }
 }
 
 
+#if defined(CONFIG_ESP32S2_USE_FIXED_STATIC_RAM_SIZE)
+/* static data ends at defined address */
+_static_data_end = DRAM_ORG + STATIC_RAM_SIZE;
+#else
 _static_data_end = _bss_end;
 _static_data_end = _bss_end;
+#endif
 
 
 _heap_end = 0x40000000;
 _heap_end = 0x40000000;
 
 

+ 0 - 2
components/esp32s2/ld/esp32s2.project.ld.in

@@ -265,8 +265,6 @@ SECTIONS
 
 
     . = ALIGN (8);
     . = ALIGN (8);
     _bss_end = ABSOLUTE(.);
     _bss_end = ABSOLUTE(.);
-    /* The heap starts right after end of this section */
-    _heap_start = ABSOLUTE(.);
   } > dram0_0_seg
   } > dram0_0_seg
 
 
   /* When modifying the alignment, update tls_section_alignment in pxPortInitialiseStack */
   /* When modifying the alignment, update tls_section_alignment in pxPortInitialiseStack */