Я только что натолкнулся на несколько макросов для моего компилятора микроконтроллера, чтобы заставить (или предложить) функцию выполняться из ОЗУ.
http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM
https://community.nxp.com/thread/389099
В каких случаях это ценно? Почему бы мне просто не всегда выполнять из ОЗУ, если выгода только в увеличении скорости? Это обычно вызывает более высокое потребление тока?
microcontroller
ram
tarabyte
источник
источник
Ответы:
В дополнение к скорости и другим функциям, о которых уже упоминали другие, выполнение кода из ОЗУ может быть полезно в загрузчиках, где вам необходимо перепрограммировать флэш-память вашего микро - вы не можете выполнить код из флэш-памяти, который вы сейчас стираете перепрограммирования.
источник
Я не смотрел на таблицу для этого микро. Однако в этой ситуации часто случается, что выборка из ОЗУ происходит быстрее, чем выборка из флэш-памяти, из которой реализована память программы.
Преимущество вспышки в том, что большие объемы могут быть относительно дешевыми. Поэтому производители микроконтроллеров иногда помещают много флеш-памяти в микросхему, а затем предоставляют более ограниченное пространство ОЗУ, из которого может выполняться код. Это позволяет копировать критичные по времени подпрограммы в ОЗУ, а затем выполнять их оттуда.
Переключатель компилятора, на который вы ссылаетесь, вероятно, работает с компоновщиком и помечает ту часть флэш-памяти, которая будет скопирована в ОЗУ кодом времени выполнения компилятора, который запускается после сброса. Различные реализации будут отличаться в деталях.
источник
Когда вы хотите выполнить в ОЗУ, потому что это быстрее, это обычно потому, что это ОЗУ на кристалле. Это ограниченный ресурс, который вам, вероятно, понадобится для данных, требующих доступа для чтения / записи.
Использование его для кода, когда у вас уже есть код в ПЗУ / флэш-памяти, означает, что вам нужно X объема флэш-памяти и дополнительный X объема ОЗУ.
Это также требует дополнительного этапа копирования при загрузке или когда вы хотите запустить его, хотя это в основном незначительно.
Традиционно это решается с помощью кеша инструкций, но в микроконтроллере может иметь смысл сохранять общий SRAM, потому что вы не используете микроконтроллер, потому что вам нужна самая быстрая скорость выполнения.
Существует также проблема надежности - код, выполняемый в реальном ПЗУ, трудно изменить с помощью ошибочного кода.
источник
В дополнение ко всем хорошим ответам:
Потому что во встроенной системе обычно у вас нет необходимого объема оперативной памяти. Например, STM32, имеющий 32 КБ или ОЗУ и 512 КБ EEPROM. Чтобы выполнить всю программу в ОЗУ, вам потребуется объем ОЗУ больше, чем ЭСППЗУ.
источник
Другие ответы, по-видимому, мало обсуждали энергопотребление, о котором вы специально спрашивали.
Ответ заключается в том, что это в некоторой степени зависит от микроконтроллера, но часто выполнение из ОЗУ может снизить энергопотребление, поскольку для чтения инструкций из ОЗУ требуется меньше энергии, чем из флэш-памяти.
Типичное использование - запуск функции «сна» с низким энергопотреблением из ОЗУ с отключенной флэш-памятью. Мало того, что уменьшается энергопотребление, но если микроконтроллеру нужно быстро разбудить (например, в ответ на внешнее прерывание), нет задержки, пока флэш-память снова включается.
Некоторые детали, например, некоторые из линейки Atmel SAM, имеют специальную сверхнизкую мощность ОЗУ, которую можно использовать для этой цели. Это позволяет загружать небольшой объем кода в специальную оперативную память, в то время как основная часть доступной оперативной памяти и всех других запоминающих устройств отключается, и микроконтроллер переходит в режим глубокого сна.
источник
Помимо потенциальных преимуществ в скорости, упомянутых другими, код ОЗУ также является динамическим и может быть изменен на лету с помощью некоторого специального кода во FLASH по мере необходимости.
Это может быть так же просто, как изменение нескольких параметров или целые подпрограммы обработчика, загруженные удаленно.
источник
Выполнение кода из оперативной памяти значительно быстрее, чем выполнение из флэш-памяти. Большинство процессоров сильно оптимизированы для максимально быстрого доступа к ОЗУ, и даже самая быстрая флэш-память достигает лишь доли скорости ОЗУ.
Однако имейте в виду, что перемещение кода с флэш-памяти на RAM также требует времени. Если код выполняется только один раз, вам нужно только прочитать его один раз, и, следовательно, вы фактически потеряете время для его копирования в ОЗУ, а не выполняете его напрямую. Если код выполняется время от времени (поэтому копирование его в ОЗУ увеличило бы выполнение во второй раз, когда он вызывается), но система, как правило, бездействует, вы выполняете этот код быстрее, копируя его в ОЗУ, но это никого не волнует, потому что система есть достаточно времени, чтобы потратить.
Таким образом, такая оптимизация стоит только усилий, если код выполняется часто, и вы измерили его в качестве задушевной точки системы.
С другой стороны, ОЗУ должно активно хранить данные, в то время как флэш-память нет, поэтому общее энергопотребление увеличивается, если ОЗУ должна оставаться активной. Это, однако, уместно только в том случае, если в противном случае ОЗУ вообще не используется, но большинство современных систем - так или иначе - уже используют доступное ОЗУ и, следовательно, уже поддерживают его активным.
источник
Есть две очень распространенные причины для выполнения кода из оперативной памяти:
Некоторые микропроцессоры не могут выполняться с флэш-памяти во время программирования флэш-памяти - хотя многие могут делать это, пока код находится в другом блоке, чем пишется во флэш-памяти. Запись во флэш-память может перепрограммировать приложение (случай загрузчика) или когда флэш-память используется для хранения информации о энергонезависимой программе (конфигурация, калибровка и т. Д.)
На многих микропроцессорах ОЗУ намного быстрее, чем флэш. Для этих устройств небольшие оперативные подпрограммы могут выполняться из ОЗУ, хотя обычно объем оперативной памяти меньше, чем у флэш-памяти.
источник
Еще один сценарий использования защиты ОЗУ только от случайных бит-клипов. Мы используем эту модель на нашем маленьком кубе, потому что на главной плате компьютера есть ECC-таран, который выдерживает бит-флип из-за излучения. Вся ОС загружается в оперативную память, поскольку виртуальный диск при запуске полностью запускается в среде ECC.
Флэш-память не защищена ECC (стандартно в комплекте с картами micro SD), однако у нас есть другие способы проверки на наличие повреждений (несколько изображений, контрольные суммы и т. Д.)
источник