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));
|
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_lib));
|
||||||
readline_init0();
|
readline_init0();
|
||||||
|
|
||||||
|
MP_STATE_PORT(native_code_pointers) = MP_OBJ_NULL;
|
||||||
|
|
||||||
// initialise peripherals
|
// initialise peripherals
|
||||||
machine_pins_init();
|
machine_pins_init();
|
||||||
#if MICROPY_PY_MACHINE_I2S
|
#if MICROPY_PY_MACHINE_I2S
|
||||||
@ -194,6 +196,16 @@ soft_reset_exit:
|
|||||||
mp_thread_deinit();
|
mp_thread_deinit();
|
||||||
#endif
|
#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();
|
gc_sweep_all();
|
||||||
|
|
||||||
mp_hal_stdout_tx_str("MPY: soft reboot\r\n");
|
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) {
|
if (p == NULL) {
|
||||||
m_malloc_fail(len);
|
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) {
|
if (reloc) {
|
||||||
mp_native_relocate(reloc, buf, (uintptr_t)p);
|
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]; \
|
mp_obj_t machine_pin_irq_handler[40]; \
|
||||||
struct _machine_timer_obj_t *machine_timer_obj_head; \
|
struct _machine_timer_obj_t *machine_timer_obj_head; \
|
||||||
struct _machine_i2s_obj_t *machine_i2s_obj[I2S_NUM_MAX]; \
|
struct _machine_i2s_obj_t *machine_i2s_obj[I2S_NUM_MAX]; \
|
||||||
|
mp_obj_t native_code_pointers; \
|
||||||
MICROPY_PORT_ROOT_POINTER_BLUETOOTH_NIMBLE
|
MICROPY_PORT_ROOT_POINTER_BLUETOOTH_NIMBLE
|
||||||
|
|
||||||
// type definitions for the specific machine
|
// type definitions for the specific machine
|
||||||
|
Loading…
Reference in New Issue
Block a user