Зачем выполнять код из оперативной памяти?

27

Я только что натолкнулся на несколько макросов для моего компилятора микроконтроллера, чтобы заставить (или предложить) функцию выполняться из ОЗУ.

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x/

https://community.nxp.com/thread/389099

В каких случаях это ценно? Почему бы мне просто не всегда выполнять из ОЗУ, если выгода только в увеличении скорости? Это обычно вызывает более высокое потребление тока?

tarabyte
источник
13
Выполнение кода из ОЗУ потребляет меньше тока (я не уверен, верно ли это для всех CPU / SoC). Однажды я сделал проект, в котором мы поместили большую часть кода в оперативную память, потому что это было аккумуляторное устройство, и мы хотели, чтобы он работал как можно дольше. Если вы можете выполнять код только из ОЗУ, вы даже можете отключить блоки флэш-памяти на некоторых SoC и сэкономить еще больше энергии.
Аль Банди
4
@pipe. Я полагаю, что причина для того, чтобы сделать это комментарием, а не ответом, заключается в том, что он не отвечает на реальный вопрос, поэтому вам не хотелось бы всегда использовать ОЗУ для выполнения вашего кода.
Жюль
1
@Jules Да, я предполагаю, что это подразумевается как «полезный анекдот». Вещи Stack Exchange предназначены для предотвращения по очень веским причинам.
труба
1
Потому что у вас недостаточно регистров для выполнения из регистра. (У меня есть этот чип.)
Джошуа
В дополнение ко всему: выполнение кода из динамического ОЗУ, в частности, может быть частью сложного программного взлома для обновления DRAM. :)
Kaz

Ответы:

32

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

brhans
источник
4
зависит от того, сколько флэш-блоков у вас есть и какие из них позволяет изменить ваш загрузчик, сколько оперативной памяти у вас осталось, чтобы подготовить данные для следующего блока и т. д., но верно то, что батут отключен от флэш-памяти, чтобы вы могли изменить флэш-память. хорошо для этого ...
old_timer
1
Это только кажется, отвечает на половину вопроса (титульная часть). ОП также спросил: «Почему бы мне просто не всегда выполнять из ОЗУ, если выгода только в увеличении скорости?», И этот ответ не объясняет, почему можно не выполнять из ОЗУ.
Доктор J
2
Пока все хорошо, но что произойдет, если вы потеряете мощность (и, следовательно, ОЗУ) в процессе перезаписи флэш-памяти? Это можно решить, но, как и любой другой дизайн загрузчика, это необходимо учитывать.
AaronD
19

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

Преимущество вспышки в том, что большие объемы могут быть относительно дешевыми. Поэтому производители микроконтроллеров иногда помещают много флеш-памяти в микросхему, а затем предоставляют более ограниченное пространство ОЗУ, из которого может выполняться код. Это позволяет копировать критичные по времени подпрограммы в ОЗУ, а затем выполнять их оттуда.

Переключатель компилятора, на который вы ссылаетесь, вероятно, работает с компоновщиком и помечает ту часть флэш-памяти, которая будет скопирована в ОЗУ кодом времени выполнения компилятора, который запускается после сброса. Различные реализации будут отличаться в деталях.

Олин Латроп
источник
17

Когда вы хотите выполнить в ОЗУ, потому что это быстрее, это обычно потому, что это ОЗУ на кристалле. Это ограниченный ресурс, который вам, вероятно, понадобится для данных, требующих доступа для чтения / записи.

Использование его для кода, когда у вас уже есть код в ПЗУ / флэш-памяти, означает, что вам нужно X объема флэш-памяти и дополнительный X объема ОЗУ.

Это также требует дополнительного этапа копирования при загрузке или когда вы хотите запустить его, хотя это в основном незначительно.

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

Существует также проблема надежности - код, выполняемый в реальном ПЗУ, трудно изменить с помощью ошибочного кода.

труба
источник
14

В дополнение ко всем хорошим ответам:

Почему бы мне просто не всегда выполнять из ОЗУ, если выгода только в увеличении скорости?

Потому что во встроенной системе обычно у вас нет необходимого объема оперативной памяти. Например, STM32, имеющий 32 КБ или ОЗУ и 512 КБ EEPROM. Чтобы выполнить всю программу в ОЗУ, вам потребуется объем ОЗУ больше, чем ЭСППЗУ.

Марко Буршич
источник
5
«Потому что во встроенной системе, как правило , не имеют необходимого количества оперативной памяти.» - и потому , что если вы делаете достаточно оперативной памяти , чтобы сделать это, вы можете почти наверняка сократить расходы за счет перехода на более дешевый MCU с меньшим количеством оперативной памяти. Потому что если вы задаете вопрос, всегда есть более дешевый MCU с меньшим количеством оперативной памяти (самый маленький и самый дешевый микроконтроллеры использование Harvard архитектура поэтому не может выполняться из RAM)
Жюль
13

Другие ответы, по-видимому, мало обсуждали энергопотребление, о котором вы специально спрашивали.

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

Типичное использование - запуск функции «сна» с низким энергопотреблением из ОЗУ с отключенной флэш-памятью. Мало того, что уменьшается энергопотребление, но если микроконтроллеру нужно быстро разбудить (например, в ответ на внешнее прерывание), нет задержки, пока флэш-память снова включается.

Некоторые детали, например, некоторые из линейки Atmel SAM, имеют специальную сверхнизкую мощность ОЗУ, которую можно использовать для этой цели. Это позволяет загружать небольшой объем кода в специальную оперативную память, в то время как основная часть доступной оперативной памяти и всех других запоминающих устройств отключается, и микроконтроллер переходит в режим глубокого сна.

пользователь
источник
7

Помимо потенциальных преимуществ в скорости, упомянутых другими, код ОЗУ также является динамическим и может быть изменен на лету с помощью некоторого специального кода во FLASH по мере необходимости.

Это может быть так же просто, как изменение нескольких параметров или целые подпрограммы обработчика, загруженные удаленно.

Trevor_G
источник
Или код в оперативной памяти может быть загружен с диска (например, SD) или по сети
teambob
4

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

Однако имейте в виду, что перемещение кода с флэш-памяти на RAM также требует времени. Если код выполняется только один раз, вам нужно только прочитать его один раз, и, следовательно, вы фактически потеряете время для его копирования в ОЗУ, а не выполняете его напрямую. Если код выполняется время от времени (поэтому копирование его в ОЗУ увеличило бы выполнение во второй раз, когда он вызывается), но система, как правило, бездействует, вы выполняете этот код быстрее, копируя его в ОЗУ, но это никого не волнует, потому что система есть достаточно времени, чтобы потратить.

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

С другой стороны, ОЗУ должно активно хранить данные, в то время как флэш-память нет, поэтому общее энергопотребление увеличивается, если ОЗУ должна оставаться активной. Это, однако, уместно только в том случае, если в противном случае ОЗУ вообще не используется, но большинство современных систем - так или иначе - уже используют доступное ОЗУ и, следовательно, уже поддерживают его активным.

TwoThe
источник
4

Есть две очень распространенные причины для выполнения кода из оперативной памяти:

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

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

Дэйв Надлер
источник
2

Еще один сценарий использования защиты ОЗУ только от случайных бит-клипов. Мы используем эту модель на нашем маленьком кубе, потому что на главной плате компьютера есть ECC-таран, который выдерживает бит-флип из-за излучения. Вся ОС загружается в оперативную память, поскольку виртуальный диск при запуске полностью запускается в среде ECC.

Флэш-память не защищена ECC (стандартно в комплекте с картами micro SD), однако у нас есть другие способы проверки на наличие повреждений (несколько изображений, контрольные суммы и т. Д.)

Техас Кале
источник
Я бы предположил, что что-то вроде EEPROM или вспышки было бы намного «труднее» отразить излучением, то есть потребовать больше энергии.
труба
На самом деле это так, но поскольку мы просто используем стандартную вспышку без специальных функций ECC, для этой цели гораздо лучше использовать ram.
Техас Кале