Ошибка компилятора, помогите!
- Войдите на сайт для отправки комментариев
Доброго времени суток, задача получить показания с сонара sr04 через esp8266 по wifi Arduino Mega есть скетч
#include <NewPing.h> HardwareSerial & ESPport = Serial1; const int ledPin = 13; int ledState = HIGH; #define BUFFER_SIZE 128 char buffer[BUFFER_SIZE]; String vklotkl; #define TRIGGER_PIN 9 #define ECHO_PIN 8 #define MAX_DISTANCE 200 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); void setup() { pinMode(ledPin, OUTPUT); Serial.begin(115200); // Терминал ESPport.begin(115200); // ESP8266 Serial.println(GetResponse("AT+CIOBAUD=9600",100)); Serial.begin(9600); // Терминал ESPport.begin(9600); // ESP8266 clearSerialBuffer(); Serial.println("RESET 3,5 sek"); Serial.println(GetResponse("AT+RST",3400)); // перезагрузка ESP Serial.println(GetResponse("AT+CWMODE=1",300)); // режим клиента connectWiFi("****","****"); // подключаемся к домашнему роутеру (имя точки, пароль) Serial.println(GetResponse("AT+CIPMODE=0",300)); // сквозной режим передачи данных. Serial.println(GetResponse("AT+CIPMUX=1",300)); // multiple connection. Serial.print("Start TCP-server: "); Serial.println(GetResponse("AT+CIPSERVER=1,88", 300)); // запускаем ТСР-сервер на 88-ом порту Serial.println(GetResponse("AT+CIPSTO=2", 300)); // таймаут сервера 2 сек Serial.println(GetResponse("AT+CIFSR", 300)); // узнаём адрес digitalWrite(ledPin,ledState); Serial.print(sonar.ping_cm()); } ///////////////////основной цикл, принимает запрос от клиента/////////////////// void loop() { Serial.print(sonar.ping_cm()); int ch_id, packet_len; char *pb; ESPport.readBytesUntil('\n', buffer, BUFFER_SIZE); if(strncmp(buffer, "+IPD,", 5)==0) { sscanf(buffer+5, "%d,%d", &ch_id, &packet_len); if (packet_len > 0) { pb = buffer+5; while(*pb!=':') pb++; pb++; if((strncmp(pb, "GET / ", 6) == 0) || (strncmp(pb, "GET /?", 6) == 0)) { Serial.println(buffer); Serial.print("get led from ch :"); Serial.println(ch_id); delay(100); clearSerialBuffer(); if(ledState == LOW) { ledState = HIGH; vklotkl = "VKL"; } else { ledState = LOW; vklotkl = "OTKL"; } digitalWrite(ledPin, ledState); otvet_klienty(ch_id); } } } clearBuffer(); } //////////////////////формирование ответа клиенту//////////////////// void otvet_klienty(int ch_id) { String Header; Header = "HTTP/1.1 200 OK\r\n"; Header += "Content-Type: text/html\r\n"; Header += "Connection: close\r\n"; String Content; //float d_1 = us_1.Ranging(CM); // get distance //float d_2 = us_2.Ranging(CM); // get distance //float d_3 = us_3.Ranging(CM); // get distance Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> "+vklotkl; Content += "</form></body></html>"; Header += "Content-Length: "; Header += (int)(Content.length()); Header += "\r\n\r\n"; ESPport.print("AT+CIPSEND="); // ответ клиенту ESPport.print(ch_id); ESPport.print(","); ESPport.println(Header.length()+Content.length()); delay(20); if(ESPport.find(">")) { ESPport.print(Header); ESPport.print(Content); delay(200); } } /////////////////////отправка АТ-команд///////////////////// String GetResponse(String AT_Command, int wait) { String tmpData; ESPport.println(AT_Command); delay(wait); while (ESPport.available() >0 ) { char c = ESPport.read(); tmpData += c; if ( tmpData.indexOf(AT_Command) > -1 ) tmpData = ""; else tmpData.trim(); } return tmpData; } //////////////////////очистка ESPport//////////////////// void clearSerialBuffer(void) { while ( ESPport.available() > 0 ) { ESPport.read(); } } ////////////////////очистка буфера//////////////////////// void clearBuffer(void) { for (int i =0;i<BUFFER_SIZE;i++ ) { buffer[i]=0; } } ////////////////////подключение к wifi///////////////////// boolean connectWiFi(String NetworkSSID,String NetworkPASS) { String cmd = "AT+CWJAP=\""; cmd += NetworkSSID; cmd += "\",\""; cmd += NetworkPASS; cmd += "\""; Serial.println(cmd); Serial.println(GetResponse(cmd,6500)); }
веб сервер запускается и работает, с сонара данные получает и пишет в setup блоке,
Serial.print(sonar.ping_cm());
переношу в loop - отказывается компилировать и выдает кучу ошибок:
C:\Users\intel\Documents\Arduino\wifi_super\wifi_super.ino: In function 'void otvet_klienty(int)': C:\Users\intel\Documents\Arduino\wifi_super\wifi_super.ino:130:22: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] if(ESPport.find(">")) ^ C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main': C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: unable to find a register to spill in class 'NO_REGS' } ^ C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: this is the insn: (insn 562 559 565 15 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8]) (subreg:QI (reg/f:HI 369) 1)) C:\Users\intel\Documents\Arduino\wifi_super\wifi_super.ino:64 1 {pushqi1} (expr_list:REG_ARGS_SIZE (const_int 7 [0x7]) (nil))) C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing out lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed collect2.exe: error: ld returned 1 exit status exit status 1 Ошибка компиляции для платы Arduino/Genuino Mega or Mega 2560.
как победить?
Что и куда Вы переносите? Потрудитесь, пожалуйста, выложить ТОТ САМЫЙ скетч, который не нравится компилятору.
И сделайте так, чтобы в сообщении компилятора сохранились оригинальные переводы строк (например, выложите сообщение тоже как код).
Во, блин, опять куски на Лиспе
(insn 562 559 565 15 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8]) (subreg:QI (reg/f:HI 369) 1)) (expr_list:REG_ARGS_SIZE (const_int 7 [0x7]) (nil)))
это и есть то самый код.
если пишу
Serial.print(sonar.ping_cm());
в setupe он выводит в порт, пишу в loope выдает ошибки
Во, блин, опять куски на Лиспе (insn 562 559 565 15 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8]) (subreg:QI (reg/f:HI 369) 1)) (expr_list:REG_ARGS_SIZE (const_int 7 [0x7]) (nil)))
не посвященым не вникать?
Выложите (или дайте сыслку), пожалуйста, библиотеку NewPing
можно и без библиотеки
есть два скетча первый отсюда
https://istarik.ru/blog/esp8266/29.html
он создает веб сервер выводит адрес. по адресу в браузере можно подключится к esp8266 видеть состояние лампочки и включать выключать ее. Второй скетч любой с сонаром sr04. Причем что с библиотекой что без. например :
задача: данные сонара (второго скетча) вывести в первом скетче в ответе клиенту:
Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> " + vklotkl; Content += "</form></body></html>";
вместо переменной vklotkl
Этот скетч нормально компилируется.
Дайте мне скетч, который вызывает ошибку со всем его потрохами (библиотеками), чтобы я мог повторить ошибку у себя.
прошу прощения но иначе как чудом не могу объяснить. Отключил датчик и есп модуль (чтобы на работе завтра на другой плате попробывать). Залил скетч чтобы скопировать ошибку, залился без ошибок. Подключил назад модуль и датчик, и о чудо работает!!!! Крайне удивлен и прошу прощения за потраченное время.
а нет снова та же ошибка, скетч выложу завтра с работы уже плохо соображаю
скетч выложу завтра с работы уже плохо соображаю
казнить нельзя помиловать
и снова здравствуйте
вот скетч который не компилируется:
пишет:
если в блоке:
вместо
написать например
то все компилируется и работает. Запускается веб сервер, по адресу пишет растояние 50.
отдельно скетч определения расстояния откуда копирую код
тоже работает. Что я не так связываю? И что за ошибки?
И что за ошибки?
С такой проблемой сталкиваюсь второй раз. Пока могу сказать, что это в любом случае не Ваша ошибка, но Вы её чем-то провоцируете. Сегодня в течение дня найду время заняться и, надеюсь, разберусь как убрать провокацию.
В IDE 1.6.5 компилируется хорошо
В 1.8.1 ошибка вылазит
Попробую скачать старую иде, отпишусь
Хорошо, а я попробую разобраться с этой.
Только не обещаю прямо сейчас, но в течение дня найду время.
Поставил 1.6.5 скомпилировал - отказался вгружать.
1.6.3 скомпилировал вгрузил но работает не коректно.
веб страница не всегда отображается, но чаще отображается. А данные с датчика хоть и меняются от изменения расстояния, но не пропорционально и совсем не похожи на сантиметры
Поставил 1.6.5 скомпилировал - отказался вгружать.
1.6.3 скомпилировал вгрузил но работает не коректно.
веб страница не всегда отображается, но чаще отображается. А данные с датчика хоть и меняются от изменения расстояния, но не пропорционально и совсем не похожи на сантиметры
Это уже скорее всего проблема кода как такового.
В общем, по изначальному сообщению. Там написано (в Вашем сообщении) что ломается "lto-wrapper failed". Причины (что с ним) ясны не до конца. Скорее всего, какая-то часть файлов поставляемых уже скомпилированными, компилировалась без lto - а это неправильно. По идее, если используется lto то все файлы должны компилироваться с этой опцией, и линкер надо запускать с нею же.
Простое решение таково (отказаться от использования lto):
1. Находите файл <где стоит IDE>\hardware\arduino\avr\platform.txt
2. В нём заменяете все вождения контекста "-flto" на, например, пробел
3. Перезапускаете IDE и всё компилируется (проверял на 1.8.1).
Рещение хреновое, т.к. lto не самая бесполезная вещь, но более глобально разбираться и заставлять его работать - совсем другое время требуется. Попробуйте запостить кейс на сайте разработчиков IDE. Пусть они заставляют это работать.
может не правильно что то понял в моем файле platform.txt следущее
и как понимаю нет никаких -flto
arduino ide 1.8.1
Это не тот файл.
Давайте так, у меня IDE установлена по адресу C:\Arduino\arduino-1.8.1\ . У Вас, возможно, в другом месте. Поэтому делайте поправку на корневую папку.
Так вот
Этот файл, что Вы показваете, находится в папке
C:\Arduino\arduino-1.8.1\hardware
а Вам нужен файл из папки
C:\Arduino\arduino-1.8.1\hardware\arduino\avr
Он там есть, посмотрите.
Ну, чё, помогло?
да) Все работает как и хотел!
счас попробую остальные три дальномера добавить, а чем черевато отключение этого lto?
а чем черевато отключение этого lto?
Менее интеллектуально будет выбрасывать из кода неиспользуемые функции.
Вот смотрите. Если Вы описали в программе какую-нибудь функцию и ни разу нигде её не вызываете, её по идее не нужно включать в окончательный загружаемый код. Тут всё зависит от того, как именно Вы её описали
В втором случае kakaya_to_funkciya_2 будет выброшена самим компилятором и тут проблем нет и lto не при делах.
В первом же случае компилятор не может выбросить функцию kakaya_to_funkciya_1, т.к. она может вызываться из других файлов, а компилятору это неоткуда узнать - он только с одним файлом работает.
Эту функцию скорее всего выбросит компоновщик. Но это "скорее всего". Возможны варианты при которых он не поймёт, что она не нужна и оставит её в коде от греха подальше.
Так вот lto - это совместная техника компилятора и компоновщика. Первый помечает функции, которые в данном файле не нужны, а второй, основываясь на этих пометках и на своём собственном анализе, выбрасывает реально ненужные функции более надёжно, чем он может это сделать без lto-шных пометок.
Понятен механизм?
Чтобы это работало надо включать lto и при компиляции, и при компоновке. А ошибка возникакет скорее всего из-за того. что часть файлов была скомпилирована без lto и компоновщик не может найти никаких пометок и это его иногда сводит с ума.
И, кстати, надеюсь, теперь Вам будет понятен совет: если Вы пишете функцию (или описываете глобальную переменную), которую не предполагаете вызывать из других файлов, не поленитесь использовать слово static. Этим Вы облегчите жизнь компилятору и гарантированно получите правильную оптимизацию.
Евгений большое спасибо за помощь и пояснения!
планирую сделать прикольную штуку, но именно с ардуино это мой первый проект.
Если интересно , вкраце, автоматизированный стеллаж хранения металла.
четыре телеги заезжают на двигателях в этажерку друг над другом, для экономии места на производсвтенном участке.
arduino позволит через веб интерфейс выдвивгать необходимую полку с металлом, и показывать анимацию. будет доступно как с компюьтера так и с телефона.
а сонары нужны чтобы определять расстояние до телег для позиционирования
Круто! У меня вот проблема с позиционированием тележки. Я правда хочу это "в чистом поле" делать, никак не могу придумать как её позиционировать точнее, чем по GPS :(
Круто! У меня вот проблема с позиционированием тележки. Я правда хочу это "в чистом поле" делать, никак не могу придумать как её позиционировать точнее, чем по GPS :(
смотри какая тема
Режим RTK обеспечивает в реальном времени точность порядка 1 см в плане и 2 см по высоте.
https://ru.wikipedia.org/wiki/GPS