Переглянути джерело

Merge branch 'bugfix/dport_init_min_stack_size' into 'master'

freertos: Increase minimum task stack size when stack smashing checker is enabled

Closes IDFGH-4586 and IDFCI-482

See merge request espressif/esp-idf!12369
Angus Gratton 4 роки тому
батько
коміт
f7d7954bf4

+ 3 - 0
components/esp32/dport_access.c

@@ -163,6 +163,9 @@ static void dport_access_init_core(void *arg)
     dport_access_end[core_id] = 0;
     dport_core_state[core_id] = DPORT_CORE_STATE_RUNNING;
 
+    /* If this fails then the minimum stack size for this config is too close to running out */
+    assert(uxTaskGetStackHighWaterMark(NULL) > 128);
+
     vTaskDelete(NULL);
 }
 #endif

+ 28 - 6
components/freertos/port/riscv/include/freertos/FreeRTOSConfig.h

@@ -143,16 +143,38 @@
 #define configMAX_PRIORITIES			( 25 )
 #endif
 
-#if defined(CONFIG_APPTRACE_ENABLE)
-/* apptrace module requires at least 2KB of stack per task */
-#define configMINIMAL_STACK_SIZE		2048
-#elif defined(CONFIG_COMPILER_OPTIMIZATION_NONE)
+/* Various things that impact minimum stack sizes */
+
+/* Higher stack checker modes cause overhead on each function call */
+#if CONFIG_STACK_CHECK_ALL || CONFIG_STACK_CHECK_STRONG
+#define configSTACK_OVERHEAD_CHECKER 256
+#else
+#define configSTACK_OVERHEAD_CHECKER 0
+#endif
+
 /* with optimizations disabled, scheduler uses additional stack */
-#define configMINIMAL_STACK_SIZE		1024
+#if CONFIG_COMPILER_OPTIMIZATION_NONE
+#define configSTACK_OVERHEAD_OPTIMIZATION 320
+#else
+#define configSTACK_OVERHEAD_OPTIMIZATION 0
+#endif
+
+/* apptrace mdule increases minimum stack usage */
+#if CONFIG_APPTRACE_ENABLE
+#define configSTACK_OVERHEAD_APPTRACE 1280
 #else
-#define configMINIMAL_STACK_SIZE		768
+#define configSTACK_OVERHEAD_APPTRACE 0
 #endif
 
+#define configSTACK_OVERHEAD_TOTAL (                                    \
+                                    configSTACK_OVERHEAD_CHECKER +      \
+                                    configSTACK_OVERHEAD_OPTIMIZATION + \
+                                    configSTACK_OVERHEAD_APPTRACE       \
+                                                                        )
+
+#define configMINIMAL_STACK_SIZE  (768 + configSTACK_OVERHEAD_TOTAL)
+
+
 #define configNUM_THREAD_LOCAL_STORAGE_POINTERS CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS
 #define configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS 1
 

+ 27 - 6
components/freertos/port/xtensa/include/freertos/FreeRTOSConfig.h

@@ -183,16 +183,37 @@ int xt_clock_freq(void) __attribute__((deprecated));
 #define configMAX_PRIORITIES			( 25 )
 #endif
 
-#if defined(CONFIG_APPTRACE_ENABLE)
-/* apptrace module requires at least 2KB of stack per task */
-#define configMINIMAL_STACK_SIZE		2048
-#elif defined(CONFIG_COMPILER_OPTIMIZATION_NONE)
+/* Various things that impact minimum stack sizes */
+
+/* Higher stack checker modes cause overhead on each function call */
+#if CONFIG_STACK_CHECK_ALL || CONFIG_STACK_CHECK_STRONG
+#define configSTACK_OVERHEAD_CHECKER 256
+#else
+#define configSTACK_OVERHEAD_CHECKER 0
+#endif
+
 /* with optimizations disabled, scheduler uses additional stack */
-#define configMINIMAL_STACK_SIZE		1024
+#if CONFIG_COMPILER_OPTIMIZATION_NONE
+#define configSTACK_OVERHEAD_OPTIMIZATION 320
 #else
-#define configMINIMAL_STACK_SIZE		768
+#define configSTACK_OVERHEAD_OPTIMIZATION 0
 #endif
 
+/* apptrace mdule increases minimum stack usage */
+#if CONFIG_APPTRACE_ENABLE
+#define configSTACK_OVERHEAD_APPTRACE 1280
+#else
+#define configSTACK_OVERHEAD_APPTRACE 0
+#endif
+
+#define configSTACK_OVERHEAD_TOTAL (                                    \
+                                    configSTACK_OVERHEAD_CHECKER +      \
+                                    configSTACK_OVERHEAD_OPTIMIZATION + \
+                                    configSTACK_OVERHEAD_APPTRACE       \
+                                                                        )
+
+#define configMINIMAL_STACK_SIZE  (768 + configSTACK_OVERHEAD_TOTAL)
+
 #ifndef configIDLE_TASK_STACK_SIZE
 #define configIDLE_TASK_STACK_SIZE CONFIG_FREERTOS_IDLE_TASK_STACKSIZE
 #endif