kopia lustrzana https://github.com/micropython/micropython
stm32/gccollect: Always use MP_STATE_THREAD(stack_top) to get stack top.
In a non-thread build, using &_ram_end as the top-of-stack is no longer correct because the stack is not always at the very top end of RAM. See egpull/4922/head04c7cdb668
and3786592097
. The correct value to use is &_estack, which is the value stored in MP_STATE_THREAD(stack_top), and using the same code for both thread and non-thread builds makes the code cleaner.
rodzic
a73859d5af
commit
fd49fcb229
|
@ -48,11 +48,7 @@ void gc_collect(void) {
|
||||||
uintptr_t sp = gc_helper_get_regs_and_sp(regs);
|
uintptr_t sp = gc_helper_get_regs_and_sp(regs);
|
||||||
|
|
||||||
// trace the stack, including the registers (since they live on the stack in this function)
|
// trace the stack, including the registers (since they live on the stack in this function)
|
||||||
#if MICROPY_PY_THREAD
|
|
||||||
gc_collect_root((void**)sp, ((uint32_t)MP_STATE_THREAD(stack_top) - sp) / sizeof(uint32_t));
|
gc_collect_root((void**)sp, ((uint32_t)MP_STATE_THREAD(stack_top) - sp) / sizeof(uint32_t));
|
||||||
#else
|
|
||||||
gc_collect_root((void**)sp, ((uint32_t)&_ram_end - sp) / sizeof(uint32_t));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// trace root pointers from any threads
|
// trace root pointers from any threads
|
||||||
#if MICROPY_PY_THREAD
|
#if MICROPY_PY_THREAD
|
||||||
|
|
Ładowanie…
Reference in New Issue