Страница 1 из 1
Проблема с Arduino
Добавлено: Пт окт 19, 2012 11:54 pm
Alex
Может кто сталкивался. Arduino работала как часы, но только до того момента пока размер загружаемого кода не превысил 22 Кбайт (из 32 Кбайт возможных). Загрузка проходит успешно, но на старте зависает. Если убрать любую часть кода (до 21 Кбайт например) всё опять работает нормально. Получается потеря почти 30% памяти. Что это может быть такое?

Re: Проблема с Arduino
Добавлено: Сб окт 20, 2012 11:23 am
sergejey
У меня была похожая беда (не хватало памяти) на какой-то из плат на atmega168, правда очень давно. Времени не было разбираться, я её отложил и потом использовал для чего-то более простого, а тот же код перенёс на другую на atmega328 -- там было памяти достаточно для той программы.
Re: Проблема с Arduino
Добавлено: Сб окт 20, 2012 12:50 pm
Alex
Дело в нехватке оперативной памяти. У Arduino Uno её 2 Кбата и 60% её съедается строками типа
"GET /objects/?object=tempSens1&op=m&m=statusChanged&t=%0d.%d HTTP/1.0"
16 вызовов по 70 символов. На создание объектов и прочие нужды уже не хватает. Но не выдаётся никаких предупреждений, а просто тихо виснет при загрузке.
Если исключить общение с MajorDoMo, то проблема исчезает. А 16 вызовов это всего лишь 8 датчиков. А надо 20-30 датчиков.
Поэтому надо что-то делать. Уменьшить длину строки или исключить загрузку этих строк в память.
Сейчас разбираюсь с PROGMEM и PSTR для этого предназначенных, но плохо получается. Help!
Re: Проблема с Arduino
Добавлено: Сб окт 20, 2012 1:11 pm
Alex
В функциях
sprintf(buf, "GET /objects/?object=tempSens1&op=m&m=statusChanged&t=%0d.%d HTTP/1.0", (int)current_temp1, abs(temp1));
sprintf(buf, "GET /objects/?object=tempSens2&op=m&m=statusChanged&t=%0d.%d HTTP/1.0", (int)current_temp2, abs(temp2));
sprintf(buf, "GET /objects/?object=tempSens3&op=m&m=statusChanged&t=%0d.%d HTTP/1.0", (int)current_temp3, abs(temp3));
стороки
"GET /objects/?object=tempSens1&op=m&m=statusChanged&t=%0d.%d HTTP/1.0"
"GET /objects/?object=tempSens2&op=m&m=statusChanged&t=%0d.%d HTTP/1.0"
"GET /objects/?object=tempSens3&op=m&m=statusChanged&t=%0d.%d HTTP/1.0"
одинаковые и различаются только
tempSens1
tempSens2
tempSens3
как бы вызвать функцию sprintf, чтобы постоянные части хранить только в одном экземпляре, а перед использованием складывать с переменной частью
постоянная часть
GET /objects/?object=
плюс переменная часть
tempSens1
плюс постоянная часть
&op=m&m=statusChanged&t=%0d.%d HTTP/1.0
???