Re: Безопасная запись данных

From
Andrey Belyaev ()
To
Alexey Wolchansky
Date
2002-08-14T09:17:36Z
Area
RU.ALGORITHMS
From: "Andrey Belyaev" <ols@metacom.ru>


> Есть девайс, дистанционно управляемый по линии связи. При поступлении
> команды на изменение режима работы девайс записывает инфу о режиме
> (несколько байт) в энергонезависимую память EEPROM. Этот процесс длится
> десятки миллисекунд.
>
> В этот момент по питанию/линии связи может пройти  помеха (молния,
> раздолбанный электровоз, переключение 10 КВ на подстанции), которая
> однозначно вызывает перезапуск девайса. При инициализации все параметры
> читаются из того самого EEPROM, и в этой ситуации читается непредсказуемая
> чушь.

В EEPROM выделяются две равноправные области для инфы о режиме +
один байт (или даже бит) - семафор (указатель - с какого грузиться).

Типовая конфигурация - семафор указывает на 1 область.

Запись :
Этап 1. Пришедшие новые данные пишутся во вторую область.
Этап 2. Семафор переключается на вторую область.
Этап 3. Эти же данные копируются в первую область.
Этап 4. Семафор переключается на первую область

При рестарте после сбоя во время записи возможны ситуации :

1 область=старый конфиг, 2 область инвалидна, семафор=1
1 область=старый конфиг, 2 область=новый конфиг, семафор=1
1 область=старый конфиг, 2 область=новый конфиг, семафор=2
1 область инвалидна, 2 область=новый конфиг, семафор=2
1 область=новый конфиг, 2 область=новый конфиг, семафор=2
1 область=новый конфиг, 2 область=новый конфиг, семафор=1

При каждом рестарте нужно проанализировать состояние семафора,
и продолжить прерванный алгоритм записи с того места, где
он прервался. Возможно записывать прийдется не раз (я не знаю
как часто у тебя идут рестарты).

Но в любом случае ситуации
загрузки с битого конфига никогда не будет - ведь семафор всегда
указывает на валидные данные : либо новые, либо старые
(тут уж ничего не поделаешь - не успели записать).

С уважением, Andrey Belyaev.



--- ifmail v.2.15dev5
 * Origin: Golden Telecom (2:5020/400)