• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос EEPROM адреса

BloodDecember

New member
Нужно хранить два значения, использую такиефункции:
Код:
void write_string_EEPROM (int Addr, String Str) {
  byte lng = Str.length();
  EEPROM.begin (64);
  if (lng > 15 )  lng = 0;
  EEPROM.write(Addr , lng);
  unsigned char* buf = new unsigned char[15];
  Str.getBytes(buf, lng + 1);
  Addr++;
  for (byte i = 0; i < lng; i++) {
    EEPROM.write(Addr + i, buf[i]);
    delay(10);
  }
  EEPROM.end();
}

char *read_string_EEPROM (int Addr) {
  EEPROM.begin(64);
  byte lng = EEPROM.read(Addr);
  char* buf = new char[15];
  Addr++;
  for (byte i = 0; i < lng; i++) buf[i] = char(EEPROM.read(i + Addr));
  buf[lng] = '\x0';
  return buf;
}


С записью первого значения никаких проблем:
Код:
 write_string_EEPROM (0, hma);
Но когда записываю второе:
Код:
write_string_EEPROM (1, hmi);
Оно не сохраняется после перезагрузки модуля. Я понимаю что у меня какая то проблема с адресацией. Точнее я вообще не понимаю как идет адресация.
 

Юрий Ботов

Moderator
Команда форума
Лучше покажите как вы эти функции вызываете... они довольно специфичны.
 

BloodDecember

New member
Лучше покажите как вы эти функции вызываете... они довольно специфичны.
так записываю запрос пришедший по TCP
Код:
String req = client.readStringUntil('\r');
hma = req.toInt();
write_string_EEPROM (0, req);
так читаю ранее записанный запрос
Код:
hma = read_string_EEPROM (0);
Вопрос в том сколько можно хранить в адресе 1 и сколько в адресе 0? и что они из себя представляют?
 

Юрий Ботов

Moderator
Команда форума
Ясно, вы просто не понимаете как работают эти функции...
Есть память, сколько то там байт.
Вызов write_string_EEPROM(0,"чтото") запишет в эту память:
[0] - 5 (это длина строки)
[1] - 'ч'
[2] - 'т'
[3] - 'о'
[4] - 'т'
[5] - 'о'
А read_string_EEPROM(0) честно это прочтет. Но в [1] ничего записывать нельзя, поскольку он используется для хранения нашей первой строки, поэтому если надо записать еще одну строку надо вызвать write_string_EEPROM(6,"еще") тогда она добавит:
[6] - 3 (это длина второй строки)
[7] - 'е'
[8] - 'щ'
[9] - 'е'
То есть хранение адресов начала строк это забота программиста.
Надо либо создать массив для их хранения, либо решить что все "записи" будут фиксированного размера (с запасом) и соответственно писать допустим в 0,16,32,48,64... и читать соответственно оттуда-же
 

kab

New member
@Юрий Ботов
А можно вопрос "почти" в тему?
Если у нас уже организована FS на флэш ESP и возникла необходимость хранить несколько настроечных параметров,
то какие соображения необходимо принимать во внимание, выбирая, где организовывать хранение этих параметров - на EEPROM или файле на FS флэш?
 

Юрий Ботов

Moderator
Команда форума
@kab,
1. то что eeprom в esp на самом деле нету, а используется небольшой кусочек того же самого флэша что и для fs.
2. то что в esp достаточно мало оперативки и она вынуждена подгружать код по необходимости из флэша используя механизм подобный оверлеям (он у нее реализован аппаратно).
По большому счету эмуляция EEPROM сделана просто для совместимости с ардуиновскими скетчами которые ее используют. Но использовать ее можно и нужно когда сохраняешь немного данных и при этом вообще не пользуешся для других целей файловой системой. При этом код уменьшается и скорость его работы растет (библиотека EEPROM занимает меньше места в ОЗУ, как для кода так и для данных и работает значительно быстрее). Однако если для каких-то других целей используется файловая система то какой смысл подцеплять еще одну библиотеку? Будет тратить лишнее время на подгрузку оверлеев и тормозить.
 
  • Like
Реакции: kab

Encrypt

Member
Для себя решил, что проще всего хранить настройки в файле, в json формате. Использую библиотеку ArduinoJson. Очень удобно, места полно, хоть мемуары храни :))
 
Сверху Снизу