Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
29 changed files
with
2,793 additions
and
125 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
#include <stdio.h> | ||
|
||
#include <stm32f4xx_hal.h> | ||
|
||
#include "misc.h" | ||
#include "mpconfig.h" | ||
#include "qstr.h" | ||
#include "obj.h" | ||
#include "gc.h" | ||
#include "gccollect.h" | ||
|
||
machine_uint_t gc_helper_get_regs_and_sp(machine_uint_t *regs); | ||
|
||
// obsolete | ||
// void gc_helper_get_regs_and_clean_stack(machine_uint_t *regs, machine_uint_t heap_end); | ||
|
||
void gc_collect(void) { | ||
// get current time, in case we want to time the GC | ||
uint32_t start = HAL_GetTick(); | ||
|
||
// start the GC | ||
gc_collect_start(); | ||
|
||
// scan everything in RAM before the heap | ||
// this includes the data and bss segments | ||
// TODO possibly don't need to scan data, since all pointers should start out NULL and be in bss | ||
gc_collect_root((void**)&_ram_start, ((uint32_t)&_ebss - (uint32_t)&_ram_start) / sizeof(uint32_t)); | ||
|
||
// get the registers and the sp | ||
machine_uint_t regs[10]; | ||
machine_uint_t sp = gc_helper_get_regs_and_sp(regs); | ||
|
||
// trace the stack, including the registers (since they live on the stack in this function) | ||
gc_collect_root((void**)sp, ((uint32_t)&_ram_end - sp) / sizeof(uint32_t)); | ||
|
||
// end the GC | ||
gc_collect_end(); | ||
|
||
if (0) { | ||
// print GC info | ||
uint32_t ticks = HAL_GetTick() - start; // TODO implement a function that does this properly | ||
gc_info_t info; | ||
gc_info(&info); | ||
printf("GC@%lu %lums\n", start, ticks); | ||
printf(" %lu total\n", info.total); | ||
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); | ||
} | ||
} | ||
|
||
static mp_obj_t pyb_gc(void) { | ||
gc_collect(); | ||
return mp_const_none; | ||
} | ||
|
||
MP_DEFINE_CONST_FUN_OBJ_0(pyb_gc_obj, pyb_gc); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
// variables defining memory layout | ||
// (these probably belong somewhere else...) | ||
extern uint32_t _etext; | ||
extern uint32_t _sidata; | ||
extern uint32_t _ram_start; | ||
extern uint32_t _sdata; | ||
extern uint32_t _edata; | ||
extern uint32_t _sbss; | ||
extern uint32_t _ebss; | ||
extern uint32_t _heap_start; | ||
extern uint32_t _heap_end; | ||
extern uint32_t _estack; | ||
extern uint32_t _ram_end; | ||
|
||
void gc_collect(void); | ||
|
||
MP_DECLARE_CONST_FUN_OBJ(pyb_gc_obj); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
.syntax unified | ||
.cpu cortex-m4 | ||
.thumb | ||
.text | ||
.align 2 | ||
|
||
@ uint gc_helper_get_regs_and_sp(r0=uint regs[10]) | ||
.global gc_helper_get_regs_and_sp | ||
.thumb | ||
.thumb_func | ||
.type gc_helper_get_regs_and_sp, %function | ||
gc_helper_get_regs_and_sp: | ||
@ store registers into given array | ||
str r4, [r0], #4 | ||
str r5, [r0], #4 | ||
str r6, [r0], #4 | ||
str r7, [r0], #4 | ||
str r8, [r0], #4 | ||
str r9, [r0], #4 | ||
str r10, [r0], #4 | ||
str r11, [r0], #4 | ||
str r12, [r0], #4 | ||
str r13, [r0], #4 | ||
|
||
@ return the sp | ||
mov r0, sp | ||
bx lr | ||
|
||
|
||
@ this next function is now obsolete | ||
|
||
.size gc_helper_get_regs_and_clean_stack, .-gc_helper_get_regs_and_clean_stack | ||
@ void gc_helper_get_regs_and_clean_stack(r0=uint regs[10], r1=heap_end) | ||
.global gc_helper_get_regs_and_clean_stack | ||
.thumb | ||
.thumb_func | ||
.type gc_helper_get_regs_and_clean_stack, %function | ||
gc_helper_get_regs_and_clean_stack: | ||
@ store registers into given array | ||
str r4, [r0], #4 | ||
str r5, [r0], #4 | ||
str r6, [r0], #4 | ||
str r7, [r0], #4 | ||
str r8, [r0], #4 | ||
str r9, [r0], #4 | ||
str r10, [r0], #4 | ||
str r11, [r0], #4 | ||
str r12, [r0], #4 | ||
str r13, [r0], #4 | ||
|
||
@ clean the stack from given pointer up to current sp | ||
movs r0, #0 | ||
mov r2, sp | ||
b.n .entry | ||
.loop: | ||
str r0, [r1], #4 | ||
.entry: | ||
cmp r1, r2 | ||
bcc.n .loop | ||
bx lr | ||
|
||
.size gc_helper_get_regs_and_clean_stack, .-gc_helper_get_regs_and_clean_stack |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#include <stdint.h> | ||
|
||
#include "misc.h" | ||
#include "mpconfig.h" | ||
#include "qstr.h" | ||
#include "lexer.h" | ||
#if 0 | ||
#include "ff.h" | ||
#endif | ||
|
||
mp_import_stat_t mp_import_stat(const char *path) { | ||
#if 0 | ||
FILINFO fno; | ||
FRESULT res = f_stat(path, &fno); | ||
if (res == FR_OK) { | ||
if ((fno.fattrib & AM_DIR) != 0) { | ||
return MP_IMPORT_STAT_DIR; | ||
} else { | ||
return MP_IMPORT_STAT_FILE; | ||
} | ||
} | ||
#endif | ||
return MP_IMPORT_STAT_NO_EXIST; | ||
} |
Oops, something went wrong.