Проблема с Arduino
Модератор: immortal
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Проблема с Arduino
Может кто сталкивался. Arduino работала как часы, но только до того момента пока размер загружаемого кода не превысил 22 Кбайт (из 32 Кбайт возможных). Загрузка проходит успешно, но на старте зависает. Если убрать любую часть кода (до 21 Кбайт например) всё опять работает нормально. Получается потеря почти 30% памяти. Что это может быть такое?
- sergejey
- Site Admin
- Сообщения: 4284
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 75 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Проблема с Arduino
У меня была похожая беда (не хватало памяти) на какой-то из плат на atmega168, правда очень давно. Времени не было разбираться, я её отложил и потом использовал для чего-то более простого, а тот же код перенёс на другую на atmega328 -- там было памяти достаточно для той программы.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Проблема с Arduino
Дело в нехватке оперативной памяти. У 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!
"GET /objects/?object=tempSens1&op=m&m=statusChanged&t=%0d.%d HTTP/1.0"
16 вызовов по 70 символов. На создание объектов и прочие нужды уже не хватает. Но не выдаётся никаких предупреждений, а просто тихо виснет при загрузке.
Если исключить общение с MajorDoMo, то проблема исчезает. А 16 вызовов это всего лишь 8 датчиков. А надо 20-30 датчиков.
Поэтому надо что-то делать. Уменьшить длину строки или исключить загрузку этих строк в память.
Сейчас разбираюсь с PROGMEM и PSTR для этого предназначенных, но плохо получается. Help!
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Проблема с Arduino
В функциях
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
???
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
???