diff --git a/py/gc.c b/py/gc.c index 70b071ebc8a58..73e2436655785 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/Makefile b/stm/Makefile index ab691095830af..497fffa996e08 100644 --- a/stm/Makefile +++ b/stm/Makefile @@ -65,6 +65,7 @@ SRC_C = \ usrsw.c \ adc.c \ rtc.c \ + file.c \ # pybwlan.c \ SRC_S = \ diff --git a/stm/file.c b/stm/file.c new file mode 100644 index 0000000000000..35bfca16a5151 --- /dev/null +++ b/stm/file.c @@ -0,0 +1,94 @@ +#include +#include + +#include "misc.h" +#include "mpconfig.h" +#include "mpconfigport.h" +#include "qstr.h" +#include "obj.h" +#include "file.h" +#include "ff.h" + +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("", 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; +} diff --git a/stm/file.h b/stm/file.h new file mode 100644 index 0000000000000..3845635deba16 --- /dev/null +++ b/stm/file.h @@ -0,0 +1 @@ +mp_obj_t pyb_io_open(mp_obj_t o_filename, mp_obj_t o_mode); diff --git a/stm/main.c b/stm/main.c index 92c3772d5f3ce..389fea26340c7 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("", 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(); diff --git a/stm/stm32f405.ld b/stm/stm32f405.ld index c19e6a1c1947b..231dbcbe7099c 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 { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy