Как обнулить озу Arduino

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Доброго времени суток.

Возникла пролбема 

есть код 

unsigned int irSignal[67]; // выделяем память под массив целых
  memset(irSignal, 0, sizeof(unsigned int) * 67); //обнуляем массив
  unsigned char index = 0;
  while (dataFile.available()) { // Проверяем что файл не пустой
    unsigned char ch = dataFile.read();
    if ((ch >= '0') && (ch <= '9')) {
       irSignal[index] *= 10;
       irSignal[index] += ch - '0';
    } else if (ch == ',') {
       index++;
    }
    if (index >= 67) break;
  }
  irsend.sendRaw(irSignal, 67, 38);

В котором происходит загрузка в буффер кода кнопки пульта после чего идет отправка. 

Все срабатывает на ура но проблема в том, что буфер не очищается после отправки.

выглядит это так 

freeMemory()=698 свободно паняти при загрузке программы
freeMemory()=667 
freeMemory()=636 
freeMemory()=605
freeMemory()=574
freeMemory()=543
freeMemory()=512
freeMemory()=481
freeMemory()=450
freeMemory()=419
freeMemory()=388
freeMemory()=357
freeMemory()=326
freeMemory()=295
freeMemory()=264 после 15 команды висяк ардуинки из за нехватки памяти.
как очистить memset без хардресета.
 
a5021
Offline
Зарегистрирован: 07.07.2013

Как полный бред выглядит то, чем вы занимаетесь. Очистить memset ? Вообще-то это имя функции. Вы знаете, как очистить имя функции "без хардресета" ? Очистить от чего? От дурной репутации? От чего-то еще очистить имя будет проблематично.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

memset, он, конечно, быстро пачкается и нуждается в периодической чистке (как и мозги тех, кто его использует), только Вам никто не поможет, пока Вы не выложите нормальный полный код который собственно и напечатал то, что Вы там привели про память. А если код секретен, то придётся Вам как-то жить с грязным memset'ом :(

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

От злых духов очистить!

Возможно я некорректно выразился, суть в том, что значения из файла собранные в массив нужно очистить из памяти после отправки. Так как значения накапливаються при каждой отправке пока не израсходуют память ардуино. После чего дуня бонально зависает.

Бред или не бред это судить думаю не вам!

Я не программист а вольный самоучка, знаете как делать очистку, помогите. Нет тогда нет смысла флудить.

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Секрета в коде нет

while (Serial.available() == 0); // Функци¤ Serial.аvailable() проверяет, есть ли в COM порте доступные для чтения данные!
  int val = Serial.parseInt(); // Читаем строку целиком
  File dataFile = SD.open(String(val,DEC)); // Открываем файл
  if (dataFile) { 
  unsigned int irSignal[67]; // выделяем память под массив целых
  memset(irSignal, 0, sizeof(unsigned int) * 67); //обнуляем массив
  unsigned char index = 0;
  while (dataFile.available()) { // Проверяем что файл не пустой
    unsigned char ch = dataFile.read();
    if ((ch >= '0') && (ch <= '9')) {
       irSignal[index] *= 10;
       irSignal[index] += ch - '0';
    } else if (ch == ',') {
       index++;
    }
    if (index >= 67) break;
  }
  irsend.sendRaw(irSignal, 67, 38);
 }
}

пришло в терминал к примеру циферка 1

открываеться вайл 1 считывается значение в memset(irSignal)

как полностью считалось отправляеться через irsend.sendRaw 

вопрос как после отправки с памяти все выкинуть лишнее

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

AngelLeo пишет:

Бред или не бред это судить думаю не вам!

Родное сердце!

Ты правда думаешь, что после такого заявления тебе кто-нибудь поможет?

----------------------

Представленный код - полный бред, написанный мудаком. И судить об этом, например я, могу потому, что имею нужную квалификацию. А мудак, который код писал, такой квалификации - не имеет. Зато гонора дохера.

И советы по исправлению кода обычно получают вежливые люди. Понимающие, что их мнение и уровень знаний, а так же мысли и мечты - нихера тут никого не интересуют.

-----------------------------------------------------------------------------

Писать надо так: "Память выделять не умею, программирование на "С" не учил и в нем нихера не понимаю, очень хочу научиться, объясните почему утекает память?"

negavoid
Offline
Зарегистрирован: 09.07.2016

Гонора и у [5] хватает, хоть я с ним и более согласен :)

memset(irSignal, 0, sizeof(unsigned int) * 67); // это сурово, ведь существуют такие штуки, как выравнивание и тп
for (short i=0; i<67, $i++) irSignal[i] = 0;    // тогда уж так

Но даже если memset и отрабатывает правильно, далее начинается и правда х**ня:

irSignal[index] *= 10;        // 0 * 10 = всегда 0
irSignal[index] += ch - '0'; // просто поразительно, сколькими способами си даёт возможность выстрелить себе в ногу

 

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Уважаемый wdrakula.

"Бред или не бред это судить думаю не вам!" относиться исключительно к уважаемому a5021. 

Не люблю когда люди с ходу обсирать начинают не разобравшись в теме вопроса. 

Если вы приняли это на свой счет. Прошу прощения. Адресованно исключительно a5021.

По поводу кода неприятно, когда кто то брызжет ядом. Данный код написан не мной, как вы правильно подметили я программирование на "С" не учил и в нем нихера не понимаю, очень хочу научиться.

Не так давно озаботился написанием кода, просил помощи, результаты пичальны. К счастью на другом ресурсе откликнулся человек и написал данный код. Все заработало сразу.

На радостях устройство собрано. И в процессе тестирования выяснилось что идет переполнение памяти. с чем собственно я и пытаюсь разобраться.  И по этому прошу помощи. Человек который помог с кодом в первый раз не насвязи. 

Оскорбить людей на данном форуме я искренне не хотел. 

Просто обидно когда труд тех, кто отозвался откровенно оскорблют. 

Замечу, что отзываеться не так много людей.

 

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Уважаемые форумчане.

Приношу свои искренние извенения если, кто то принял пост #3 за оскорбление.

Я ни вкоем случае не хотел, кого бы то нибыло оскорбить. И пост относиться исключительно к негвативно выразившемуся a5021.

Я человек культурный. По крайней мере очень на это надеюсь. 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

AngelLeo пишет:

Просто обидно когда труд тех, кто отозвался откровенно оскорблют. 

если результатом твоего труда является дерьмо, то кому обижаться на сей факт? - включай голову, труженник.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ок.

Тогда, без обидок, приведи полный скетч.

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

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Труд не мой! По этому и обидно. буть это мой код я с радость принял бы критику. Отозвался 1 человек в прошлый раз он и помог. Хороший код или нет мне судить сложно. Я новичек и с си знаком исключитель в общих чертах. С буффером, массивом и памятью никогда не работал.

negavoid
Offline
Зарегистрирован: 09.07.2016

AngelLeo

в том коде, что приведен, утечки памяти нет

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016
весь код примитивен

void setup()
 {
  Serial.begin(9600); //установка порта на скорость 9600 бит/сек
  Serial.print("Initializing SD card..."); // Инициализируем SD csrd
  if (!SD.begin(chipSelect)) {
  Serial.println("Card failed, or not present"); // Ошибка программы 
  return; //  Останавливаем программу
 }
  Serial.println("card initialized. Done"); // Если карта прошла инициализацию
 }
 
void loop() {
  
  while (Serial.available() == 0); // Функци¤ Serial.аvailable() проверяет, есть ли в COM порте доступные для чтения данные!
  int val = Serial.parseInt(); // Читаем строку целиком
  File dataFile = SD.open(String(val,DEC)); // Открываем файл
  if (dataFile) { 
      }
      memset(irSignal, 0, sizeof(unsigned int) * 67); //обнуляем массив
      unsigned char index = 0;
      while (dataFile.available()) { // Проверяем что файл не пустой
      unsigned char ch = dataFile.read();
      if ((ch >= '0') && (ch <= '9')) {
      irSignal[index] *= 10;
      irSignal[index] += ch - '0';
      } else if (ch == ',') {
      index++;
    }
    if (index >= 67) break;
  }
  irsend.sendRaw(irSignal, 67, 38);
    Serial.print("freeMemory()=");
    Serial.println(freeMemory());
}
}

Суть всей программы, что при получении в терминале номера, открываеться документ текстовый с карты sd с этим номером, из файла считывается Raw кнопки в виде (4600,4400, 650,1600, 650,1600, 650,1600, 600,500, 650,450, 650,500, 650,450, 650,500, 600,1600, 650,1600, 650,1600, 650,450, 650,500, 650,450, 650,500, 600,500, 650,500, 600,1600, 650,500, 600,500, 650,500, 600,500, 650,450, 650,500, 600,1650, 600,500, 650,1600, 600,1650, 600,1600, 650,1600, 650,1600, 650,1600, 6504600,4400, 650,1600, 650,1600, 650,1600, 600,500, 650,450, 650,500, 650,450, 650,500, 600,1600, 650,1600, 650,1600, 650,450, 650,500, 650,450, 650,500, 600,500, 650,500, 600,1600, 650,500, 600,500, 650,500, 600,500, 650,450, 650,500, 600,1650, 600,500, 650,1600, 600,1650, 600,1600, 650,1600, 650,1600, 650,1600, 650) после чего этот Raw отправляеться через irSend.sendRaw. 

Суть окровенно универсальный пульт, а не примеры как в сети на пару кнопок. Задача именно управлять десятком устройств с 1 куба в котором стоит вся начинка. сотни кнопок. Прописать все в ардуино нет возможности. Не хватает памяти. 

Araris
Offline
Зарегистрирован: 09.11.2012

dataFile.close() отсутствует что ли ? Не есть хорошо.

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

В том и беда, что я понять не могу, что происходит. При отправке каждой команды с памяти минус 31 байт после 15 команд ардуинка виснет.

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Уважаемый Araris ОГРОМНОЕ СПАСИБО.

Вы правы. Проблема именно в том что файлы остаються открытыми. 

Добавил dataFile.close(); после отправки и все заработало. Память освобождаеться после отправки. 

ОГРОМНОЕ СПАСИБО. Что подметили мою невнимательность. Мне и в голову непришло, что из за открытых файлов утекает память.

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

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

Initializing SD card...card initialized. Done
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733
freeMemory()=733

после отправки все с памяти чистится. и память остается неизменна. Отправил все 67 команд которые уже забиты и все сработали идеально. 

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Бросил пульт куб под стол. И все работает. Каналы все переключает. По bluetooth тоже все идеально срабатывает разве, что с задержкой в пару секунд. от Аккумуляторов 18650 полет нормальный. Осталось приделать голосовое управление)))

Всем, кто откликнулся Огромное спасибо.

За недоразумение с оскорблением еще раз прошу прощения у всех форумчан.

По поводу плохого кода, сказать плохо не могу все работает отлично. Не судите строго. 

Еще и место осталось прикрутить Wi-fi и модуль 433 мгц для управления светом, чайником и т.д.

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Может кому пригодится. В связке arduino nano, SD адаптер, Bluetooth, 4 ir диода. 2 старых аккумуляторов 18650 от бука через DC преобразователь хватате на 2 суток в среднем.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AngelLeo пишет:

Секрета в коде нет

while (Serial.available() == 0); // Функци¤ Serial.аvailable() проверяет, есть ли в COM порте доступные для чтения данные!
  int val = Serial.parseInt(); // Читаем строку целиком
  File dataFile = SD.open(String(val,DEC)); // Открываем файл
  if (dataFile) { 
  unsigned int irSignal[67]; // выделяем память под массив целых
  memset(irSignal, 0, sizeof(unsigned int) * 67); //обнуляем массив
  unsigned char index = 0;
  while (dataFile.available()) { // Проверяем что файл не пустой
    unsigned char ch = dataFile.read();
    if ((ch >= '0') && (ch <= '9')) {
       irSignal[index] *= 10;
       irSignal[index] += ch - '0';
    } else if (ch == ',') {
       index++;
    }
    if (index >= 67) break;
  }
  irsend.sendRaw(irSignal, 67, 38);
 }
}

пришло в терминал к примеру циферка 1

открываеться вайл 1 считывается значение в memset(irSignal)

как полностью считалось отправляеться через irsend.sendRaw 

вопрос как после отправки с памяти все выкинуть лишнее

Вы читали, что я Вам написал? Нужен полный код, Вы понимаете смысл слова "полный"?

Дело в том, что чистить memset сам по себе бестолку - сначала нужно почистить void и digitalRead или убедиться, что с ними всё в порядке. А как это сделать, если Вы только куски кода даёте?

Ещё раз повторяю, без полного кода Вам не поможет никто.

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Огромное спасибо! Уже помогли. Проблема найдена и решена. Проблема была в том, что не закрывался dataFile после чтения. В открытом состоянии они накапливались и переполняли память дуни. Проблема оказалась не в memset. К несчастью в меру с воей не опытности, до меня недоходило, что открытый файл забирает память и при открытии нового файла старый не закрывается. Весь код программы приведен в #13 посте. программа малюсенькая. 

a5021
Offline
Зарегистрирован: 07.07.2013

AngelLeo пишет:

Я ни вкоем случае не хотел, кого бы то нибыло оскорбить. И пост относиться исключительно к негвативно выразившемуся a5021.

Т.е. вы будете упорствовать в том, что ваше желание "очистить memset" не является бредом, а всякие некультурные человеки пытались вам нагрубить без всякой на то причины?

AngelLeo
AngelLeo аватар
Offline
Зарегистрирован: 17.06.2016

Уважаемый a5021 возможно просто не стоит незнакомым людям (Учитывая возможность возростной разници в плоть до поколений), с учетом, что на форуме не все программисты (в противном случае смысл задавать вопросы, зная ответ) с ходу грубить. В плане бред и т.д.

Если вы знаете больше, чем ваш аппонент ато похвально.

Я ранее не работал с массивами, буферами и т.п. и мне это в новинку. Когда я ранее просил помощи, откликнулся один человек, и помог с кодом. (Замечу, что все работает идеально как часы. Даже несмотря на негативные отзывы.)

Не смотря на негатив окружающих, что код плохой, и вообще все фигня. Других вариантов никто не показал. А голословное оскорбление чужого труда это просто некрасиво. 

По поводу memset. Согласен прошу меня извенить в связи с моей неграмотностью и некорректной формулировкой.  (Хотя я считаю, что можно указать на недостатки знаний другого человека в более лояльной форме не прибегая к оскорблению.)

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

P.S. Если я правдо сильно вас оскорбил своим ответом в посте #3. Прошу меня извенить. Ответил с горяча, неподумав. Цели оскорбить вас или иных участников форума я неимел.