Есть ли хороший справочник для Arduino архитектуры и использования памяти?

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

Есть несколько источников, которые я просмотрел на пути к этому вопросу:

  • Должный указан здесь и здесь как имеющий 512 КБ флэш-памяти, 96 КБ SRAM и нулевой EEPROM.

  • В руководстве arduino foundation отмечается, что архитектура Due memory отличается, но не расширяется дальше.

  • В ответе @Majenko на этот предыдущий вопрос отмечается: "Для ARM не требуется PROGMEM. Между флэш-памятью и оперативной памятью нет разделения шины памяти"

  • Блок-схемы таблицы данных SAM3x показывают унифицированную шину (т. Е. архитектуру фон Неймана (не гарвардскую архитектуру, как платы AVR))

    SAM3X block diagram

  • В этом ответе на форуме Arduino предлагается (относительно выделения констант для flash): "[...] все, что вам нужно сделать, это использовать "const" в объявлении переменной. [...] Все, что является "const", помещается во флэш-память, не потребляя никакой оперативной памяти. PROGMEM , pgm_read_byte() и другие имена AVR определены только для того, чтобы код, предназначенный для AVR, мог компилироваться. Но они абсолютно ничего не делают на [микроконтроллерах SAM3X] ".

  • Макрос F(), похоже, все еще работает.

Итак, мой вопрос заключается в поиске ссылок на справочник или руководство по использованию памяти на Arduino Due. Я надеюсь, что руководство (или ваши ответы) могло бы объяснить различия, вызванные изменением шины архитектуры фон Неймана, что и где хранится, подчеркнув, какие методы обработки памяти, разработанные для микроконтроллеров Harvard architecture AVR, остаются актуальными в Будущем.

Если нет руководства, я надеюсь, что этот вопрос и ваши ответы могут стать хорошим ориентиром. Спасибо за чтение!

, 👍1

Обсуждение

Правильно ли было бы сказать, что для Arduino Due все константы (включая строковые литералы в коде, не использующие F()), хранятся во флэш-памяти?, @RowanP


2 ответа


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

1

Итак (приветствуется отзыв) в архитектуре памяти 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, но могут иметь отношение к совместимости с несколькими платами.

,

2

Да, Arduino Due использует плоскую модель памяти с единым адресным пространством для флэш-памяти и оперативной памяти. Поэтому все постоянные данные хранятся во флэш-памяти и их не нужно копировать в оперативную память при запуске, как это делают ардуино на базе AVR. Программный материал для процессоров на базе AVR необходим, потому что они должны использовать другие инструкции для чтения данных с флэш-памяти, чем из ОЗУ. Это больше не относится к Due (как и к большинству других 32-разрядных микроконтроллеров, таких как ESP32), и строковый адрес в инструкции работает одинаково, независимо от того, находится ли он в ОЗУ или во флэш-памяти (если, конечно, он не записан).

Макрос F() доступен для удобства, чтобы вам было легче писать код, который работает для всех плат Arduino. С другой стороны, это в основном реализовано как no-op.

Когда вы работаете над моделью памяти Due, я мог бы указать на этот вопрос, показывая, что в реализации управления памятью Due есть ошибка, допускающая неограниченное выделение памяти.

,