Флэш-память типа Boot Block служит для хранения обновляемых программ и данных в самых разных системах, включая сотовые телефоны, модемы, BIOS, системы управления автомобильными двигателями и многое другое. Используя флэш-память вместо EEPROM для хранения параметрических данных, разработчики добиваются снижения стоимости и повышения надежности своих систем.
Например, в разработках сотовых телефонов параметрические блоки флэш-памяти используются для хранения телефонных номеров, учета времени использования и идентификатора пользователя (SIM-карта). Производители автомобилей используют параметрические блоки флэш-памяти в системах управления двигателями для хранения кодов ошибок и параметров оптимальных режимов работы. В каждом из подобных примеров изготовители экономят как на ненужной микросхеме EEPROM, так и на расходах, связанных с необходимостью содержания складского запаса "прошитых" разными программами EEPROM, используя флэш-память Boot Block Flash Memory не только для хранения прикладных программ, но и параметров. Загрузка кода в чистую память может производиться в составе готовой системы на финальной стадии изготовления изделия. Кроме того, за счет снижения числа комплектующих и внешних контактов достигается более высокая надежность автомобильных систем в целом. И, наконец, повышается объем хранимых параметров и частота их изменения.
В настоящей статье обсуждается структура связных списков для хранения параметров в блочной флэш-памяти с применением схемы, эмулирующей перезапись байтов. Обзор основ флэш-памяти приводится для пояснения того, как используется флэш-память в системе, и описывает ограничения на реализацию схемы программирования. Основное внимание уделено передовой, в настоящий момент, технологии — SmartVoltage.
Основы технологии
Флэш-технология позволяет оснастить системную память уникальными свойствами. Подобно ОЗУ, флэш-память модифицируется электрически внутрисистемно, но подобно ПЗУ, флэш энергонезависима и хранит данные даже после отключения питания. Однако, в отличие от ОЗУ, флэш нельзя переписывать побайтно. Флэш-память читается и записывается байт за байтом и предъявляет новое требование: ее нужно стереть перед тем, как записывать новые данные.
Операции над флэш-памятью | |||
Операция | Минимальный сегмент | Типичное время | Максимальное время |
Чтение | Byte | 60 нс | 60 нс |
Запись | Byte | 9 мкс | не более 100 мкс |
Стирание | 8KB-Block | 0.6 с | 4.3 с |
Примечание: | по спецификации на ИС SmartVoltage 4Мbit Boot Block в 8-bit режиме при VCC=5.0V и VPP=5.0V |
Запись (программирование) флэш-памяти — это процесс замены "1" на "0". Стирание — это процесс замены "0" на "1", где флэш стирается блок за блоком. Блоки — это области с фиксированными адресами, как показано на карте 4Мbit Boot Block микросхемы.
Карта памяти Boot Block | |||
| 16KByte BOOT BLOCK | ||
| 8KByte PARAMETER BLOCK | ||
| 8KByte PARAMETER BLOCK | ||
| 96KByte PARAMETER BLOCK | ||
| 128KByte MAIN BLOCK | ||
| 128KByte MAIN BLOCK | ||
| 128KByte MAIN BLOCK |
Когда блок стирается, стираются параллельно все ячейки внутри блока, независимо от других блоков этого прибора флэш-памяти.
Микросхемы Flash Memory Boot Block должны выдерживать не менее 100 тысяч циклов стирания при напряжении питания VCC=5V. Цикл считается законченным, если 8КВ одного из параметрических блоков успешно запрограммировано и после этого стерто. Этот параметр очень важный, так как от него зависит то, какой объем данных можно хранить и как часто их можно обновлять.
Поскольку флэш-память не допускает перезаписи отдельной ячейки без предварительного стирания всего блока памяти, то применяются программные методы эмуляции перезаписи байта с использованием двух 8КВ параметрических блоков, показанных на примере карты памяти.
Функционирование в системе
Кроме хранения параметрических данных, блочную флэш-память часто используют под хранение сменного кода программ. Часто в системах в заблокированном Boot-блоке хранится ядро кода, необходимого для инициализации системы и загрузки подпрограммы восстановления, на случай разрушения программы. В "бутовом" блоке обычно хранится также программа для программирования и стирания флэш-памяти. Так, флэш-память не допускает одновременное чтение ячейки с одним адресом и запись в ячейку с другим адресом в пределах одной микросхемы. Это означает, что любой код программы записи во флэш должен перегружаться в ОЗУ.
Воспользовавшись двумя параметрическими блоками флэш-памяти и программными методами, можно сохранять данные побайтно, а операцию стирания выполнять как фоновую задачу. Тем самым добиваются эмуляции перезаписи содержимого на байтной основе — схема программирования для эмуляции побайтной замены.
Структура параметрических данных
Структура данных в форме связных списков обеспечивает организацию данных, очень удобную для флэш-памяти. Например, предположим, что нужно сохранить 3 параметра, которые будут изменяться при условии, что каждый параметр хранится в виде записи. Каждая запись состоит из двух полей: Parameter_Value и Next_Record. В первом поле хранится значение параметра. Второе поле — это указатель, содержащий адрес следующей записи для этого параметра. ParameterX — это переменный указатель, содержащий адрес первой записи для этого параметра, поэтому Parameter1 представляет адрес. В ячейке с этим адресом хранится адрес первой записи параметра Parameter1, которая содержит первое значение Parameter1 и адрес второй записи Parameter1. Вторая запись содержит последнее значение этого параметра и адрес третьей записи, и т.д.. В последней записи в поле Next_Record содержится код FFh, указание на то, что записей больше нет. Код FFh выбран для указания, что записей больше нет, из-за того, что именно этот код представляет собой значение стертого байта флэш-памяти по умолчанию. При каждом изменении параметров программа ищет первую доступную ячейку в параметрическом блоке, записывает новое значение в поле значения новой записи, а потом обновляет поле Next_Record в предыдущей записи. Итак, каждая запись содержит значение и указатель, или связь со следующей записью. Такие структуры данных хорошо известны программистам, и называются связными списками, пользуясь которыми система может быстро найти последнее значение данного параметра.
Пример структуры связного списка | ||
Адрес | Значение | Параметр |
Parameter1 | 01H | Parameter 1 Pointer Variable |
Parameter2 | 03H | Parameter 2 Pointer Variable |
Parameter3 | 05H | Parameter 3 Pointer Variable |
01H | F8H | Parameter 1 Value = F8H |
02H | 07H | Parameter 1 Next_Record = 07H |
03H | 22H | Parameter 2 Value = 22H |
04H | 09H | Parameter 2 Next_Record = 09H |
05H | 44H | Parameter 3 Value = 44H |
06H | FFH | Parameter 3 Next_Record = FFH = latest |
07H | 55H | Parameter 1 Value = 55H |
08H | 0BH | Parameter 1 Next_Record = 0BH |
09H | F2H | Parameter 2 Value = F2H |
0AH | FFH | Parameter 2 Next_Record = FFH = latest |
0BH | F4H | Parameter 1 Value = F4H |
0CH | FFH | Parameter 1 Next_Record = FFH = latest |
Для простоты в примере использовано однобайтное поле для Parameter_Value и Next_Record. В действительности, для кодирования поля Next_Record потребуется как минимум два байта указателя на другую ячейку параметрического блока. Количество байтов, необходимых для кодирования поля Parameter_Value, зависит от специфики информации, хранимой в этом параметре.
Альтернативный подход к использованию связного списка состоит в применении поля parameter ID и поля статуса параметра, которое указывает, является ли текущая запись параметра самой поздней. В альтернативной схеме для того, чтобы получить последнее значение параметра, система считывает каждый параметр до тех пор, пока не найдет последнее значение данного параметра.
Запоминание параметров продолжается до тех пор, пока параметрический блок не заполнится или пока в параметрическом блоке хватает места для целой следующей записи. По достижении этой точки последние значения каждого параметра передаются во второй параметрический блок, а связный список продолжает формироваться во втором блоке параметров. Запись заголовка (Block_Header) в начале каждого параметрического блока показывает состояние блока. Состояние — это информация, например, о том, что параметрический блок активен, т.е. либо передает данные, либо стирается. Таким образом и осуществляются блочные передачи.
Стирание параметрического блока
После передачи действительных значений параметров из первого блока во второй, первый блок стирается. Вспомним, что стирание флэш-памяти занимает примерно 0,5s на каждый параметрический блок. Поскольку так много времени во время работы системы может не оказаться, во флэш-памяти используется команда приостановки стирания (Erase Suspend). По этой команде операцию стирания можно приостановить, чтобы система смогла считать данные из другого блока данного прибора памяти. Когда команда Erase Suspend поступает в микросхему, операция стирания останавливается, а память входит в "подвешенное" состояние, и тогда можно прочесть данные из другого блока. Когда снова будет можно стирать, команда Erase Resume прикажет прибору продолжить стирание с того места, где оно было прервано, что позволяет реализовать операцию стирания в пределах конечного программного цикла, используя несколько вызовов (Call). После полного стирания первого блока он снова готов к записи параметров, когда заполнится второй блок. Важно то, что никакие новые параметры нельзя записать, пока не закончится операция стирания блока. Текущие версии флэш-памяти Boot Block не допускают запись в моменты, когда стирание приостановлено.
Эмуляция побайтного обновления | |||||||||||
Ступень 1. Резервирование параметрических записей в параметрическом блоке 1 (Parameter Block 1) | |||||||||||
|
| ||||||||||
Ступень 2. Когда Parameter Block 1 заполнен, осуществляется передача последнего параметра записи в Parameter Block 2 и изменение block_status record. | |||||||||||
|
| ||||||||||
Ступень 3. Резервирование параметра записи в Parameter Block 2. Стирание Parameter Block 1, используя команду приостановки стирания (Erase Suspend) для возврата в фазу чтения флэша, когда это необходимо. | |||||||||||
|
|
Требования к системе
Как отмечено выше, для исполнения программы в моменты программирования и стирания флэш-памяти требуется ОЗУ. Необходимый объем ОЗУ зависит от сложности базы данных параметров. Программа, которая должна быть загружена в ОЗУ, включает подпрограммы чтения, записи и стирания флэш-памяти. Размер ее кода лежит в диапазоне от 512 байт до одного килобайта. Кроме того, для хранения этой программы потребуется место внутри самой флэш-памяти. Образец программы занимает около 15KB, но только небольшая ее часть (около 1KB) выгружается в ОЗУ.
Другое системное требование — адекватное напряжение программирования (VPP) для записи и стирания. Большинство современных микросхем флэш-памяти требует подачи 12V для внутрисистемной записи и стирания. Например, микросхемы семейства SmartVoltage позволяют использовать напряжение 5 В для операций записи и стирания, если источник 12 В в системе отсутствует.
Кроме 12V и 5V SmartVoltage стандартов существует технология 3.3 В SmartVoltage — микросхемы Flash-памяти емкостью 4 Mбит, имеющие архитектуру Boot Block. Эти микросхемы дополняют существующий ряд и позволяют разработчикам оптимизировать производительность и энергопотребление запоминающих устройств, пользуясь только одним типом памяти. SmartVoltage — технология, соединяющая в себе свойства низкой потребляемой мощности, самого быстрого программирования и единственного напряжения питания в одном приборе. Архитектура Boot Block позволяет совместить функции ROM, Flash или EPROM и EEPROM памяти в одной микросхеме.
Данная память позволяет эффективно удовлетворить противоречивые требования к разработке изделия, используя напряжения программирования VPP уровней 5 В или 12 В, и VCC со значениями 3.3 В или 5 В в любой комбинации. Это позволяет оптимизировать время записи, выбирая напряжение VPP=l2 В, или цену устройства, выбрав единственное напряжение питания VСС=VPP=5 В. Данное семейство имеет самое низкое потребление энергии без потерь производительности. При потреблении 150 мВт на 6 Mгц, 3V-read режим на 40% более эффективен, чем 5V-only. Дополнительно, SmartVoltage Flash в 3V-read режиме обеспечивает доступ за 110 нс, что вдвое быстрее, чем лучшие 3V-EEPROM. Теперь же еще микросхемы имеют реконфигурируемую шину данных, поэтому их можно применять как с 16bit, так и с 8bit микропроцессорами.
Так, если соединить выводы VPP и VCC, то память предлагает самую высокую производительность при единственном напряжении питания. При питании от 5 В SmartVortage обеспечивает чтение данных за 60 нс, и запись за 13 мкс, что превосходит те же параметры у сопоставимых 5V-only изделий другой технологии. Кроме этого, 3.3 В SmartVoltage позволяет переходить от режима с единственным напряжением питания к более гибкому режиму 3V-read/5V-write в портативной аппаратуре без дополнительных затрат на сертификацию Flash-микросхем. Для максимальной скорости программирования в процессе производства, приборы SmartVoltage могу быть запрограммированы при VPP=12 В, что вдвое сокращает время записи и снижает затраты при изготовлении больших партий аппаратуры.
Так, "новые" микросхемы выпускаются в 44-выводных пластиковых корпусах (PSOP — Plastic Small Outline Package) и 48-выводных корпусах с уменьшенной толщиной (TSOP — Thin Small Outline Package), и имеют разводку выводов в соответствии со стандартом JEDEC, что позволяет разрабатывать платы, на которые можно установить микросхемы 2-8 Mбит. В настоящее время доступны микросхемы с типами упаковки, начиная "обычным" пластиковым вариантом двухстороннего расположения выводов (PDIP — Plastic Dual In-line Package) и заканчивая современным "масштабируемым" вариантом (SCP — Chip Scale Package), комбинируя для разных ситуаций степень упаковки, расстояние между выводами, габаритные размеры и, наконец, условия эксплуатации. Эти микросхемы имеют ту же проверенную длительной эксплуатацией технологию запоминающих матриц на транзисторах с плавающим затвором (технология ЕТОХ IV — EPROM Tunnel OXide), и поэтому имеют те же характеристики надежности и времени жизни, как и другие микросхемы Flash-памяти. Они предназначены для широкого круга применений, включая BIOS, сотовые телефоны, приводы жестких дисков, point-of-sale терминалы, а также блоки управления двигателем и другими автомобильными системами.
Интересным моментом является вопрос пропадания питания во время стирания или в процессе обновления значений параметров. С ситуацией исчезновения питания можно надежно справиться, добавив дополнительные поля как к параметрическим, так и к блочным записям. Например, в дополнение к полям Parameter_Value и Next_Record, которые ввели для параметрической записи, можно установить поле статуса (Parameter_Status). Один бит поля состояния указывает, что обновление параметра началось, а другой бит — что обновление параметра завершилось. Таким образом, если питание исчезнет в процессе модификации параметра, то когда питание восстановится, можно узнать состояние каждого параметра. К примеру, если питание появилось, и видно по битам состояния, что обновление параметра начато, но не закончено, то отсюда следует, что запись испорчена и должна быть исправлена. Эту же концепцию можно применить в отношении записи Block_Status, чтобы обрабатывать ошибки при стирании, вследствие прерывания процесса стирания из-за отказа питания, либо из-за пересылки параметров между блоками.
В процессе инициализации определяется состояние параметрических блоков. Считав запись Block_Status, можно установить, какой блок активен и нужно ли стирать какой-нибудь другой блок. В момент первой инициализации параметрические блоки можно стереть и сформировать для них записи Block_Status.
Ранее обсуждалось, как читать и программировать флэш-память на побайтной основе. Флэш-память, в действительности, допускает программирование на уровне битов (или группы битов) за один раз. Надо помнить, что программирование флэш-памяти — это процесс замены логических "1" на "0". Одиночные биты можно запрограммировать путем маскирования остальных битов в байте или слове "единицами". Пользуясь такой удобной особенностью, можно минимизировать затраты памяти, отводимой под разные поля состояния.
Пример 1 |
|
| ||||||
Пример 2 |
|
| ||||||
Пример 3 |
|
|
Временная диаграмма работы
Динамический анализ работы системы необходим, чтобы определить длительность времени, необходимого для чтения параметров, выгрузки кода программы Write/Erase в ОЗУ, записи параметров, передачи параметров в новый блок и стирания параметрического блока.
Точные значения временных параметров зависят от особенностей реализации системы. Кроме задержек самого прибора, нужно также учитывать программные задержки.
Время, необходимое для чтения параметров, зависит от длины записи каждого параметра и количества параметров, которые придется считать, прежде чем будет найдена действительная запись этого параметра. Умножив число байтов или слов на длительность цикла чтения системы, можно рассчитать общее время чтения действительного параметра.
При выполнении каждой операции записи или стирания (Write/Erase) флэш-памяти, нужно перегрузить из нее в ОЗУ код программы, содержащий драйверы программирования и стирания. Время, необходимое для этой перегрузки кода в ОЗУ, зависит от объема кода (обычно 1 Kбайт или меньше). Умножив размер кода на длительность цикла записи, определим длительность загрузки кода в ОЗУ.
Для определения максимального времени, требующегося для записи параметра, необходимо воспользоваться временем записи слова или байта для наихудшего случая, приведенным в спецификации на ИС флэш-памяти. Умножив максимальное время записи слова на количество слов в записи параметра, можно узнать наихудшее время записи параметра.
Понятно, что время передачи действительных параметров из одного блока (параметрического) в другой зависит от количества хранимых параметров. Если эта операция выполняется как задача переднего плана, то на нее потребуется блок времени, состоящий из времени чтения действительных параметров и времени записи этих параметров в новый блок. Эту операцию можно также рассматривать как часто выполняемую фоновую задачу. Для тех применений, где известна длительность выполнения основного программного цикла, операция передачи может выполняться исходя из наличного времени в пределах программного цикла, когда передача параметров начинается, а затем приостанавливается в моменты, когда время основного цикла подходит к концу. Может потребоваться несколько основных циклов для полной передачи всех параметров в новый блок флэш-памяти. Общее время выполнения задачи будет зависеть от ресурса времени, доступного в каждом цикле и от количества вызовов цикла, необходимого для завершения операции.
Как и в случае передачи параметров, стирание блока можно рассматривать как задачу переднего плана или как фоновую. В случае фоновой задачи, общее время стирания зависит от величины временного "окна" в рамках программного цикла. Число необходимых вызовов определяется путем деления общего времени стирания на длительность времени, доступного в пределах каждого цикла. Умножив число вызовов цикла на длительность цикла, получим полное время стирания параметрического блока.
Так, для микросхем флэш-памяти типа Boot Block в спецификации гарантируется не менее 100 тысяч циклов стирания. Как это влияет на хранение параметров (цикличность), легко рассчитать, воспользовавшись выражением:
100000 Cycles=[8KB-(Block_Record size)/Parameter_Record size]*number of Parameter_Record
Это уравнение можно решить как для искомого числа записей параметров, так и для длины поля Parameter_Record, в зависимости от того, что известно. По сравнению с EEPROM устойчивость флэш-памяти к ре-программированию значительно выше.
Заключение
В настоящей статье были описаны основные моменты программных методов эмуляции побайтовой работы с использованием двух параметрических блоков флэш-памяти. Разработчики систем, используя для хранения параметров вместо EEPROM параметрические блоки микросхем Boot Block, могут снизить стоимость и повысить надежность своих систем. Так, уже давно осознали преимущества перехода от микросхем, стираемых целиком, к приборам, основанным на блочной архитектуре. Флэш-память типа Bulk Erase, изготавливаемая по устаревшей технологии, перестала модернизироваться и уже давно вытеснена более современными семействами.