esp32: Track allocated iRAM and free it on soft reset.
This makes sure all iRAM allocated for native code is freed on soft reset. Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
parent
54ab9d23e9
commit
c70f96f1c5
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user