Здравствуйте уважаемые коллеги.
Записываю установочные данные в EEPROM esp8266 в процессе работы в тч и с калибровочных и конфигурационных страниц. Данные в структурах, пишутся EEPROM.put .
Имеет ли смысл контроллировать например контрольную сумму, или хотябы четность при восстановлении после перезапуска, или проверять каждое восстановленное значение на допустимые диапазоны?
я проверяю CRC, просто сделал так изначально, опыта по “надо ли” - нет
Одна проверка не исключает другую, тем более, что делаются они с разными целями.
Кстати, а что, у 8266 есть EEPROM?
Каким CRC? Как часто не совпадало?
не совпадений пока не было, в тесте всего 300 тысяч обращений имею (по чтению)
У меня никаких “супер глобальных” проектов не было, а те что были с сохранением в EEPROM я делаю так:
- У меня всегда в самом коде имеются значения по умолчанию сразу присвоенные переменным (это чтобы не нужно было отдельно EEPROM прошивать (заполнять)). Когда вычитываю данные - проверяю в нужном ли они диапазоне и вообще “не мусор ли?” и только тогда использую дальше.
Скорее всего такой подход не профессиональный, но ведь и я не профессионал )))
Повторно.
CRC16 - код где-то тут выкладывал
/*
Name : CRC-16 CCITT
Poly : 0x1021 x^16 + x^12 + x^5 + 1
Init : 0xFFFF
Revert: false
XorOut: 0x0000
Check : 0x29B1 ("123456789")
MaxLen: 4095 байт (32767 бит) - обнаружение
одинарных, двойных, тройных и всех нечетных ошибок
*/
uint16_t crc16(uint8_t *adrBuff, uint16_t len)
{
uint16_t crc = 0xFFFF;
unsigned char i;
while (len--)
{
crc ^= *adrBuff++ << 8;
for (i = 0; i < 8; i++)
crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
}
return crc;
}
Нуу там епром условный- место в том же флеше. Потому его надо бегинить и коммитить. И пишется он страницами
То есть этой функции можно передать указатель на структуру и ее длину, и получить срс
конечно
А длина чем лимитирована?
этим конечно
Чем этим! Почему?
код не смотрел, откуда сдёрнул не помню, в пояснении указано, что ограничение 4к, я привык верить разработчику )))
PS на ESP32 и на RP2040 4k максимум, меня устраивает
Верить нельзя никому, а в наше время тем более.
А по мне так исключающее или вполне достаточно.
Но AESLib.h (128) частенько использую при обмене данными. Особенно по воздуху
проверить функцию на максимальную длину буфера это уже чуть ли не олимпийская задача, это не с моим познанием C
Чтотто не выходит цветочек каменный
struct Data{
byte mybyte1;
byte mybyte2;
int myint;
float my float;
};
Data data;
uint16_t mycrc;
void setup(void){
//блабла инит сериала…
mycrc = crc16(data,sizeof(data));
Serial.println(mycrc);
}
Видимо я в указателях путаюсь
пишет не могу сконвертировать Data в uint_t*
Длина структурок 20 и 32 байта
struct vestadata_t {
uint8_t avbuffer[24];
uint16_t nr = 0;
uint16_t crc;
} vesta;
/*
Name : CRC-16 CCITT
Poly : 0x1021 x^16 + x^12 + x^5 + 1
Init : 0xFFFF
Revert: false
XorOut: 0x0000
Check : 0x29B1 ("123456789")
MaxLen: 4095 байт (32767 бит) - обнаружение
одинарных, двойных, тройных и всех нечетных ошибок
*/
uint16_t crc16(uint8_t *adrBuff, uint16_t len)
{
uint16_t crc = 0xFFFF;
unsigned char i;
while (len--)
{
crc ^= *adrBuff++ << 8;
for (i = 0; i < 8; i++)
crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
}
return crc;
}
void setup() {
// считаем CRC16 блока показаний
vesta.crc = crc16(vesta.avbuffer, 24); // и записываем в структуру
}
void loop() {
// put your main code here, to run repeatedly:
}