2016-12-08 17 views
1

Итак, из того, что я прочитал, SRAM является изменчивым, а EEPROM нестабильна. Если SRAM нестабилен, то почему я иногда получаю значения (случайные и мусорные, но все же значения), когда я использую * ptr.ATmega32 Разница в SRAM и EEPROM

Например, для ptr = & x, * ptr может дать мне значение. Должен ли я получить NULL, потому что он неустойчив и SRAM уничтожается каждый раз, когда питание выключено?

+0

SRAM и EEPROM относятся к конкретным технологиям памяти, но этот вопрос относится ко всем технологиям памяти, которые могут быть в целом разделены на изменчивые и энергонезависимые. – Clifford

ответ

4

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

Таким образом, вам нужно будет инициализировать RAM до нуля вручную, если это необходимо.

Стандарт C фактически предусматривает, что такая инициализация выполняется для всех переменных со статической продолжительностью хранения, но только для них. Эта инициализация «нулевого выхода» выполняется некоторой прошивкой до выполнения main(). Но локальные переменные C никогда не будут автоматически инициализированы.

Обратите внимание, что ключевое слово volatile в C имеет мало общего с изменчивыми воспоминаниями. Не путайте эти два разных термина.

0

Нет. Вы смешиваете контексты. Одна вещь - волатильность памяти, это касается физической конструкции памяти. Другой - ваш код, читающий случайный адрес памяти.

Иногда аппаратные средства могут стереть SRAM при включении питания, иногда нет, вы не можете рассчитывать на это.

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