diff --git a/ports/esp32/main.c b/ports/esp32/main.c index f833c9501..14b7e14c6 100644 --- a/ports/esp32/main.c +++ b/ports/esp32/main.c @@ -152,6 +152,8 @@ soft_reset: mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_lib)); readline_init0(); + MP_STATE_PORT(native_code_pointers) = MP_OBJ_NULL; + // initialise peripherals machine_pins_init(); #if MICROPY_PY_MACHINE_I2S @@ -194,6 +196,16 @@ soft_reset_exit: mp_thread_deinit(); #endif + // Free any native code pointers that point to iRAM. + if (MP_STATE_PORT(native_code_pointers) != MP_OBJ_NULL) { + size_t len; + mp_obj_t *items; + mp_obj_list_get(MP_STATE_PORT(native_code_pointers), &len, &items); + for (size_t i = 0; i < len; ++i) { + heap_caps_free(MP_OBJ_TO_PTR(items[i])); + } + } + gc_sweep_all(); mp_hal_stdout_tx_str("MPY: soft reboot\r\n"); @@ -243,6 +255,10 @@ void *esp_native_code_commit(void *buf, size_t len, void *reloc) { if (p == NULL) { m_malloc_fail(len); } + if (MP_STATE_PORT(native_code_pointers) == MP_OBJ_NULL) { + MP_STATE_PORT(native_code_pointers) = mp_obj_new_list(0, NULL); + } + mp_obj_list_append(MP_STATE_PORT(native_code_pointers), MP_OBJ_TO_PTR(p)); if (reloc) { mp_native_relocate(reloc, buf, (uintptr_t)p); } diff --git a/ports/esp32/mpconfigport.h b/ports/esp32/mpconfigport.h index a3e4acf06..a64d6de99 100644 --- a/ports/esp32/mpconfigport.h +++ b/ports/esp32/mpconfigport.h @@ -152,6 +152,7 @@ struct mp_bluetooth_nimble_root_pointers_t; mp_obj_t machine_pin_irq_handler[40]; \ struct _machine_timer_obj_t *machine_timer_obj_head; \ struct _machine_i2s_obj_t *machine_i2s_obj[I2S_NUM_MAX]; \ + mp_obj_t native_code_pointers; \ MICROPY_PORT_ROOT_POINTER_BLUETOOTH_NIMBLE // type definitions for the specific machine