diff options
author | Ayke van Laethem <aykevanlaethem@gmail.com> | 2018-02-23 18:59:31 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2018-12-04 17:17:25 +1100 |
commit | 31cf528c754c5cf42410ff7c5471f0235493c0f2 (patch) | |
tree | 2b699575b692379820a7630e6a6b7ad2faefe65f /py | |
parent | 62b4bebf6437df1a1a82747421c1ab94f46c15c2 (diff) |
py: Add option to reduce GC stack integer size to save RAM.
A new option MICROPY_GC_STACK_ENTRY_TYPE is added to select a custom type
instead of size_t for the gc_stack array items. This can be beneficial for
small devices, especially those that are low on memory anyway. If a device
has 1MB or less of heap (and 16-byte GC blocks) then this type can be
uint16_t, saving 128 bytes of RAM.
Diffstat (limited to 'py')
-rw-r--r-- | py/mpconfig.h | 9 | ||||
-rw-r--r-- | py/mpstate.h | 2 |
2 files changed, 10 insertions, 1 deletions
diff --git a/py/mpconfig.h b/py/mpconfig.h index 10a373ce8..e028ab989 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -106,6 +106,15 @@ #define MICROPY_ALLOC_GC_STACK_SIZE (64) #endif +// The C-type to use for entries in the GC stack. By default it allows the +// heap to be as large as the address space, but the bit-width of this type can +// be reduced to save memory when the heap is small enough. The type must be +// big enough to index all blocks in the heap, which is set by +// heap-size-in-bytes / MICROPY_BYTES_PER_GC_BLOCK. +#ifndef MICROPY_GC_STACK_ENTRY_TYPE +#define MICROPY_GC_STACK_ENTRY_TYPE size_t +#endif + // Be conservative and always clear to zero newly (re)allocated memory in the GC. // This helps eliminate stray pointers that hold on to memory that's no longer // used. It decreases performance due to unnecessary memory clearing. diff --git a/py/mpstate.h b/py/mpstate.h index 8c3b710cb..98371ca64 100644 --- a/py/mpstate.h +++ b/py/mpstate.h @@ -77,7 +77,7 @@ typedef struct _mp_state_mem_t { byte *gc_pool_end; int gc_stack_overflow; - size_t gc_stack[MICROPY_ALLOC_GC_STACK_SIZE]; + MICROPY_GC_STACK_ENTRY_TYPE gc_stack[MICROPY_ALLOC_GC_STACK_SIZE]; uint16_t gc_lock_depth; // This variable controls auto garbage collection. If set to 0 then the |