Flash и EEPROM

14

Atmega16 Datasheet говорит, что он имеет

а) 16 Кбайт внутрисистемной самопрограммируемой флэш-памяти программ и б) 512 байт EEPROM.

Может ли микроконтроллер иметь два отдельных ПЗУ, которые можно программировать с помощью технологии EEPROM и технологии Flash?

Или мой вывод (как указано выше) из таблицы неверен?

Я знаю, что наша программа хранится во флэш-памяти, а зачем кому-то нужна EEPROM? Какой смысл использовать флэш-память для программы?

Также любой может объяснить, что такое термин «внутрисистемный самопрограммируемый»

Что я знаю: технология Flash может записывать программу в блоки данных, тогда как EEPROM может записывать данные побайтно.

Jasser
источник

Ответы:

21

В настоящее время флэш-память используется для хранения программного кода, а EEPROM (электрически стираемая постоянная память) используется для хранения постоянных данных. Еще около 30 лет назад, до появления Flash, EEPROM использовались для хранения программного кода.

На самом деле сначала было ROM (постоянное запоминающее устройство), затем PROM (программируемое ROM, только один раз), EPROM (PROM, стираемое ультрафиолетовым излучением), EEPROM и, наконец, Flash. ПЗУ по-прежнему используются для очень больших и недорогих приложений (например, говорящих поздравительных открыток).

Важное отличие от современных микроконтроллеров состоит в том, что вы, как правило, не можете выполнять код из EEPROM, и для программ неудобно хранить данные во флэш-памяти. (Данные хранятся во флэш-памяти, когда, например, вы используете ключевое слово «const» в объявлении данных или определяете строку, но это обрабатывается за кулисами компилятором и компоновщиком.)

Область EEPROM может использоваться для хранения конфигурации или других данных, которые вы хотите получить при перезагрузке, в том числе, если микроконтроллер потерял питание, а затем снова включился. Функционально вы можете думать о EEPROM как о очень маленьком жестком диске или SD-карте.

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

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

Чтобы запрограммировать флэш-память или EEPROM, сначала необходимо удалить блок памяти. Тогда это запрограммировано. Для флэш-записи, как правило, запись также выполняется за один раз. Для EEPROM это может быть сделано блоками или байтами за раз, в зависимости от микроконтроллера.

Как для флэш-памяти, так и для EEPROM, вы можете обновить их максимальное количество раз, прежде чем изнашивать память. Этот номер указан в техническом описании как минимальное гарантированное значение. Это обычно намного выше для EEPROM, чем для флэш-памяти. Для флеш-памяти я видел цифры до 1000. Для EEPROM я видел цифры до 1 000 000.

Одним из преимуществ EEPROM перед флэш-памятью является то, что вы можете стирать их намного чаще, чем вы можете стирать флэш-память.

«Самопрограммируемый в системе» означает, что микроконтроллер может обновлять собственную флэш-память во время работы. Эта функция обычно используется для обновления кода в поле. Хитрость заключается в том, что вам нужно оставить некоторый код в системе во время обновления основной программы, называемой загрузчиком. Эта схема используется в системе Arduino для программирования чипа.

tcrosley
источник
Спасибо за ваш ответ, сэр. Итак, для ввода данных в EEPROM мне понадобится программист EEPROM, как в программаторе USBASP для выгрузки программы во флэш-память? Я прав, сэр.
Jasser
1
@ Jasser Нет, вам не нужен внешний программист. Вы получите доступ к EEPROM из вашей программы. Внутри ATmega будет набор регистров, который, записывая их, позволит вам обновить EEPROM. Вам также нужно будет использовать эти регистры для чтения из EEPROM, так как он не будет отображаться в обычной карте адресов. Информация о том, как стереть, записать и прочитать EEPROM, будет в техническом описании для чипа.
tcrosley
Поскольку мы можем записывать или читать из EEPROM внутри микроконтроллера, микроконтроллер должен иметь схему для хранения данных внутри EEPROM, и это должно быть похоже на программист EEPROM. Это снова приводит меня к другому вопросу, что, поскольку ЭСППЗУ может быть перезаписано примерно 100 000 раз, то после этого мы не сможем хранить данные внутри ЭСППЗУ через регистры. Значимы ли эти утверждения? @tcrosley
Jasser
1
@Jasser Правильно, количество обновлений EEPROM ограничено. Это обычно намного выше (иногда на порядок больше), чем количество раз, когда вы можете обновить флэш-память. Я должен был упомянуть это в своем ответе и обновлю его. Указанный вами номер является минимумом, гарантированным производителем чипа; Однажды я провел несколько тестов с чипом, рассчитанным на 100 000 операций записи, и он прошел более 500 000, прежде чем были обнаружены какие-либо ошибки.
tcrosley
1
@ Jasser Да, немного сложнее настроить данные во флэш-памяти. Кроме того, как обсуждалось в моем обновлении к моему ответу, вы можете стирать и перепрограммировать EEPROM во много раз больше (обычно в 10 раз), чем флэш-память.
tcrosley
4

Я добавлю еще немного информации к отличному ответу @tcrosley.

ATmega16 реализует архитектуру Гарварда , то есть топологию системы, в которой память данных отделена от памяти программ. Цитирую соответствующий абзац из таблицы данных Atmega16 (стр. 8):

Чтобы максимизировать производительность и параллелизм, AVR использует архитектуру Гарварда - с отдельной памятью и шинами для программ и данных. Инструкции в памяти программ выполняются с помощью одного уровня конвейерной обработки. Во время выполнения одной инструкции следующая инструкция предварительно извлекается из памяти программ. Эта концепция позволяет выполнять инструкции в каждом тактовом цикле. Память программы - внутрисистемная перепрограммируемая флэш-память.

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

Поэтому флэш-память используется в качестве памяти программ, тогда как память данных разделяется между SRAM (для временных данных, таких как стек вызовов функций и куча - если вы программируете на C, например), и EEPROM (для постоянного хранения) ,

Лоренцо Донати поддерживает Монику
источник