Защита от сбоев при записи в EEPROM

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Кто и как реализует защиту от сбоев?

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

При записи - прочитать записанное. Запись с верификацией. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Rumata пишет:

При записи - прочитать записанное. Запись с верификацией. 

а если во время записи девайс перезагрузится?

sadman41
Offline
Зарегистрирован: 19.10.2016

+ CRC

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

мне надо, чтобы в EEPROM однозначно были сохранены правильные данные, чтобы их оттуда взять, с надёжностью 100500 )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Отслеживай, значить, синусоиду перед мостом, и при её прекращении, срочно пиши всё в епром, пока конденсатор держит напряжение выше BOD. Несколько десятков миллисекунд у тебя есть.  Если времени надо больше - ставь литиевую подпорку на время записи, если так критичны данные.  Тут надо выбирать, что важнее. 

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

DetSimen пишет:

Отслеживай, значить, синусоиду перед мостом, и при её прекращении, срочно пиши всё в епром, пока конденсатор держит напряжение выше BOD. Несколько десятков миллисекунд у тебя есть

Да мне кажется можно следить за напряжением и после моста, перед стабилизатором.

Конечно зависит от емкости кондера и потребления устройства.

Но главное BOD, чтобы правильно был настроен. Пока напряжение выше BOD, EEPROM должен писаться корректно.

rkit
Offline
Зарегистрирован: 23.11.2016

ua6em пишет:

мне надо, чтобы в EEPROM однозначно были сохранены правильные данные, чтобы их оттуда взять, с надёжностью 100500 )))

Данные дублируются - пишутся в два слота по очереди. После проверки ставится флаг, указывающий на последнее корректное значение.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

rkit пишет:

ua6em пишет:

мне надо, чтобы в EEPROM однозначно были сохранены правильные данные, чтобы их оттуда взять, с надёжностью 100500 )))

Данные дублируются - пишутся в два слота по очереди. После проверки ставится флаг, указывающий на последнее корректное значение.

+ чек-сумма. Иначе как понять где правильные данные, если они будут отличаться?

rkit
Offline
Зарегистрирован: 23.11.2016

Попробуй прочитать оба предложения.

SAB
Offline
Зарегистрирован: 27.12.2016

Писать с CRC, читать сравнивая. 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

rkit пишет:

Попробуй прочитать оба предложения.

Флаг флагом, а если не успел прочесть? Хотя это всего лишь мысли вслух.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Если питание пропадает при записи никакая сумма или дублирование не поможет. Эти методы пригодны когда память глючная, а если она глючная, то ее нужно менять :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Использую на ESP8266 ватчдог по этому примеру, конфликт с записью в EEPROM, девайс проработал три месяца и вчера впервые его словил, что-то не придумаю как обойти перезагрузку пока идёт запись в EEPROM...

 

unsigned long lwdTime = 0;
unsigned long lwdTimeout = LWD_TIMEOUT;

void ICACHE_RAM_ATTR lwdtcb(void) 
{
  if ((millis() - lwdTime > LWD_TIMEOUT) || (lwdTimeout - lwdTime != LWD_TIMEOUT))
  {
    ESP.restart();  
  }
}

void lwdtFeed(void) {
  lwdTime = millis();
  lwdTimeout = lwdTime + LWD_TIMEOUT;
}

void loop() {
  lwdtFeed();

  ...
// Запись в EEPROM 
// пишем структуру

  eep.flag = 1;  
  eep.number = hash_isok;
  EEPROM.put(0,eep);
  EEPROM.commit();

// если цикл длится более 60 секунд (к примеру), вызывается процедура перезагрузки

}

 

SAB
Offline
Зарегистрирован: 27.12.2016

А где в приведённом коде запись EEprom ? Где схема подключения? Новичков ругаете, а сами нарушаете по полной. :(

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

SAB пишет:

А где в приведённом коде запись EEprom ? Где схема подключения? Новичков ругаете, а сами нарушаете по полной. :(

чуток поправил, в рамках минимальной достаточности, зависание в цикле из-за того, что время получения данных (с удалённого сервера по TCP) может быть более установленного в программе, по разным причинам от меня не зависящим, лечу перезагрузкой девайса )))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Сколько раз Евгений Петрович говорил - весь код нужен! Может зависание не из-за того куска, что ты приложил.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

Сколько раз Евгений Петрович говорил - весь код нужен! Может зависание не из-за того куска, что ты приложил.

мне не надо искать зависание в коде, надо придумать алгоритм такой записи в EEPROM, чтобы не терялись данные...

1. писать два блока - думаю правильное решение, может быть два блока в два циклических буфера с проверкой CRC, для равномерности износа EEPROM...
2. Думаю, как обойти перезагрузку по таймеру если идёт запись в EEPROM, флаг?
3. Есть уверенность, что аналогичную проблему уже решали

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Не искать решение проблемы, а искать новые костыли?)) Или что?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

Не искать решение проблемы, а искать новые костыли?)) Или что?

там нет костылей, проблема на удалённом сервере, не решаемая, так что это просто "фича" )))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А в чем проблема то с удалённым сервером, опиши словами (я не до конца понял её суть).

У любого сервера отдающего «что-либо» есть время тайм-аута. Если превышено это время - ничего не делаем. Почему у тебя там что-то виснет непонятно. А ребут - это костыли.

По крайней мере сейчас это так выглядит (для меня лично). Не претендую на истину в первой инстанции )))

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

ua6em пишет:

Использую на ESP8266 ватчдог по этому примеру, конфликт с записью в EEPROM, девайс проработал три месяца и вчера впервые его словил, что-то не придумаю как обойти перезагрузку пока идёт запись в EEPROM...

А что мешает использовать семафор ? Поднимай флаг в перед началом записи, опускай по окончании. Контролируй перед перезагрузкой, если поднят не перегружайся. Более того, судя по всему у тебя запись в епром (которого у есп нет :))) и перезагрузка происходит в разных потоках. Поэтому, конечно я и предложил семафор от RTOS, ну или накрайняк флаг должен быть volatile.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

Так а что так долго обрабатывается, что срабатывает собака? 

Может можно разбить на части обработку и отдать управление ядру между ними?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

А что мешает использовать семафор ? Поднимай флаг в перед началом записи, опускай по окончании. Контролируй перед перезагрузкой, если поднят не перегружайся. Более того, судя по всему у тебя запись в епром (которого у есп нет :))) и перезагрузка происходит в разных потоках. Поэтому, конечно я и предложил семафор от RTOS, ну или накрайняк флаг должен быть volatile.

можно прикрутить 24С04 к примеру, на стадии экспериментов не хотелось раздувать ограничившись одной платой nodemcu...
О потоках не в курсе, где почитать? RTOS?

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

ua6em пишет:
Использую на ESP8266 ватчдог по этому примеру,

Почитал статейку по ссылке, ИМХО - третий watchdog - это уже перебор.

ESP и так очень стабильно работают, да и на крайний случай watchdog и так есть.

Не было у меня проблем с ESP совсем. 

ESP8266 в работе с 2015-го, с 2016-го все перевел под Ардуино ИДЕ, до этого LUA.

Сейчас работает уже боле 20 штук (подключены по MQTT к домашнему брокеру на москито).

При старте инкрементируют счетчик стартов, сохраняют в "EEPROM", передают его по MQTT.

Аналогично со счетчиками подключений по WiFi, MQTT.

Счетчики все время по нулям, инкрементируются только после пропаданий питания 220В.

Нет никаких проблем, причем совсем.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

SergeiL пишет:

Так а что так долго обрабатывается, что срабатывает собака? 

Может можно разбить на части обработку и отдать управление ядру между ними?

это не в esp, на сервере, может и миллион запросов в секунду, там править не вариант...