mirror of
https://github.com/micropython/micropython.git
synced 2025-07-29 00:41:09 +02:00
esp32: Fix thread stack limit margin, change to new cstack API.
This change moves that complexity out into the stack checker and fixes the bug where stack margin wasn't set correctly by ESP32-C3 threads. This work was funded through GitHub Sponsors. Signed-off-by: Angus Gratton <angus@redyak.com.au>
This commit is contained in:
committed by
Damien George
parent
86f2c285eb
commit
e3955f421d
@@ -41,7 +41,7 @@
|
||||
#include "esp_log.h"
|
||||
#include "esp_psram.h"
|
||||
|
||||
#include "py/stackctrl.h"
|
||||
#include "py/cstack.h"
|
||||
#include "py/nlr.h"
|
||||
#include "py/compile.h"
|
||||
#include "py/runtime.h"
|
||||
@@ -71,13 +71,6 @@
|
||||
// MicroPython runs as a task under FreeRTOS
|
||||
#define MP_TASK_PRIORITY (ESP_TASK_PRIO_MIN + 1)
|
||||
|
||||
// Set the margin for detecting stack overflow, depending on the CPU architecture.
|
||||
#if CONFIG_IDF_TARGET_ESP32C3
|
||||
#define MP_TASK_STACK_LIMIT_MARGIN (2048)
|
||||
#else
|
||||
#define MP_TASK_STACK_LIMIT_MARGIN (1024)
|
||||
#endif
|
||||
|
||||
typedef struct _native_code_node_t {
|
||||
struct _native_code_node_t *next;
|
||||
uint32_t data[];
|
||||
@@ -132,8 +125,7 @@ void mp_task(void *pvParameter) {
|
||||
|
||||
soft_reset:
|
||||
// initialise the stack pointer for the main thread
|
||||
mp_stack_set_top((void *)sp);
|
||||
mp_stack_set_limit(MICROPY_TASK_STACK_SIZE - MP_TASK_STACK_LIMIT_MARGIN);
|
||||
mp_cstack_init_with_top((void *)sp, MICROPY_TASK_STACK_SIZE);
|
||||
gc_init(mp_task_heap, mp_task_heap + MICROPY_GC_INITIAL_HEAP_SIZE);
|
||||
mp_init();
|
||||
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_lib));
|
||||
|
@@ -62,6 +62,11 @@
|
||||
// Python internal features
|
||||
#define MICROPY_READER_VFS (1)
|
||||
#define MICROPY_ENABLE_GC (1)
|
||||
#if CONFIG_IDF_TARGET_ARCH_RISCV // RISC-V SoCs use more stack than Xtensa
|
||||
#define MICROPY_STACK_CHECK_MARGIN (2048) // This may be unnecessarily conservative
|
||||
#else
|
||||
#define MICROPY_STACK_CHECK_MARGIN (1024)
|
||||
#endif
|
||||
#define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF (1)
|
||||
#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ)
|
||||
#define MICROPY_ERROR_REPORTING (MICROPY_ERROR_REPORTING_NORMAL)
|
||||
|
@@ -38,7 +38,7 @@
|
||||
#if MICROPY_PY_THREAD
|
||||
|
||||
#define MP_THREAD_MIN_STACK_SIZE (4 * 1024)
|
||||
#define MP_THREAD_DEFAULT_STACK_SIZE (MP_THREAD_MIN_STACK_SIZE + 1024)
|
||||
#define MP_THREAD_DEFAULT_STACK_SIZE (MP_THREAD_MIN_STACK_SIZE + MICROPY_STACK_CHECK_MARGIN)
|
||||
#define MP_THREAD_PRIORITY (ESP_TASK_PRIO_MIN + 1)
|
||||
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 0) && !CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP
|
||||
@@ -160,9 +160,6 @@ mp_uint_t mp_thread_create_ex(void *(*entry)(void *), void *arg, size_t *stack_s
|
||||
th->next = thread;
|
||||
thread = th;
|
||||
|
||||
// adjust the stack_size to provide room to recover from hitting the limit
|
||||
*stack_size -= 1024;
|
||||
|
||||
mp_thread_mutex_unlock(&thread_mutex);
|
||||
|
||||
return (mp_uint_t)th->id;
|
||||
|
Reference in New Issue
Block a user