EEPROM esp8266 и проверка целостности восстановленных данных

Зачем проверять считываемое каждый раз на допустимость, если это можно сделать один раз при записи? А CRC подтвердит, что считает именно записанное. Т.е. допустимое.

1 лайк

Хм… я там дополнил код в вопросе… мне надо не буфер посчитать а срс всей структуры и четто не получаицца. Я решил что параметр прредается как в sizeof, ан нет :frowning:
Сделать буффер чтоле по длине структуры и заUnionить его с самой структурой штоле ?
Я уж попробовал
int *ptr {&data};
И передать ptr но тоже не сработало.

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

Это так, самоуспокоение.

Ну да, просто во времена былинные после ресета мы читали из нцмд и каждое значение еще и проверяли на диапазоны.

Допустим в еепроме хранятся стартовая и максимальная скорость. Диапазон 0…255 для обеих.
Считалась стартовая 250, а максимальная 30.
Допустимо? Да. Валидно? Нет.

Да, получилось, то есть это явное указание, что там будет тот тип, который нужен функции под собственную ответственность ?
Да, согласен, данные перед записью считаются верными , потому достаточно считать crc

Спасибо sadman41 и ua6em

Кстати, sizeof(data)-sizeof(crc). Иначе перезаписанное в структуре crc сразу валидность порушит.

Я crc не в структуре храню, отдельной записью.
А так не сработало
mycrc = crc16((void*) &data,sizeof(data));

Тогда ладно. А я в той же структуре. Пишу сразу кучей и данные и crc. Ещё и систим префикс таскаю, который позволяет сбросить на дефолт настройки в еепроме, если прошивка обновилась, прилетев с новым префиксом, и нужно все дропнуть или конвертировать настройки в новую структуру.

Для этого нужно функции указатель на войд принять и кастануть внутри ее к нужному типу.

Типа как тут


void fram_pack(byte disk, uint16_t startAddress, void *data, uint16_t len) { // disk - 0x50-0x57, startAddress - 0x00 - 0xFF, &data - первый байт данных, len - колво байт данных (sizeof(data))
  Wire.beginTransmission(disk);
  Wire.write(startAddress >> 8);
  Wire.write(startAddress & 0xFF);
  Wire.write((byte*)data, len);
  Wire.endTransmission();
  delay(1);
}

Внутри явно указан неопределенный снаружи тип.
То есть сто бы ни пришло внутри обрабатываем побайтно

Типа того, но указательность утеряна почему-то.

Хмм а в чем утеряна? Вроде работает, тестировал вдоль и поперек, подсовывал разное

Потому что я видел неформатированный код без астерисков.
И во fram delay не нужен, как я помню. Он пишет с нулевой задержкой.

Наверно да, попробую, код вцелом не мой, нашел на хабре под фрамку с другим объемом и другой организацией, поэкспериментировал и доработал, даже тут гдетто была тема об этом.
В тонкостях передачи внутрь параметров не пытался разбираться.
К сожалению для меня указатели почемутто до сих пор трином бинона.
Нигде немогу доходчиво почитать. Наверно туп и родюся баобабом, зато на 1000 лет :slight_smile: главное не прорабом.

ты не одинок, мне после ассемблера (там всё просто) тоже не даются )))

Можно подумать, в Ассемблере указателей нет.
В Си не указатели сложные, а синтаксис идиотский.

конечно есть и, там всё просто