Skip to content

Move file obj to separate module #218

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 24, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions py/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions stm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ SRC_C = \
usrsw.c \
adc.c \
rtc.c \
file.c \
# pybwlan.c \

SRC_S = \
Expand Down
94 changes: 94 additions & 0 deletions stm/file.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#include <stdio.h>
#include <stm32f4xx.h>

#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("<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;
}
1 change: 1 addition & 0 deletions stm/file.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
mp_obj_t pyb_io_open(mp_obj_t o_filename, mp_obj_t o_mode);
110 changes: 8 additions & 102 deletions stm/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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
Expand All @@ -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;
}

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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();
Expand Down
4 changes: 4 additions & 0 deletions stm/stm32f405.ld
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
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