summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoy Hooper <rhooper@toybox.ca>2020-01-08 15:14:53 -0500
committerRoy Hooper <rhooper@toybox.ca>2020-01-08 15:14:53 -0500
commit34c9e00f08b77f5336db911e376f15512bf0790b (patch)
treec40e165ffff3172803261943296e52efd6af735a
parent28c1e4f48e5edf16b3aedc0d25e8d01d014def5f (diff)
try (re)using the buffer in neopixel_write
-rw-r--r--ports/nrf/common-hal/neopixel_write/__init__.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/ports/nrf/common-hal/neopixel_write/__init__.c b/ports/nrf/common-hal/neopixel_write/__init__.c
index 3052e908d..d097f96e3 100644
--- a/ports/nrf/common-hal/neopixel_write/__init__.c
+++ b/ports/nrf/common-hal/neopixel_write/__init__.c
@@ -116,6 +116,8 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
uint32_t pattern_size = PATTERN_SIZE(numBytes);
uint16_t* pixels_pattern = NULL;
+ static uint16_t* pixels_pattern_heap = NULL;
+ static size_t pixels_pattern_heap_size = 0;
bool pattern_on_heap = false;
// Use the stack to store 1 pixels worth of PWM data for the status led. uint32_t to ensure alignment.
@@ -132,16 +134,29 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
} else {
uint8_t sd_en = 0;
(void) sd_softdevice_is_enabled(&sd_en);
- if (sd_en) {
- // If the soft device is enabled then we must use PWM to
- // transmit. This takes a bunch of memory to do so raise an
- // exception if we can't.
- pixels_pattern = (uint16_t *) m_malloc(pattern_size, false);
- } else {
- pixels_pattern = (uint16_t *) m_malloc_maybe(pattern_size, false);
- }
- pattern_on_heap = true;
+ if (!pattern_on_heap || pixels_pattern_heap_size < pattern_size) {
+ if (pattern_on_heap) {
+ m_free(pixels_pattern_heap);
+ pixels_pattern = NULL;
+ pixels_pattern_heap = NULL;
+ pixels_pattern_heap_size = 0;
+ }
+
+ if (sd_en) {
+ // If the soft device is enabled then we must use PWM to
+ // transmit. This takes a bunch of memory to do so raise an
+ // exception if we can't.
+ pixels_pattern_heap = (uint16_t *) m_malloc(pattern_size, false);
+ } else {
+ pixels_pattern_heap = (uint16_t *) m_malloc_maybe(pattern_size, false);
+ }
+ if (pixels_pattern_heap) {
+ pattern_on_heap = true;
+ pixels_pattern_heap_size = pattern_size;
+ }
+ }
+ pixels_pattern = pixels_pattern_heap;
}
}
@@ -223,10 +238,6 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
nrf_pwm_disable(pwm);
nrf_pwm_pins_set(pwm, (uint32_t[]) {0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL} );
- if (pattern_on_heap) {
- m_free(pixels_pattern);
- }
-
} // End of DMA implementation
// ---------------------------------------------------------------------
else {