summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAyke van Laethem <aykevanlaethem@gmail.com>2018-02-23 18:59:31 +0100
committerDamien George <damien.p.george@gmail.com>2018-12-04 17:17:25 +1100
commit31cf528c754c5cf42410ff7c5471f0235493c0f2 (patch)
tree2b699575b692379820a7630e6a6b7ad2faefe65f
parent62b4bebf6437df1a1a82747421c1ab94f46c15c2 (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.
-rw-r--r--py/mpconfig.h9
-rw-r--r--py/mpstate.h2
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