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