Кончается память в ОЗУ в процессе выполнения программы

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

Здравствуйте, извините, за столь частые и глупые вопросы, но вот еще один ;-)

У меня утекает память вот в этой процедуре, точнее я везде понатыкал serial.print который выводит оставшееся место и вот после выполнения процедуры места (в ОЗУ) становится меньше :-(

Я лишь могу предположить, что не очищаются переменные при выходе из функции?!?!?

void SS2File(String Record) {
  char fname[9];
  bool NewFile=false;
  String FirstLine;  
  sprintf(fname, "%02d%02d.txt", tm_year-30, tm_mon);
  MyFile = SD.open(fname);
  if (!MyFile) NewFile=true;
  MyFile = SD.open(fname, FILE_WRITE);
  if (MyFile) {
    if (NewFile) {
      FirstLine="Sensors:  t(in),  H(in), t(out), H(out),  Light,    SH1,    SH2,    SH3,    SH4"+String(Valves); 
      MyFile.println(FirstLine);
      FirstLine="today 20"+String(tm_year-30)+" "+String(tm_mon)+" "+String(tm_mday)+" ";
      MyFile.println(FirstLine);
    }
    MyFile.println(Record);
    MyFile.close();
  }
  if (TestMode) {           
    Serial.println(Record);
  }
}

вот процедура, которая смотрит на свободную память (нашел на форуме)

int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

 

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

сам же и нашел. ладно с этим куском разобрался, попробую другой кусок поискать, где напортачил

в вышепредставленном куске заменил с 6й строки на это

  sprintf(fname, "%02d%02d.txt", tm_year-30, tm_mon);
  if (!SD.exists(fname)) NewFile=true;
  MyFile = SD.open(fname, FILE_WRITE);
  if (MyFile) {

а то файл не закрывался. вот и памяти кусок ;-)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Пальцем в небо. Не вдаваясь в подробности, в 06 и в 08 строках открывается файл и используется один и тот же дескриптор MyFile. Первый раз ладно, а вот во второй раз, когда файл уже есть файл, получается два раза открываем.

 

gooroong
gooroong аватар
Offline
Зарегистрирован: 08.03.2015

оказывается только этот кусок кушал память, причем, достаточно нелинейно (то есть вза один проход мог скушать от 30 до 500 байт ?! ) отсюда я думал, что еще где то в алгоритме массив запрыгивает в неположенное место.