diff options
Diffstat (limited to 'stm/main.c')
-rw-r--r-- | stm/main.c | 110 |
1 files changed, 8 insertions, 102 deletions
diff --git a/stm/main.c b/stm/main.c index 92c3772d5f..389fea2634 100644 --- a/stm/main.c +++ b/stm/main.c @@ -43,10 +43,12 @@ #include "usrsw.h" #include "adc.h" #include "rtc.h" +#include "file.h" int errno; extern uint32_t _heap_start; +extern uint32_t _heap_end; static FATFS fatfs0; @@ -454,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 - -void gc_helper_get_regs_and_clean_stack(machine_uint_t *regs, machine_uint_t heap_end); +mp_obj_t pyb_gc(void) { + uint32_t start,ticks; -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 @@ -479,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; } @@ -544,90 +534,6 @@ mp_obj_t pyb_hid_send_report(mp_obj_t arg) { return mp_const_none; } -typedef struct _pyb_file_obj_t { - mp_obj_base_t base; - FIL fp; -} pyb_file_obj_t; - -void file_obj_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { - printf("<file %p>", self_in); -} - -mp_obj_t file_obj_read(mp_obj_t self_in, mp_obj_t arg) { - pyb_file_obj_t *self = self_in; - int n = mp_obj_get_int(arg); - byte *buf = m_new(byte, n); - UINT n_out; - f_read(&self->fp, buf, n, &n_out); - return mp_obj_new_str(buf, n_out, false); -} - -mp_obj_t file_obj_write(mp_obj_t self_in, mp_obj_t arg) { - pyb_file_obj_t *self = self_in; - uint l; - const byte *s = mp_obj_str_get_data(arg, &l); - UINT n_out; - FRESULT res = f_write(&self->fp, s, l, &n_out); - if (res != FR_OK) { - printf("File error: could not write to file; error code %d\n", res); - } else if (n_out != l) { - printf("File error: could not write all data to file; wrote %d / %d bytes\n", n_out, l); - } - return mp_const_none; -} - -mp_obj_t file_obj_close(mp_obj_t self_in) { - pyb_file_obj_t *self = self_in; - f_close(&self->fp); - return mp_const_none; -} - -static MP_DEFINE_CONST_FUN_OBJ_2(file_obj_read_obj, file_obj_read); -static MP_DEFINE_CONST_FUN_OBJ_2(file_obj_write_obj, file_obj_write); -static MP_DEFINE_CONST_FUN_OBJ_1(file_obj_close_obj, file_obj_close); - -// TODO gc hook to close the file if not already closed - -static const mp_method_t file_methods[] = { - { "read", &file_obj_read_obj }, - { "write", &file_obj_write_obj }, - { "close", &file_obj_close_obj }, - {NULL, NULL}, -}; - -static const mp_obj_type_t file_obj_type = { - { &mp_const_type }, - "File", - .print = file_obj_print, - .methods = file_methods, -}; - -mp_obj_t pyb_io_open(mp_obj_t o_filename, mp_obj_t o_mode) { - const char *filename = mp_obj_str_get_str(o_filename); - const char *mode = mp_obj_str_get_str(o_mode); - pyb_file_obj_t *self = m_new_obj(pyb_file_obj_t); - self->base.type = &file_obj_type; - if (mode[0] == 'r') { - // open for reading - FRESULT res = f_open(&self->fp, filename, FA_READ); - if (res != FR_OK) { - printf("FileNotFoundError: [Errno 2] No such file or directory: '%s'\n", filename); - return mp_const_none; - } - } else if (mode[0] == 'w') { - // open for writing, truncate the file first - FRESULT res = f_open(&self->fp, filename, FA_WRITE | FA_CREATE_ALWAYS); - if (res != FR_OK) { - printf("?FileError: could not create file: '%s'\n", filename); - return mp_const_none; - } - } else { - printf("ValueError: invalid mode: '%s'\n", mode); - return mp_const_none; - } - return self; -} - mp_obj_t pyb_rng_get(void) { return mp_obj_new_int(RNG_GetRandomNumber() >> 16); } @@ -692,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(); |