Как уменьшить использование глобальных переменных? 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();
}
}
Я достиг своего предела в оптимизации использования оперативной памяти здесь. Буду признателен за любые предложения по оптимизации моего кода.
@Boyfinn, 👍2
2 ответа
Лучший ответ:
Поскольку я не использую сообщения sysex, я сократил использование оперативной памяти до 84%, установив SysExMaxSize
в midi_settings.от h
до 0.
FastLED должен сохранять цвета всех пикселей в оперативной памяти, поэтому для этого используется много оперативной памяти.
Чтобы обойти это, вы можете использовать стратегию, которая генерирует пиксельные данные на лету, когда вы отправляете их в строки. Вот пример проекта, который делает это...
https://wp.josh.com/2021/04/21/build-a-live-scrolling-tickertape/
Кроме того, SoftSerial хранит буфер (выглядит как 64 байта?), который также использует некоторое количество оперативной памяти. Вы могли бы использовать другой подход к последовательной связи, который не выделяет такой большой буфер. Это потребует работы, но вы даже можете обрабатывать midi-байты по мере их получения и не нуждаться в байтовом буфере.
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Использование std::list в программировании Arduino
- Почему считается плохой практикой использовать ключевое слово "new" в Arduino?
- Есть ли способ подключить оперативную память компьютера к Arduino?
- Использование памяти: #define против static const для uint8_t
- Программирование сервопривода на ATtiny85
- Digispark ATtiny 85 - не распознается как HID устройство
- Клавиатура Digispark ATtiny85
Я уже пытался переопределить _SS_MAX_RX_BUFF в своем коде, но это никак не повлияло на используемые глобальные переменные, @Boyfinn