Проблема с Arduino

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Проблема с Arduino

Сообщение Alex » Пт окт 19, 2012 11:54 pm

Может кто сталкивался. Arduino работала как часы, но только до того момента пока размер загружаемого кода не превысил 22 Кбайт (из 32 Кбайт возможных). Загрузка проходит успешно, но на старте зависает. Если убрать любую часть кода (до 21 Кбайт например) всё опять работает нормально. Получается потеря почти 30% памяти. Что это может быть такое? :shock:
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Проблема с Arduino

Сообщение sergejey » Сб окт 20, 2012 11:23 am

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

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Проблема с Arduino

Сообщение Alex » Сб окт 20, 2012 12:50 pm

Дело в нехватке оперативной памяти. У 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!
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Проблема с Arduino

Сообщение Alex » Сб окт 20, 2012 1:11 pm

В функциях

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

???
Ответить