Кидать чё есть иль не кидать иль чё не есть )

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
Здравствуйте,
Подскажите, для девайса-логера датчиков, если одно измерение может длиться от 2ч до 20ч, есть ли разница между:
1) Записывать лог данные на SD-card каждый цикл loop;
2) Записывать лог данные в массив и скидывать на SD-card каждые 5-10мин;
3) Записывать лог данные в массив или внутреннюю память и скидывать на SD-card раз в 1час;
4) Записывать лог данные во внутреннюю память и скидывать на SD-card в конце работы?
Что-то меняется? SD-card приличной фирмы малого размера 16Гб сколько выдержит записей по 300байт?
Какой ресурс у внутренней памяти ESP32?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
546
134
16 ГБ это 2^30 = 1 073 741 824 байт. 1 073 741 824 / 300 ≈ 3 579 139 записей. Теперь можно открыть документацию на
SD-card приличной фирмы
и посмотреть количество циклов перезаписи и прикинуть примерное время жизни флешки.
ресурс у внутренней памяти ESP32
тоже легко ищется в любом понравившемся поисковике.
 
  • Лойс +1
Реакции: Boroda22

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
57 266 230 записей по 300 байт.
Это при всегда доступных 100% SD карты 16Гб.
Однако с учётом записи данных и деградации, реально будет в разы меньше.
При постоянной записи ресурс недорогих карт памяти тратится за 3-6-12мес.

Суть вопроса не только в ресурсе, но и в целом - как принято, какие плюсы/минусы перечисленных методов, итд.
 

bort707

★★★★★★✩
21 Сен 2020
2,911
865
если одно измерение может длиться от 2ч до 20ч, есть ли разница между:
1) Записывать лог данные на SD-card каждый цикл loop;
2) Записывать лог данные в массив и скидывать на SD-card каждые 5-10мин;
Если измерение длится от 2 до 20часов, то какой смысл скидывать данные каждые 5 минут? там же и записывать будет нечего?

Суть вопроса не только в ресурсе, но и в целом - как принято, какие плюсы/минусы перечисленных методов, итд.
Так это вам решать.
Нет никакой общей системы, все определяется соотношением того, насколько вы готовы платить за сохранение данных. Условный пример - если у вас есть вагон СД-карт и нельзя потерять ни байта данных - вам будет наплевать на ресурс карт и вы будете писать каждый новый байт параллельно на 2-3 карты для надежности. Если все наоборот - бюджет давит, а данные некритичные, то будете писать ка можно реже.... И так далее.
 

Borv

✩✩✩✩✩✩✩
4 Фев 2021
23
1
то какой смысл скидывать данные каждые 5 минут? там же и записывать будет нечего?
Чтобы от любых событий вроде откл электричества, сбоев девайса, итд - не потерять данные за часы работы.

Лучше всего наверно выделять некий оптимальный в плане свободной памяти массив-буфер и удерживать там данные за некий промежуток времени, потом скидывать на SD-карту. Например на 10-30мин. Так ресурс карт продержится дольше и в случае чего не потеряется слишком много данных.

Ладно, спасибо
 

KovAlex

✩✩✩✩✩✩✩
9 Фев 2022
25
0
Лучше всего наверно выделять некий оптимальный в плане свободной памяти массив-буфер и удерживать там данные за некий промежуток времени, потом скидывать на SD-карту.
Именно так. Только писать на SD не просто по истечению некоего времени, а только, если за этот период произошло изменение какого-либо значения в этом хэше.
У меня что-то подобное сделано так - в конце loop такой блок:
Код:
    static uint16_t state_hash = 0;
    static uint8_t state_changed = false;
    static long state_changed_tm = 0;
    uint16_t new_state_hash = StateHash();
    if (new_state_hash != state_hash) {
      state_hash = new_state_hash;
      state_changed = true;
      state_changed_tm = millis();
     } else if (state_changed && (millis()-state_changed_tm > 5000)) {
      StateSave(ee24c32);
      state_changed = false;
     }
StateHash:
Код:
uint16_t hash_data(uint16_t hval, uint8_t* data, int sz) {
  while (sz--)
    hval += (hval << 5) + *data++;
  return hval;
}  
uint16_t StateHash() {
  uint16_t hval = 5381;
  hval = hash_data(hval, (uint8_t*)BandData, sizeof(BandData));
  hval = hash_data(hval, (uint8_t*)&BandIndex, sizeof(BandIndex));
  hval = hash_data(hval, (uint8_t*)&state, sizeof(state));
  return hval;
}
Запись при аварийном отключении питания сделана по прерыванию компаратора, отслеживающему питание.
Здесь потребуется небольшая аппаратная "добавка" в схему, чтобы "удержать" питание на МК на время, достаточное для записи данных.