Ограничения Arduino и как их обойти?

staffnz
Offline
Зарегистрирован: 02.04.2015

Здравствуйте. Программирую Arduino UNO и столкнулся вот с чем:

Подключаю несколько библиотек для DS18B20-термодатчика, GPS, GPRS шилдов. И вроде всё хорошо, но когда пробую отослать POST-запрос, то часть строки теряется. И длина пропавшего куска напрямую зависит от числа подключённых библиотек. Если, например, убрать библиотеки для однопроводной передачи данных для DS18B20-термодатчика - строка полностью передаётся. 



Вопрос: Можно ли эту проблему решить программно? 

Или есть какое-то железо помощнее, другое поколение Arduino? Желательно, чтобы разъёмы были такие же как и у Arduino UNO, чтобы шилды также ставились, в ту жу позицию.

b707
Offline
Зарегистрирован: 26.05.2017

Это связано с размером оперативной памяти. Очевидно, что подключение каждой новой библиотеки расходует все больше паямти, поэтому. когда вы пытаетесь поместить в эту память еще и строку со своим POST-запросом, она туда не влезает. Проблему можно решить путем оптимизации кода. - например отказом от библиотек или болле экономным хранением длинной строки запроса...

 

 

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

b707 пишет:
Проблему можно решить путем оптимизации кода. - например отказом от библиотек или болле экономным хранением длинной строки запроса...

Не наш метод!. Нам надо

staffnz пишет:

железо помощнее

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вангую, там длиннющая строка для POST-запроса, да ещё и в оперативке висит, а не во флеше - вот шит хаппенс и случился :) Скетч выкладывайте, поржём, чо уж там :) Заодно и поможем, если пациент скорее жив, чем...

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

Вангую, там длиннющая строка для POST-запроса, да ещё и в оперативке висит, а не во флеше - вот шит хаппенс и случился :) Скетч выкладывайте, поржём, чо уж там :) Заодно и поможем, если пациент скорее жив, чем...

Скорее всего, не только это. Судя по наличию в коде библиотек для GSM и GPS - уверен, что строк в проекте предостаточно. А судя по вопросу автора, в программировании он новичок и прятать строки во флеш гаверняка не умеет...

GarryC
Offline
Зарегистрирован: 08.08.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

GarryC пишет:

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

Если нехватка памяти видна еще в момент сборки - должен. Но если автор скетча пользуется динамическим выделением памяти в момент выполнения, например через "удобный" класс String - то компилироваться будет, а нормально работать - нет.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Да нормальный класс String, просто надо уметь его готовить :)

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

+100500!

Если руки из задницы и мозги в ней же, то от типа int пострадать можно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DIYMan пишет:

Да нормальный класс String, просто надо уметь его готовить :)

Так в том и проблема, что для того, чтобы грамотно использовать String нужна квалификация повыше, чем чтобы его вообще не использовать (заменив, например, на Си-строки)/

staffnz, оба пути возможны, и программный, и аппаратный.

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

Ну а аппаратный - почитайте на главной странице Ардуино, какие бывают контроллеры, обратив особое внимание на размер оперативной памяти.