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


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

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


13
Выполнение кода из ОЗУ потребляет меньше тока (я не уверен, верно ли это для всех CPU / SoC). Однажды я сделал проект, в котором мы поместили большую часть кода в оперативную память, потому что это было аккумуляторное устройство, и мы хотели, чтобы он работал как можно дольше. Если вы можете выполнять код только из ОЗУ, вы даже можете отключить блоки флэш-памяти на некоторых SoC и сэкономить еще больше энергии.
— Аль Банди

4
@pipe. Я полагаю, что причина для того, чтобы сделать это комментарием, а не ответом, заключается в том, что он не отвечает на реальный вопрос, поэтому вам не хотелось бы всегда использовать ОЗУ для выполнения вашего кода.
— Жюль

1
@Jules Да, я предполагаю, что это подразумевается как «полезный анекдот». Вещи Stack Exchange предназначены для предотвращения по очень веским причинам.
— труба

1
Потому что у вас недостаточно регистров для выполнения из регистра. (У меня есть этот чип.)
— Джошуа

В дополнение ко всему: выполнение кода из динамического ОЗУ, в частности, может быть частью сложного программного взлома для обновления DRAM. :)
— Kaz

Ответы:


32

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


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 по мере необходимости.

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


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

4

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

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

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

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


4

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

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

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


2

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

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


Я бы предположил, что что-то вроде EEPROM или вспышки было бы намного «труднее» отразить излучением, то есть потребовать больше энергии.
— труба

На самом деле это так, но поскольку мы просто используем стандартную вспышку без специальных функций ECC, для этой цели гораздо лучше использовать ram.
— Техас Кале
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.