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

Резисторы, транзисторы, конденсаторы, микросборки, чип компоненты ...
Вопросы согласования управляющих модулей с периферией.

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

Сообщение blindman » 27 май 2011, 10:46

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

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

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

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

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

А вот со второй проблемой не могу придумать. Хранить две копии счетчика? Вроде ничем не поможет, как определять какая из копий верная? Есть у кого-нибудь мысли по этому поводу?
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение =DeaD= » 27 май 2011, 10:50

Две копии счетчика, в каждой CRC + номер версии, правильной считается та, которая с правильным CRC и большим номером.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение blindman » 27 май 2011, 12:29

Спасибо, попробую. Копии для надежности по разным страницам раскидаю
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение blindman » 27 май 2011, 16:46

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

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

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

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

Все правильно?
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение =DeaD= » 27 май 2011, 18:13

В целом да, всё так, но не понял, что за "ошибка на этапе подтверждения записи".
И вроде нет нужды, если операция успешна, писать во второй счетчик.
При следующем чтении второй счетчик и так будет проигнорирован, т.к. он тоже правильный и там меньшее значение.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение blindman » 27 май 2011, 18:44

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


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

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

Согласен
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич


Вернуться в Электроника, электротехника

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 25