diff options
author | Damien George <damien@micropython.org> | 2024-02-15 23:03:29 +1100 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2024-02-16 10:19:26 +1100 |
commit | cd66aa05cf2d11401876a342fad2425e766bd921 (patch) | |
tree | 6c719a98bef539645c812a5b0f303942a230a96e | |
parent | 809d113dbc37a032e87accc95c140f189733e0c4 (diff) |
esp32: Increase NimBLE task stack size and overflow detection headroom.
The Python BLE IRQ handler will most likely run on the NimBLE task, so its
C stack must be large enough to accommodate reasonably complicated Python
code (eg a few call depths). So increase this stack size.
Also increase the headroom from 1024 to 2048 bytes. This is needed because
(1) the esp32 architecture uses a fair amount of stack in general; and (2)
by the time execution gets to setting the Python stack top via
`mp_stack_set_top()` in this interlock code, about 600 bytes of stack are
already used, which reduces the amount available for Python.
Fixes issue #12349.
Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r-- | extmod/modbluetooth.c | 2 | ||||
-rw-r--r-- | ports/esp32/boards/sdkconfig.ble | 4 | ||||
-rw-r--r-- | ports/esp32/mpconfigport.h | 2 |
3 files changed, 6 insertions, 2 deletions
diff --git a/extmod/modbluetooth.c b/extmod/modbluetooth.c index cef5151cc..32a15bf51 100644 --- a/extmod/modbluetooth.c +++ b/extmod/modbluetooth.c @@ -1274,7 +1274,7 @@ STATIC mp_obj_t invoke_irq_handler(uint16_t event, if (ts_orig == NULL) { mp_thread_set_state(&ts); mp_stack_set_top(&ts + 1); // need to include ts in root-pointer scan - mp_stack_set_limit(MICROPY_PY_BLUETOOTH_SYNC_EVENT_STACK_SIZE - 1024); + mp_stack_set_limit(MICROPY_PY_BLUETOOTH_SYNC_EVENT_STACK_SIZE); ts.gc_lock_depth = 0; ts.nlr_jump_callback_top = NULL; ts.mp_pending_exception = MP_OBJ_NULL; diff --git a/ports/esp32/boards/sdkconfig.ble b/ports/esp32/boards/sdkconfig.ble index 7fa08fe28..af2d4b133 100644 --- a/ports/esp32/boards/sdkconfig.ble +++ b/ports/esp32/boards/sdkconfig.ble @@ -14,3 +14,7 @@ CONFIG_BT_NIMBLE_MAX_CONNECTIONS=4 CONFIG_BT_NIMBLE_PINNED_TO_CORE_0=n CONFIG_BT_NIMBLE_PINNED_TO_CORE_1=y CONFIG_BT_NIMBLE_PINNED_TO_CORE=1 + +# Increase NimBLE task stack size from the default, because Python code +# (BLE IRQ handlers) will most likely run on this task. +CONFIG_BT_NIMBLE_TASK_STACK_SIZE=6144 diff --git a/ports/esp32/mpconfigport.h b/ports/esp32/mpconfigport.h index 5dc4a9c75..acf065384 100644 --- a/ports/esp32/mpconfigport.h +++ b/ports/esp32/mpconfigport.h @@ -95,7 +95,7 @@ #define MICROPY_PY_BLUETOOTH (1) #define MICROPY_PY_BLUETOOTH_USE_SYNC_EVENTS (1) #define MICROPY_PY_BLUETOOTH_USE_SYNC_EVENTS_WITH_INTERLOCK (1) -#define MICROPY_PY_BLUETOOTH_SYNC_EVENT_STACK_SIZE (CONFIG_BT_NIMBLE_TASK_STACK_SIZE) +#define MICROPY_PY_BLUETOOTH_SYNC_EVENT_STACK_SIZE (CONFIG_BT_NIMBLE_TASK_STACK_SIZE - 2048) #define MICROPY_PY_BLUETOOTH_ENABLE_CENTRAL_MODE (1) #define MICROPY_PY_BLUETOOTH_ENABLE_PAIRING_BONDING (1) #define MICROPY_BLUETOOTH_NIMBLE (1) |