ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
6 июля
170904
Evgeny_CD, Архитектор (01.11.2009 12:26, просмотров: 14713)
Файловая система для логгинга, или двумерные двоичные деревья. Пусть нам надо записывать в лог следующее: * время наступления события * идентификатор события * некие данные события - последовательность байт от 0 до 1к, например Частота наступления событий неизвестна и нестанционарна. Распределение длин "данных события" - тоже неизвестно. Решение, на первый взгляд, простое. Строим двунаправленный связный список из блоков под размер сектора (или кластера) FLASH носителя. Внутри блока - элементарные записи: время, код события и пр. (есть некоторая "неэлементарность", вызванная переменными данными собятия, но это уже частности). Если нам надо найти, что проиходило за какое-то время - тупо лазим взад-вперед по списку и ищем блок(и) с нашим временем. Но бывает, надо найти, когда последний раз было то или иное событие. Сделать выбору по событиям за период и т.д. Реляционная база данных - это рулез, но не для небольшого микроконтроллера. с 256к FLASH и 32к SRAM. Но есть идея.. Проводим группировку событий. Т.е. объединяем некое подмножество событий в группу. Время тоже разбиваем на блоки. Берем несколько секторов, и делам из них master FAT. Там запись простая. Идентификатор блока времни - идентификатор первого сектора с таким временем - переменная, у которой каждый бит отвечает за статус группы событий: было хоть одно событие из группы - ставим бит. Поиск по времени понятен. По событию - перебором ищем блок, в котором было одно событие из группы. Либо в пределах заданного интервала, либо от начала, либо от конца списка. В зависимости от объема разной памяти можно сделать master FAT 2-го уровня и пр. В итоге мы добираемся до небольшой группы секторов на носителе, в которых уже методом перебора находим все нужное. Защита от вырубания питания: определяем, есть ли хвост основного списка, не отображенный в master FAT'ах. Если да, то по нему лазим перебором. master FAT'ы регулярно сбрасываем во FLASH. В итоге получается, что при вырубании питания нам надо продержаться на кондерах 10 мс - пока не завершится запись текущего сектора, что не вызыввает никаких затруднений. Я изобрел давно известное, или это - свежая мысль?