Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Посоветуте как управлять логом в датафлеши
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
vesago
К меге 128 подключена датафлеш, куда с GPS приемника надо класть принятые данные. Потом по запросу выдавать их хосту. Запрос - данные с такого-то по такое-то с определенной дискретностью. Поделитесь мыслями если у кого был успешный опыт. Не могу придумать как так данные хитрос кладывать и осуществлять поиск и выборку. Писать думаю по кольцу. Записи постоянной длинны. Дату и время буду хранить в лонге. Единственное что приходит на ум - метод половинного деления. Но может как-то можно отимальнее решить проблему? Допустим делал СКУД на большое число юзеров. Там решил проблему поиска ключя применением хэширования. Здесь чего-то подобного не приходит на ум.
beer_warrior
Делал постраничную запись. В начале каждого блока заголовок с датой, номером записи, различными атрибутами. В конце обязательно CRC (запись может сбойнуть). Потом сканил заголовки, с соответствующей фильтрацией. В принципе, если ресурсы позволяют сделать в ОЗУ таблицу заголовков, на старте их вычитать, а потом извлекать из нее номер требуемого блока. Хэширование на мой взгляд заметно усложнит процедуры поиска по различным критериям (например по времени).Делать подобие FAT в первых страницах на мой взгяд чревато - их ресурс исчерпаеться намного раньше остальных.
vesago
То есть я правильно понял, что в начале каждой страницы идет дата время? Таким образом надо, чтобы запись была выравнена. Спасибо, хорошая мысль. То есть сначала находим страницу, а потом по ней методом половинного деления допустим. Как раз у датафлеши страница чуть больше 512 байт. И в остаток в начале или в конце можно запихнуть подобную инфу. Еще у меня есть на борту fm31256 c 32к фрам, где можно эти данные хранить, но это наверное медленне будет.
rezident
Насколько я помню, DataFlash имеет функцию, которая позволяет читать любое количество данных с любого адреса. Привязка (точнее фрагментирование) на страницы нужна лишь при записи данных. Так что при чтении не нужно именно страницы искать. Если дата лежит в начале записи и каждая запись одинакового размера, то достаточно установить указатель на начало первой записи. Потом прибавляя смещение (равное размеру записи), "пробежать" по всей памяти DataFlash, сравнивая заголовки с датой.
Семён
Если еще есть возможность изменить конструкцию посмотри в сторну памяти работающею по SPI интерфейсу. Конечно дороже, но и скорость работы с ней значительно выше.
beer_warrior
Код
//--------------------------------------------------------------------------
typedef struct  
        {
        WORD                  size
        BYTE                    rec_type;    
        WORD                  net_adr;    
        DeviceType_e    dev_type;    
        SysTime        st;            
        WORD        crc;
        } LogHeader_s;      //13
//--------------------------------------------------------------------------


Это заголвок для данных получаемых с разнородных устройств.
Поиск можно делать по времени, типу источника данных, его сетевому адресу, типу записи (текущие, накпленные, кофигурационные даные, сообщения об ошибках). Удобнее писать в начало каждой новой страницы, тогда просто начинаете с 0 со смещением в размер страницы. Легко писать, но будет присутствовать фрагментация.
Можете укладывать одну за другой со смещением в size, но тогда нужно будет все время переводить абсолютный адрес в страничный.
А это достаточно морочливо и может стать источником глюков, особенно если лог закольцован.
AndyBig
Поиск по времени вообще должен быть без проблем. Записи-то вносятся с определенной дискретностью? Прочли первую запись, вычислили разницу в записях между временем первой и требуемой записями, перешли на запись с результирующим номером.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.