Работа с внешней памятью и управление памятью - PullRequest
0 голосов
/ 03 марта 2019

Как можно использовать внешнее ОЗУ относительно MCU, который также имеет внутреннее ОЗУ?

Могут ли области стека / кучи и т. Д. Быть созданы во внешнем ОЗУ?

Каксвязать / выполнить функции во внешнем ОЗУ?(Keil 4 IDE)

1 Ответ

0 голосов
/ 03 марта 2019

Память будет использоваться способом, определенным в вашем scatter-файле или скрипте компоновщика - она ​​не имеет ничего общего с MCU и внутренней / внешней оперативной памятью.

Вы описываете доступные области физической памяти на вашей платформе в scatter-файле (различные цепочки инструментов могут использовать разные термины, такие как сценарий компоновщика) и назначаете атрибуты каждому разделу, чтобы сообщить компоновщику, для чего может использоваться каждая памятьи, возможно, явное размещение определенного кода или элементов данных в определенных разделах.

Компоновщик не найдет в памяти ничего, о чем вы не сообщили.Возможно, вы захотите обрабатывать всю память одинаковым образом и дать компоновщику свободу действий, чтобы распределить, где он пожелает, но в случае MCU это может быть неоптимальным.Например, внутренняя шина памяти может быть быстрее, чем внешняя, поэтому вы можете ограничить обработку по времени.Если вы разрешите компоновщику распределяться по своему усмотрению, изменения в вашем коде могут существенно изменить производительность, если какой-то критический объект будет перемещен в более медленную память.

Даже во внутренней ОЗУ деталь может сегментировать ее в разные области с независимыми шинамитак, например, вы можете использовать регион специально для DMA, чтобы уменьшить или устранить конфликт шины.

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

В частности, в Keil вы можете назначить базовую область памятисхемы в конфигурации проекта, вкладка «Target»:

enter image description here

В этом случае вы можете добавить свою внешнюю память в поля RAM1 / 2/3.

Для более сложных требований (таких как crесть именованные разделы), на вкладке компоновщика: enter image description here вам необходимо снять флажок «Использовать макет памяти из целевого диалогового окна» и нажать «Изменить» для файла разброса (или указать новыйпуть к файлу разброса).Файл разброса по умолчанию - это файл, созданный вашими настройками в целевом диалоговом окне, но теперь вы отсоединили его, чтобы настроить его в соответствии со своими потребностями.

Следует отметить, что часто доступ к внешней памяти требует правильной конфигурации контроллера внешней памяти (например, для назначения контактов шины и установки правильного времени шины).Если компоновщик должен распределить использование такой памяти, важно, чтобы память была сконфигурирована в коде запуска во время выполнения, прежде чем инициализация памяти приложения будет выполнена кодом запуска во время выполнения на C или C ++.Обычно необходимо, по крайней мере, изначально, чтобы системный стек был помещен во внутреннюю память, так как для кода запуска потребуется стек, вероятно, до инициализации внешней памяти.Позже можно переместить системный стек до запуска среды выполнения C, но если вы используете ОСРВ, в этом может не быть необходимости, поскольку каждая задача будет иметь свой собственный стек, установленный после работы внешней памяти.Кроме того, в тех частях, где системный стек является также стеком прерываний, вы захотите, чтобы он находился в самой быстрой и надежной (в смысле доступности) памяти.

Другое соображение заключается в том, что такие архитектуры, как ARM Cortex-M, имеют отдельные шины, предназначенные для кода и данных, что позволяет им одновременно извлекать инструкции и данные.Если вы поместите код в ОЗУ данных, вы можете значительно замедлить выполнение, поскольку команды и выборки данных из одной и той же памяти должны выполняться последовательно.В сочетании с часто более низкой скоростью шины внешней памяти вы можете проявлять осторожность при размещении кода для выполнения во внешней ОЗУ (или фактически в любой ОЗУ).В некоторых частях, как правило, в архитектурах Von Neumann, выполнение ОЗУ выполняется быстрее, чем в ПЗУ, но для частей с шинами архитектуры Гарварда и ускорителями или кэшами флэш-памяти это не всегда так.Поэтому не думайте, что при размещении кода во внешнем ОЗУ можно извлечь выгоду.

...