Как уменьшить использование глобальных переменных? Attiny85

Я пытаюсь скомпилировать свой код, но я продолжаю превышать свою память глобальных переменных на 12%. Есть ли что-нибудь, что я могу сделать в своем коде, чтобы еще больше уменьшить использование оперативной памяти? Или мне нужно вносить изменения в библиотеки, которые я использую? Вот моя основная программа:

    #include <MIDI.h>
#include <FastLED.h>
#include <SoftwareSerial.h>

#define LED_PIN 3
#define NUM_LEDS 60
#define LEDMAP 0xAB5AB5AB5AB5AB5
#define OFFSET 36
#define RANGECHECK if (pitch > 35 && pitch < 96)

SoftwareSerial softSerial(2, 4);
CRGB leds[NUM_LEDS];

MIDI_CREATE_INSTANCE(SoftwareSerial, softSerial, midiB);

void setup() {
  FastLED.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.clear(true);
  midiB.begin(MIDI_CHANNEL_OMNI);
  midiB.setHandleNoteOn(HandleOn);
  midiB.setHandleNoteOff(HandleOff);
}

void loop() {
  midiB.read();
}

void HandleOn(byte channel, byte pitch, byte velocity)
{
  RANGECHECK
  {
    leds[pitch - OFFSET] = bitRead(LEDMAP, (pitch - OFFSET)) ? CRGB::NavajoWhite : CRGB::Salmon;
    FastLED.show();
  }
}

void HandleOff(byte channel, byte pitch, byte velocity)
{
  RANGECHECK
  {
    leds[pitch - OFFSET] = CRGB::Black;
    FastLED.show();
  }
}

Я достиг своего предела в оптимизации использования оперативной памяти здесь. Буду признателен за любые предложения по оптимизации моего кода.

, 👍2


2 ответа


Лучший ответ:

1

Поскольку я не использую сообщения sysex, я сократил использование оперативной памяти до 84%, установив SysExMaxSize

в midi_settings.от h до 0.

,

3

FastLED должен сохранять цвета всех пикселей в оперативной памяти, поэтому для этого используется много оперативной памяти.

Чтобы обойти это, вы можете использовать стратегию, которая генерирует пиксельные данные на лету, когда вы отправляете их в строки. Вот пример проекта, который делает это...

https://wp.josh.com/2021/04/21/build-a-live-scrolling-tickertape/

Кроме того, SoftSerial хранит буфер (выглядит как 64 байта?), который также использует некоторое количество оперативной памяти. Вы могли бы использовать другой подход к последовательной связи, который не выделяет такой большой буфер. Это потребует работы, но вы даже можете обрабатывать midi-байты по мере их получения и не нуждаться в байтовом буфере.

,

Я уже пытался переопределить _SS_MAX_RX_BUFF в своем коде, но это никак не повлияло на используемые глобальные переменные, @Boyfinn