Я новичок в программировании Arduino (версия Arduino Pro Mini 3.3v), у меня есть немного кода, как показано ниже. Я подключаю 9DOF, OLED-экран и BLE-прорыв к Arduino Pro Mini.
Я уже прошел некоторые советы по оптимизации памяти, но у меня все еще есть некоторые проблемы. Даже со следующим кодом у меня осталось только 9 байтов для динамической памяти. Если я включу BTLEserial.begin(); , это убьет память. Пожалуйста, любые предложения будут оценены.
#include #include #include #include «Adafruit_BLE_UART.h» #include #include #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); LSM9DS1 imu; #define LSM9DS1_M 0x1E // Would be 0x1C if SDO_M is LOW #define LSM9DS1_AG 0x6B // Would be 0x6A if SDO_AG is LOW #define ADAFRUITBLE_REQ 10 #define ADAFRUITBLE_RDY 2 #define ADAFRUITBLE_RST 9 Adafruit_BLE_UART BTLEserial = Adafruit_BLE_UART(ADAFRUITBLE_REQ, ADAFRUITBLE_RDY, ADAFRUITBLE_RST); void setup(void) < Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // initialize with the I2C addr 0x3D (for the 128×64) display.display(); delay(2000); display.clearDisplay(); display.drawPixel(10, 10, WHITE); display.display(); delay(2000); display.clearDisplay(); imu.settings.device.commInterface = IMU_MODE_I2C; imu.settings.device.mAddress = LSM9DS1_M; imu.settings.device.agAddress = LSM9DS1_AG; if (!imu.begin()) < while (1) ; >// BTLEserial.begin(); — if i uncomment this code, i will get a not enough memory error. > aci_evt_opcode_t laststatus = ACI_EVT_DISCONNECTED; void loop() < displayAllDOF(); >void displayAllDOF()
user843653 13 апр ’16 в 15:38 2016-04-13 15:38
2016-04-13 15:38
1 ответ
Для начала вам нужно выяснить, куда направляется ваша RAM — Сколько занимает каждая библиотека? Вам действительно нужно запустить их все одновременно? Вы знаете, что вы можете запустить библиотеку дисплея и код IMU в вашей текущей настройке. Можете ли вы реализовать что-то, что включает только код IMU, извлекает данные, а затем отключает их?
Arduino оптимизация использования оперативной памяти
И то же самое с дисплеем и кодом BTLE? Таким образом, каждая библиотека потребляет ОЗУ только тогда, когда это необходимо, и освобождает ее, когда работа завершена.
Обновление 1
Пример того, что я упомянул выше. Я не знаю, все ли библиотеки реализуют .end() функция. У них может быть похожий метод, который вы можете использовать.
// Simple data storage for the .gx and .gy values typedef struct < float x, y; >GyroData_t; GyroData_t getImuData() < GyroData_t data; // Create the IMU class, gather data from it, and then destroy it LSM9DS1 *imu = new LSM9DS1(); imu->begin(); imu->readGyro(); data.x = imu.gx; data.y = imu.gy; imu->end(); // This will reclaim the RAM that was used by the IMU — We no longer need it delete imu; return data; > void displayAllDOF() < // Gather the IMU data GyroData_t data = getImuData(); // Create the display object, and print the data we received Adafruit_SSD1306 *display = new Adafruit_SSD1306(OLED_RESET); display->print(. ); . display->end(); // Reclaim the display RAM used delete display; // Do any bluetooth operations now doBluetoothStuff(); > void doBluetoothStuff() < Adafruit_BLE_UART *BTLEserial = new Adafruit_BLE_UART(ADAFRUITBLE_REQ, ADAFRUITBLE_RDY, ADAFRUITBLE_RST); BTLESerial->begin(); . BTLESerial->end(); delete BTLESerial; >
Источник: stackru.com
Arduino как освободить память. Не хватает памяти UNO NANO.
Что я могу сделать, если у меня заканчивается флэш-память или SRAM?
Согласно документации Arduino, ATmega328 имеет 32 КБ флэш-памяти для загрузчика + загруженный эскиз и только 2 КБ SRAM для данных времени выполнения. ATmega2560 имеет немного больше, общий объем 256 КБ и 8 КБ соответственно.
В любом случае эти ограничения кажутся довольно небольшими, особенно по сравнению с потребительскими устройствами аналогичного размера, такими как смартфоны.
Что вы можете сделать, если у вас кончились? Например, если ваш эскиз слишком большой или вам нужно обрабатывать много данных (например, строк) во время выполнения? Есть ли способ расширить Flash или SRAM?
Попробуйте использовать некоторые переменные оптимизации. Некоторые различные переменные обсуждаются здесь
Используйте надлежащие области действия для ваших переменных, если это еще не сделано, компилятор оптимизирует использование оперативной памяти для вас, когда переменные не используются.
Вы можете использовать Teensy 3.2 (с программным обеспечением Teensyduino), которое будет сравнимо с Arduino. Учитывая, что у вас заканчивается RAM / PROGMEM, это также означает, что вы, скорее всего, пытаетесь подтолкнуть Arduino. Teensy 3.2 не намного дороже. но имеет: 32-битную, 72 МГц (wtf !?) флэш-память 256 КБ, 64 КБ ОЗУ и 3x UART. Не больше памяти программ, как у ATmega2560, но должно быть достаточно оперативной памяти и увеличения скорости.
Оптимизация
Низкоуровневое программирование для встроенных систем весьма отличается от программирования для устройств общего назначения, таких как компьютеры и мобильные телефоны. Эффективность (с точки зрения скорости и пространства) гораздо важнее, потому что ресурсы стоят на первом месте. Это означает, что самое первое, что нужно сделать, если вам не хватает места, это посмотреть, какие части вашего кода вы можете оптимизировать.
С точки зрения сокращения использования программного пространства (Flash) размер кода может быть довольно трудно оптимизировать, если вы неопытны или более привыкли к программированию для настольных компьютеров, которые не склонны к этим навыкам. К сожалению, не существует подхода «волшебной пули», который будет работать во всех ситуациях, хотя он помогает, если вы серьезно задумаетесь над тем, что в действительности должен иметь ваш эскиз . Если функция не нужна, уберите ее.
Иногда также полезно определить, где несколько частей вашего кода одинаковы (или очень похожи). Вы можете сжать их в многократно используемые функции, которые можно вызывать из нескольких мест. Однако имейте в виду, что иногда попытка сделать код слишком многократно используемым на самом деле делает его более многословным. Это сложный баланс для забастовки, который имеет тенденцию приходить с практикой. Можно потратить некоторое время на изучение того, как изменения кода влияют на вывод компилятора.
Оптимизация данных времени выполнения (SRAM) имеет тенденцию быть немного легче, когда вы к этому привыкли. Очень распространенная ловушка для начинающих программистов — использование слишком большого количества глобальных данных. Все, что объявлено в глобальном масштабе, будет существовать в течение всего времени существования эскиза, и это не всегда необходимо.
Если переменная используется только внутри одной функции, и она не должна сохраняться между вызовами, то сделайте ее локальной переменной. Если значение должно быть разделено между функциями, подумайте, можете ли вы передать его как параметр вместо того, чтобы делать его глобальным. Таким образом, вы будете использовать SRAM только для тех переменных, которые вам действительно нужны.
Еще одним убийцей использования SRAM является обработка текста (например, использование String класса). Вообще говоря, вам следует избегать выполнения операций со строками, если это возможно. Они огромные боровы памяти. Например, если вы выводите много текста в последовательный порт, используйте несколько вызовов Serial.print() вместо вместо конкатенации строк. Также попытайтесь сократить количество строковых литералов в вашем коде, если это возможно.
Избегайте рекурсии, если это возможно. Каждый раз, когда выполняется рекурсивный вызов, стек поднимается на уровень глубже. Перефразируйте ваши рекурсивные функции, чтобы они стали итеративными.
Использование EEPROM
EEPROM используется для долговременного хранения вещей, которые изменяются только изредка. Если вам нужно использовать большие списки или справочные таблицы с фиксированными данными, подумайте о том, чтобы заранее сохранить их в EEPROM и извлекать только то, что вам нужно, когда это необходимо.
Очевидно, что EEPROM довольно ограничен по размеру и скорости и имеет ограниченное количество циклов записи. Это не лучшее решение для ограничения данных, но этого может быть достаточно, чтобы облегчить нагрузку на Flash или SRAM. Также возможно взаимодействие с аналогичным внешним хранилищем, таким как SD-карта.
Расширение
Если вы исчерпали все остальные варианты, возможно, расширение возможно. К сожалению, расширение флэш-памяти для увеличения места в программе невозможно. Тем не менее, есть возможность расширить SRAM. Это означает, что вы сможете реорганизовать свой эскиз, чтобы уменьшить размер кода за счет увеличения размера данных.
Получить больше SRAM на самом деле довольно просто. Один из вариантов — использовать один или несколько чипов 23K256 . Доступ к ним осуществляется через SPI, и есть библиотека SpiRAM, которая поможет вам их использовать. Просто знайте, что они работают при 3,3 В, а не 5 В!
Если вы используете Mega, вы также можете получить щиты расширения SRAM от Lagrangian Point или Rugged Circuits .
Источник: qastack.ru
Недостаточно памяти программа может работать нестабильно arduino
Не хватает памяти
У меня курсовая работа по теме фракталы Серпинского, уже вроде готова(исходники ниже) но есть одно.
Не хватает памяти
Здравствуйте, недавно поменял gtx 750 на 1070, после смены видеокарты в некоторых играх спустя.
Не хватает памяти
Привет всем! Ребята,может я что-то не так понимаю,но по скрину видно,что у меня 8гб.памяти а в.
Возьмите ардуину с большим объемом памяти.
2 КБ ОЗУ это очень мало. Например в STM32F407ZGT6 — 1 МБ для прошивки и 128 + 64 КБ ОЗУ. И встроенный сетевой адаптер.
Во-первых, сначала убедиться, что дело именно в нехватке памяти, взяв, скажем, Arduino Mega.
Во-вторых, если дело именно в этом, перестать расшвыриваться этой памятью направо и налево, как в вашем коде. Зачем объявлены две переменные myFile ? Зачем сюда приплетено использование класса String ? Наличие обращений к Serial сразу же отжирают немалый кусок памяти.
Что такое data ? Строка? Где у вас в коде запись завершающего нуля в эту строку?
Взял мегу, и проблема ушла.
Добавлено через 7 минут
передаю данные в виде
uint8_t packetBuffer
проблема на стороне приёмника: приходит в виде UnicodeString.
не получается разложить на байты. Отправляемый массив 1,222,173,190,239,254,237,237
принимается корректно только 1 и последний байты. Вместо 222,173,190,239,254,237 получается
Не хватает памяти
Здрасьте всем. Не пойму в чем дело: В коде создаю документ . Set uidoc =.
не хватает памяти
создаю bitmap unit Unit1; interface uses Windows, Messages, SysUtils, Variants.
Не хватает памяти
В задаче «E. ОПТОВОЛОКНО 2» (условия прикрепляю) во входных данных оговорено, что.
Не хватает памяти
Приветствую, ребята. Есть вот такой код: Task<ObservableCollection<RecordRegZhur>> task_get_data.
Почему не хватает памяти
Стоит 16 Гб, я понимаю что используется меньше 4-х гигабайт, потому что 32-х разрядная семерка, но.
На ПК не хватает виртуальной памяти
люди добрые помоги пожалусто :-[ у меня такая проблема. У меня нехватает виртуальной памяти. я.
- Как оформить стихотворение в ворде
- Как найти потерянный документ ворд на компьютере
- Чем открыть формат wcx
- В текстовый документ можно внедрить рабочий лист excel с таблицей и возможностью построения диаграмм
- Презентация вставка рисунка в ворд
Источник: kompyutery-programmy.ru