Флэш и EEPROM

В техническом описании Atmega16 указано, что у него есть

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

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

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

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

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

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

Ответы (2)

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

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

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

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

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

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

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

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

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

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

Спасибо за ваш ответ, сэр. Итак, чтобы ввести данные в EEPROM, мне понадобится программатор EEPROM, как в программаторе USBASP, чтобы сбросить программу во флэш-память? Я прав, сэр?
@Jasser Нет, вам не нужен внешний программатор. Вы получите доступ к EEPROM из вашей программы. Внутри ATmega будет набор регистров, которые, записав в них, позволят вам обновить EEPROM. Вам также нужно будет использовать эти регистры для чтения из EEPROM, так как он не будет отображаться в обычной карте адресов. Информация о том, как стирать, записывать и читать EEPROM, будет в даташите на чип.
Поскольку мы можем записывать или читать из EEPROM внутри микроконтроллера, микроконтроллер должен иметь схему для хранения данных внутри EEPROM, и это должно быть похоже на программатор EEPROM. Это снова приводит меня к другому вопросу, что, поскольку EEPROM может быть записан примерно 100 000 раз, после этого мы не сможем хранить данные внутри EEPROM через регистры. Имеют ли смысл эти утверждения? @tcrosley
@Jasser Правильно, существует ограничение на количество обновлений EEPROM. Обычно это намного больше (иногда на порядок больше), чем количество обновлений флэш-памяти. Я должен был упомянуть об этом в своем ответе и обновить его. Указанное вами число является минимальным, гарантированным производителем чипов; Однажды я провел несколько тестов с чипом, который был рассчитан на 100 000 операций записи, и он прошел более 500 000 операций, прежде чем были обнаружены какие-либо ошибки.
Кроме того, если мы храним программу во флэш-памяти, это будет неудобно, потому что она содержит основной программный код, а также данные берутся в виде блоков с флэш-памятью, поэтому извлечение данных из флэш-памяти может стать более сложным, чем отдельное место, которое полностью выделено для данных, т.е. EEPROM. Это причина того, что данные не сохраняются во флэш-памяти. Это верно, сэр?
@Jasser Да, настроить данные во флэш-памяти немного сложнее. Кроме того, как обсуждалось в моем обновлении к моему ответу, вы можете стереть и перепрограммировать EEPROM во много раз (обычно в 10 раз), чем флэш-память.
Большое спасибо за ваше драгоценное время, сэр. Надеюсь, мы еще встретимся @tcrosley.
Утверждение The important difference is that you cannot execute code out of EEPROMневерно. Модули, которые содержат код, который выполняется на месте и хранит первый код для запуска при сбросе (например, BIOS, монитор загрузки и т. д.), часто называют EEPROM. EEPROM был разработан после ПЗУ с маской, PROM и EPROM как способ хранения такого кода.
@Melab Я имел в виду современные микроконтроллеры, которые используют Flash для хранения своих программ и имеют лишь небольшой объем EEPROM, доступный для данных. Да, я знаю, что ранние микропроцессоры использовали EEPROM для хранения программ до того, как Flash стала популярной, после EPROM, стираемых УФ-излучением. Я работал с обоими в течение многих лет в период 1980-х годов. Я поправлю, может ответить.

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

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

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

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

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