"Мульти BOOT" на Ардуино Мега

Видел похожие темы - но немножко не то.
Создал себе на Меге устройство для работы с разными изделиями по RS485. Для каждого изделия есть своя подпрограма (для настройки).
Проблема вылезла после очередного апдейта (добавления подпрограмы для работы с новым устройством). Проблема (как я понял) в нехватке ОЗУ. Если загружаю подпрограмы по очереди то все нормально, а если все одним скетчем то начинаются глюки (накладываются значение переменных в ОЗУ).
Как я понял из тех тем что нашел поиском, то запустить только одну часть скетча нельзя. Памяти флеш предостаточно а ОЗУ выходит маловато. Подскажите какие есть варианты для решения такой задачи.

Я так понимаю, “переписать скетч” - не предлагать?
БОльший объем памяти есть у BluePill, Arduino Due, esp*…

Да, еще можно просто установить дополнительную память. На Меге для этого даже есть подходящий интерфейс - до 64к. Еще можно использовать SPI память - есть доступные микросхемы до 8М.

Ну, как бы я понимаю что проблема в скетче, надо переписать все с “0” для экономии ОЗУ, но на данном этапе для такой работы нет времени (это как хобби). А основная работа не ждёт и уже привык к своей “коробочке” -помощнице, очень экономит время по сравнению с обычными методами (ноут, переходник…)

А вот тут пожалуйста поподробней. Где можно про это почитать и примерчик может есть. Я правильно понимаю: мы говорим про увеличение ОЗУ?

Купи вторую плату, ёлки палки

И куда ее запихнуть?
Устройство одно! Функционал расширяется со временем и потребностями.
По простому: устройство умеет работать с 5-ю датчиками, при запуске надо выбрать с каким сейчас работаем. И все, только часть программы работает. При следующем запуске возможно потребуется работа з другим датчиком (устройством).
Если бы была возможность запускать только часть записанной в памяти программы то и ОЗУ хватило бы, а так все занимается и теми переменными которые в данный момент не используются.

Сначала надо выяснить причины проблемы, потом уже их устранять. Пока есть только ничем не подтверждённые фантазии.
Скорее всего, ошибки не из-за нехватки памяти, а из-за ошибок в скетче.

3 лайка

Что мешает загружать в память только те переменные, которые нужны в конкретном коде? Наверняка ваши “переменные” - и не переменные вовсе, а константы, какие-нибудь таблицы параметров или данные настройки? - их можно поместить в программную память и освободить ОЗУ

1 лайк

что тут обсуждать не видя скетча

А Мега-то какая? 8 или 256 ?

А “область видимости” не разграничивает разве память?

На сколько я знаю в Arduino Mega устанавливается 2560.

В таком случае при грамотном коде надо постараться забить 8 кб ОЗУ, если это не связано с графикой и расчётом орбиты Солнца вокруг центра галактики.

Варианта два: расширение ОЗУ по параллельной шине (ресурсоемко, особенно по количеству использованных ног) и RAM, подключаемая по SPI.
Первым вариантом не пользовался, но знаю, что он доступен в Arduino Mega и в stm32f407.
Второй вариант:

1 лайк

И какие с этим могут быть проблемы?
Это обычный режим работы, даже если Вы не знакомы со структурным программированием.
Надеюсь, о таких операторах как if или switch Вы что-нибудь слышали?

Не поверю, что это простые переменные. Скорее всего, либо объемные структуры, либо массивы. И в том и в другом случае - выделять память для них динамически.

Компилятор уведомляет что используется 73598 байт (28%) флеша и 6852 (83%) ОЗУ, отсюда я решил что проблема в нехватке ОЗУ для этого скетча.

Таких мало, уже искал похожие проблемы, но таких переменных практически нет.

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

Ключевое “при ГРАМОТНОМ”! Я же повторяю у меня код не грамотный но рабочий и функционал выполняет.
На данной стадии думал что можно как то разграничить скетчи, но так нельзя…

Пока этот вариант для меня думаю подойдет, подскажите пример!

Перепишите загрузчик и перезаписывайте каждую задачу из организованного в памяти хранилища в нулевые адреса.

А вообще проблема высосана из пальца ! Вы просто не умеете работать с динамическими переменными !!!

Выложите только те строки, которые забивают эти 6852 байта ОЗУ.

не страдайте фигней. Просто поменяйте плату. Ардуино Мега очень устарела.
Например ЕСП32 имеет в 70 раз больше ОЗУ и при этом впятеро дешевле Меги.

2 лайка

Да подтверждаю!
Когда начинал делать 3 года назад то у меня все переменные были глобальными, но на тот функционал Меги хватало. Потом начал доделывать модули, уже больше локальными переменными и указателями, но основа то осталась… вот уперся в нехватку. А еще много библиотек (возможно не очень рационально сделанных), а плюс много используется String - что тоже жрет память.

В принцыпе я понял: на халяву ничего не будет, надо переписывать основу, а если и того мало будет то переходить на ESP32. (когда начинал то так и планировал что когда-то перейду на ЕСП)
Пока всем СПАСИБО за потраченое время!

Ну вот,сами знаете про String. Пихайте их во флеш. Подозреваю что они и занимают львиную долю.