roboforum.ru

Технический форум по робототехнике.

Выгрузка данных в ПЗУ iButton

Выгрузка данных в ПЗУ iButton

blindman » 27 май 2011, 10:46

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

  • при выгрузке произошла ошибка, а ПЗУ регистратора очищено (потеря данных)
  • данные были выгружены, но ПЗУ не очищено (повторная выгрузка)

Придумал вот такой алгоритм:
В iButton, в начале, хранится счетчик блоков. Далее следуют блоки данных, в начале каждого - длина блока. Регистратор считывает счетчик, и проходит по имеющимся блокам, вычисляя адрес свободного участка памяти. Начинает писать данные. Если все данные выгружены успешно, регистратор обновляет счетчик блоков. Если запись счетчика успешна - регистратор очищает внутреннее ПЗУ.

Проблем у такого алгоритма две:
  • если запись увеличенного счетчика блоков прошло успешно, но произошла ошибка при чтении подтверждения записи от iButton, получаем дубликат данных - в iButton валидные данные, а регистратор считает, что данные не выгружены
  • Если произошла ошибка при записи счетчика - то это может означать полное повреждение данных в iButton

Первую проблему думаю решить так: перед записью данных, регистратор вычисляет контрольную сумму по своим данным, и записывает ее вместе с блоком данных. Тогда при повторной попытке выгрузки регистратор сможет определить, что этот блок уже был выгружен, и просто очистит свое ПЗУ, без повторной выгрузки.

А вот со второй проблемой не могу придумать. Хранить две копии счетчика? Вроде ничем не поможет, как определять какая из копий верная? Есть у кого-нибудь мысли по этому поводу?

Re: Выгрузка данных в ПЗУ iButton

=DeaD= » 27 май 2011, 10:50

Две копии счетчика, в каждой CRC + номер версии, правильной считается та, которая с правильным CRC и большим номером.

Re: Выгрузка данных в ПЗУ iButton

blindman » 27 май 2011, 12:29

Спасибо, попробую. Копии для надежности по разным страницам раскидаю

Re: Выгрузка данных в ПЗУ iButton

blindman » 27 май 2011, 16:46

Алгоритм обновления счетчиков получился такой:

в начальном состоянии оба счетчика валидны, и содержат одинаковое значение.

Считываем оба счетчика, проверяем CRC. За текущее значение принимаем тот, у которого CRC совпадает, если совпадают оба - берем большее. Увеличиваем на 1, и пишем сначала в тот, у которого была неверная CRC (если обе верные - то в тот, у которого счетчик был меньше). Если запись не удалась, считаем всю операцию неуспешной. Иначе, пишем во второй экземпляр, независимо от результата этой записи операцию считаем успешной. Таким образом, всегда будет как минимум одна копия счетчика с правильным значением, а не мусором.

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

Все правильно?

Re: Выгрузка данных в ПЗУ iButton

=DeaD= » 27 май 2011, 18:13

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

Re: Выгрузка данных в ПЗУ iButton

blindman » 27 май 2011, 18:44

=DeaD= писал(а): что за "ошибка на этапе подтверждения записи"


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

=DeaD= писал(а):И вроде нет нужды, если операция успешна, писать во второй счетчик.

Согласен


Rambler\'s Top100 Mail.ru counter