From 7eb13f2744027c2ea4ee58d7840c3020d78724fb Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 12 Oct 2018 18:44:11 +1100 Subject: [PATCH] microbit: Allocate all DAL objects on the DAL heap, to save BSS. Then the MicroPython heap can be increased by 128 bytes. --- inc/microbit/microbitdal.h | 4 ++-- source/microbit/main.cpp | 16 +++++++++------- source/microbit/microbitcompass.cpp | 4 ++-- source/microbit/microbiti2c.cpp | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/inc/microbit/microbitdal.h b/inc/microbit/microbitdal.h index ee18b82e3..8ec496def 100644 --- a/inc/microbit/microbitdal.h +++ b/inc/microbit/microbitdal.h @@ -44,9 +44,9 @@ class MicroPythonI2C : public MicroBitI2C { } }; -extern MicroPythonI2C ubit_i2c; +extern MicroPythonI2C *ubit_i2c; extern MicroBitAccelerometer *ubit_accelerometer; -extern MicroBitDisplay ubit_display; +extern MicroBitDisplay *ubit_display; extern MicroBitCompass *ubit_compass; extern MicroBitCompassCalibrator *ubit_compass_calibrator; diff --git a/source/microbit/main.cpp b/source/microbit/main.cpp index 83748c738..b7f48685c 100644 --- a/source/microbit/main.cpp +++ b/source/microbit/main.cpp @@ -9,8 +9,8 @@ // Global instances of the mbed/DAL components that we use gpio_t reset_button_gpio; gpio_irq_t reset_button_gpio_irq; -MicroBitDisplay ubit_display; -MicroPythonI2C ubit_i2c(I2C_SDA0, I2C_SCL0); +MicroBitDisplay *ubit_display; +MicroPythonI2C *ubit_i2c; // Global pointers to instances of DAL components that are created dynamically MicroBitAccelerometer *ubit_accelerometer; @@ -147,13 +147,15 @@ int main(void) { gpio_irq_set(&reset_button_gpio_irq, IRQ_FALL, 1); // Create dynamically-allocated DAL components - ubit_accelerometer = &MicroBitAccelerometer::autoDetect(ubit_i2c); - ubit_compass = &MicroBitCompass::autoDetect(ubit_i2c); - ubit_compass_calibrator = new MicroBitCompassCalibrator(*ubit_compass, *ubit_accelerometer, ubit_display); + ubit_display = new MicroBitDisplay(); + ubit_i2c = new MicroPythonI2C(I2C_SDA0, I2C_SCL0); + ubit_accelerometer = &MicroBitAccelerometer::autoDetect(*ubit_i2c); + ubit_compass = &MicroBitCompass::autoDetect(*ubit_i2c); + ubit_compass_calibrator = new MicroBitCompassCalibrator(*ubit_compass, *ubit_accelerometer, *ubit_display); for (;;) { extern uint32_t __StackTop; - static uint32_t mp_heap[10240 / sizeof(uint32_t)]; + static uint32_t mp_heap[10368 / sizeof(uint32_t)]; // Initialise memory regions: stack and MicroPython heap mp_stack_set_top(&__StackTop); @@ -167,7 +169,7 @@ int main(void) { // Initialise the micro:bit peripherals microbit_seed_random(); - ubit_display.disable(); + ubit_display->disable(); microbit_display_init(); microbit_filesystem_init(); microbit_pin_init(); diff --git a/source/microbit/microbitcompass.cpp b/source/microbit/microbitcompass.cpp index 3011e484d..96ada4fc8 100644 --- a/source/microbit/microbitcompass.cpp +++ b/source/microbit/microbitcompass.cpp @@ -64,9 +64,9 @@ mp_obj_t microbit_compass_calibrate(mp_obj_t self_in) { (void)self_in; ticker_stop(); //uBit.systemTicker.attach_us(&uBit, &MicroBit::systemTick, MICROBIT_DEFAULT_TICK_PERIOD * 1000); TODO what to replace with? - ubit_display.enable(); + ubit_display->enable(); ubit_compass->calibrate(); - ubit_display.disable(); + ubit_display->disable(); //uBit.systemTicker.detach(); TODO what to replace with? ticker_start(); microbit_display_init(); diff --git a/source/microbit/microbiti2c.cpp b/source/microbit/microbiti2c.cpp index 01379487d..f94f8d56e 100644 --- a/source/microbit/microbiti2c.cpp +++ b/source/microbit/microbiti2c.cpp @@ -176,7 +176,7 @@ const mp_obj_type_t microbit_i2c_type = { const microbit_i2c_obj_t microbit_i2c_obj = { {µbit_i2c_type}, - .i2c = &ubit_i2c, + .i2c = ubit_i2c, }; }