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)