diff --git a/py/gc.c b/py/gc.c index 70b071ebc8..73e2436655 100644 --- a/py/gc.c +++ b/py/gc.c @@ -187,6 +187,22 @@ void gc_collect_end(void) { gc_sweep(); } +extern void gc_helper_get_regs_and_clean_stack(machine_uint_t *regs, machine_uint_t heap_end); + +void gc_collect(void) { + extern char _ram_start; /* defined by linker script */ + extern char _ram_end; /* defined by linker script */ + extern char _heap_start; /* defined by linker script */ + extern char _heap_end; /* defined by linker script */ + + gc_collect_start(); + gc_collect_root((void**)&_ram_start, (&_heap_start - &_ram_start) / 4); + machine_uint_t regs[10]; + gc_helper_get_regs_and_clean_stack(regs, (uint32_t) &_heap_end); + gc_collect_root((void**)&_heap_end, (&_ram_end - &_heap_end) / 4); // will trace regs since they now live in this function on the stack + gc_collect_end(); +} + void gc_info(gc_info_t *info) { info->total = (gc_pool_end - gc_pool_start) * sizeof(machine_uint_t); info->used = 0; diff --git a/stm/main.c b/stm/main.c index 2ce2b6dc61..389fea2634 100644 --- a/stm/main.c +++ b/stm/main.c @@ -48,6 +48,7 @@ int errno; extern uint32_t _heap_start; +extern uint32_t _heap_end; static FATFS fatfs0; @@ -455,21 +456,12 @@ bool do_file(const char *filename) { } } -#define RAM_START (0x20000000) // fixed for chip -#define HEAP_END (0x2001c000) // tunable -#define RAM_END (0x20020000) // fixed for chip +mp_obj_t pyb_gc(void) { + uint32_t start,ticks; -void gc_helper_get_regs_and_clean_stack(machine_uint_t *regs, machine_uint_t heap_end); - -void gc_collect(void) { - uint32_t start = sys_tick_counter; - gc_collect_start(); - gc_collect_root((void**)RAM_START, (((uint32_t)&_heap_start) - RAM_START) / 4); - machine_uint_t regs[10]; - gc_helper_get_regs_and_clean_stack(regs, HEAP_END); - gc_collect_root((void**)HEAP_END, (RAM_END - HEAP_END) / 4); // will trace regs since they now live in this function on the stack - gc_collect_end(); - uint32_t ticks = sys_tick_counter - start; // TODO implement a function that does this properly + start = sys_tick_counter; + gc_collect(); + ticks = sys_tick_counter - start; // TODO implement a function that does this properly if (0) { // print GC info @@ -480,10 +472,7 @@ void gc_collect(void) { printf(" %lu : %lu\n", info.used, info.free); printf(" 1=%lu 2=%lu m=%lu\n", info.num_1block, info.num_2block, info.max_block); } -} -mp_obj_t pyb_gc(void) { - gc_collect(); return mp_const_none; } @@ -609,7 +598,7 @@ int main(void) { soft_reset: // GC init - gc_init(&_heap_start, (void*)HEAP_END); + gc_init(&_heap_start, &_heap_end); // Micro Python init qstr_init(); diff --git a/stm/stm32f405.ld b/stm/stm32f405.ld index c19e6a1c19..231dbcbe70 100644 --- a/stm/stm32f405.ld +++ b/stm/stm32f405.ld @@ -19,6 +19,10 @@ _minimum_heap_size = 16K; /* top end of the stack */ _estack = ORIGIN(RAM) + LENGTH(RAM); +_ram_start = 0x20000000; +_ram_end = 0x20020000; +_heap_end = 0x2001c000; + /* define output sections */ SECTIONS {