EEPROM хранение, использование, восстановление данных

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

Добрый день уважаемые!

Задача хранить данные в EEPROM c проверкой целостности и возможностью восстановления.
Кто и как решает применительно к ардуино nano?
Что-то у меня проще, чем тройная избыточность не получается.
На дискетах всё было просто, пишем посекторно, делаем XOR для двух секторов и пишем в третий, а здесь как?
 

toc
Offline
Зарегистрирован: 09.02.2013

поделите ееепром на три сектора.
реализация crc32 для ардуины есть в сети.

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

да мне нужно то от силы байт 8, но железобетонных, хотелось бы попроще решить

Нашёл такой код, вопрос как его применить и не убъёт ли он всю динамическую память?

Word MakeCRC16Table(void)
{
 Word r;
  for(int i=0; i<256; i++)
   {
    r = ((Word)i)<<8;
     for(byte j=0; j<8; j++)
       {
        if(r&(1<<15)) r=(r<<1)^0x8005;
        else r=r<<1;
       }
     crctable[i]=r;
   }
}

Код для расчёта CRC:

Word GetCRC16(byte *buf, Word len)
{
 Word crc;
 crc = 0xFFFF;
 while(len--)
  {
   crc = crctable[((crc>>8)^*buf++)&0xFF] ^ (crc<<8);
  }
 crc ^= 0xFFFF;
 return crc;
}

 

lean_74
Offline
Зарегистрирован: 22.12.2015

в институте еще писал программу для расчета надежности передачи данных с помощью https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D0%A0%D0%B8%D0%B4%D0%B0_%E2%80%94_%D0%A1%D0%BE%D0%BB%D0%BE%D0%BC%D0%BE%D0%BD%D0%B0 доволно неплохие результаты показывало даже на таблице 4Х4 бйта и три проверочных.

при одинарной ошибке в любом месте матрицы исравление 100%, при двойной 97%, при тройной 89%, дальше не помню, т.е. если считать грубо на нужные тебе 2 байта, надо хранить еще пять проверочных, остальное чистая математика. 

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

ua6em пишет:

Нашёл такой код, вопрос как его применить и не убъёт ли он всю динамическую память?

Не нужно убивать динамическую память, она хорошая. Делаете что-то вроде такого

#include <util/crc16.h>

// Calculate 8-bit CRC-CCITT with using _crc8_ccitt_update() from AVRLib
uint8_t crc8 (uint8_t *_src, uint8_t _len) { 
  uint8_t inbyte;
  uint8_t crc = 0xFF;
  while (_len) {
    _len--;
    inbyte = *_src++;
    crc = _crc8_ccitt_update(crc, inbyte);
    }  // end of while
  return crc;
}  // end of crc8

И считаете, считаете... CRC-16 для 8 байт излишне, CRC-8 вполне хватит.

 

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

lean_74 пишет:

в институте еще писал программу для расчета надежности передачи данных с помощью https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D0%A0%D0%B8%D0%B4%D0%B0_%E2%80%94_%D0%A1%D0%BE%D0%BB%D0%BE%D0%BC%D0%BE%D0%BD%D0%B0 доволно неплохие результаты показывало даже на таблице 4Х4 бйта и три проверочных.

при одинарной ошибке в любом месте матрицы исравление 100%, при двойной 97%, при тройной 89%, дальше не помню, т.е. если считать грубо на нужные тебе 2 байта, надо хранить еще пять проверочных, остальное чистая математика. 

а я думал уже так сделать: D1, D2, XOR_D1_D2,XOR_D1_A5,XOR_D2_A5
Получается 3 байта если 5 то дополнить XOR_D1_F6,XOR_D2_F6

Это уже 10 кратный запас по надёжности, вопрос только как раскидывать по памяти? чтобы RAS-CAS не пересекались

lean_74
Offline
Зарегистрирован: 22.12.2015

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

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

При такой избыточности хотелось бы иметь решение 100% восстановления исходных данных, я об этом, может быть я недооцениваю надёжность EEPROM )))

lean_74
Offline
Зарегистрирован: 22.12.2015

прицепи флешку и, еще туда, тогда периодически пиши :)

lean_74
Offline
Зарегистрирован: 22.12.2015

еще вай-фай модуль и на сервер данные слать, сервер на платном облаке, а оттуда комп забирает и на два жестких в зеркале диска пишет.во как!:))))))

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

А сбоку товарища майора посадить с журналом регистрации.

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

lean_74 пишет:

еще вай-фай модуль и на сервер данные слать, сервер на платном облаке, а оттуда комп забирает и на два жестких в зеркале диска пишет.во как!:))))))

та это всё есть, только не зеркало а раид 6 с хотфиксом )))
мне бы с EEPROM разобраться

Создаётся впечатление, что никто и никак не решает, вечный русский авось )))