Есть ли хороший справочник для Arduino архитектуры и использования памяти?
Найти справочный источник или руководство по использованию оказалось сложнее, чем я ожидал.
Есть несколько источников, которые я просмотрел на пути к этому вопросу:
Должный указан здесь и здесь как имеющий 512 КБ флэш-памяти, 96 КБ SRAM и нулевой EEPROM.
В руководстве arduino foundation отмечается, что архитектура Due memory отличается, но не расширяется дальше.
В ответе @Majenko на этот предыдущий вопрос отмечается: "Для ARM не требуется PROGMEM. Между флэш-памятью и оперативной памятью нет разделения шины памяти"
Блок-схемы таблицы данных SAM3x показывают унифицированную шину (т. Е. архитектуру фон Неймана (не гарвардскую архитектуру, как платы AVR))
В этом ответе на форуме Arduino предлагается (относительно выделения констант для flash): "[...] все, что вам нужно сделать, это использовать "const" в объявлении переменной. [...] Все, что является "const", помещается во флэш-память, не потребляя никакой оперативной памяти. PROGMEM , pgm_read_byte() и другие имена AVR определены только для того, чтобы код, предназначенный для AVR, мог компилироваться. Но они абсолютно ничего не делают на [микроконтроллерах SAM3X] ".
Макрос
F()
, похоже, все еще работает.
Итак, мой вопрос заключается в поиске ссылок на справочник или руководство по использованию памяти на Arduino Due. Я надеюсь, что руководство (или ваши ответы) могло бы объяснить различия, вызванные изменением шины архитектуры фон Неймана, что и где хранится, подчеркнув, какие методы обработки памяти, разработанные для микроконтроллеров Harvard architecture AVR, остаются актуальными в Будущем.
Если нет руководства, я надеюсь, что этот вопрос и ваши ответы могут стать хорошим ориентиром. Спасибо за чтение!
@RowanP, 👍1
Обсуждение2 ответа
Лучший ответ:
Итак (приветствуется отзыв) в архитектуре памяти Arduino Due SAM3x по сравнению с архитектурой AVR:
Энергонезависимая флэш-память
содержит:
- код инструкции программы (такой же, как AVR)
- загрузчик (такой же, как AVR)
- все константы C ++ во время выполнения, включая строковые литералы incode (отличные от AVR)
доступ к нему осуществляется:
- C ++ const код определения данных и литералы incode (отличные от AVR)
- Код инструкции C ++ (такой же, как AVR)
PROGMEM
,PSTR()
,F()
, библиотекаpgmspace * _P
функции не требуются и компилируются только для совместимости с платформой (в отличие от AVR).
Энергозависимая память SRAM
содержит:
- переменное динамическое хранилище, организованное в виде стека и кучи (аналогично AVR)
- нет статического / постоянного хранилища, которое теперь остается во флэш-памяти (в отличие от AVR).
доступ к нему осуществляется:
- Код определения данных на C ++ (такой же, как AVR)
Использование
Фрагментация кучи остается проблемой, требующей решения. Предпочтение локального распределению глобальному и отказ от динамического распределения кучи остаются актуальными для Arduino Due (например, строки Arduino)
Методы перемещения констант во флэш-память не имеют отношения к Due, но могут иметь отношение к совместимости с несколькими платами.
Да, Arduino Due использует плоскую модель памяти с единым адресным пространством для флэш-памяти и оперативной памяти. Поэтому все постоянные данные хранятся во флэш-памяти и их не нужно копировать в оперативную память при запуске, как это делают ардуино на базе AVR. Программный материал для процессоров на базе AVR необходим, потому что они должны использовать другие инструкции для чтения данных с флэш-памяти, чем из ОЗУ. Это больше не относится к Due (как и к большинству других 32-разрядных микроконтроллеров, таких как ESP32), и строковый адрес в инструкции работает одинаково, независимо от того, находится ли он в ОЗУ или во флэш-памяти (если, конечно, он не записан).
Макрос F()
доступен для удобства, чтобы вам было легче писать код, который работает для всех плат Arduino. С другой стороны, это в основном реализовано как no-op.
Когда вы работаете над моделью памяти Due, я мог бы указать на этот вопрос, показывая, что в реализации управления памятью Due есть ошибка, допускающая неограниченное выделение памяти.
- Как функция/метод может определить, является ли передаваемый массив const PROGMEM (flash) или нет (RAM)?
- Как получить размер моей программы во время выполнения?
- Портирование «дальнего» доступа к флэш-памяти с Arduino Mega на Due
- Записать во флэш-память с помощью PROGMEM
- Как постоянно считывать/записывать переменные на Arduino Due (без EEPROM/shield)?
- Вспомогательный объект Flash String в качестве переменной
- Проблема с памятью Arduino со старыми чипами дисплея HP HDSP-2000
- Считывание байтов из массива PROGMEM
Правильно ли было бы сказать, что для Arduino Due все константы (включая строковые литералы в коде, не использующие F()), хранятся во флэш-памяти?, @RowanP