Стек истории аварий или очередь? - PullRequest
5 голосов
/ 18 ноября 2009

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

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

Размер структуры, голова, хвост, индексы не могут быть сохранены, если они не сохранены в самой записи, поскольку, если бы они записывались каждый раз в фиксированное место, это превысило бы максимальные циклы записи на странице, где они были сохранены.

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

Ответы [ 6 ]

5 голосов
/ 18 ноября 2009

См. Связанный вопрос Круговой буфер во Flash .

4 голосов
/ 18 ноября 2009

Поиск кольцевой буфер

Предполагая, что вы можете определить, какая запись является последней (из отметки времени и т. Д., Поэтому не нужно писать маркер), это также дает наилучшую эффективность выравнивания износа.

2 голосов
/ 18 ноября 2009

Редактировать: Не относится к контроллеру вспышки OP: Вам не нужно беспокоиться о выравнивании износа в вашем коде. Контроллер флэш-памяти должен справиться с этим за кулисами.

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

Вы также можете рассмотреть возможность использования Наименее недавно использованного кэша для управления местом хранения данных на флэш-памяти.

0 голосов
/ 18 ноября 2009

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

0 голосов
/ 18 ноября 2009

Карта ваших записей на несколько разделов. Когда разделы заполнены, перезапишите, начиная с первого раздела. Добавьте порядковый номер (порядковые номера nbr> 2 * записей), чтобы при перезагрузке вы знали, что является первой записью.

0 голосов
/ 18 ноября 2009

Вы определенно хотите кольцевой буфер. Но вы правы, мета-информация немного ... интересна.

...