Ошибка компилятора, помогите!
- Войдите на сайт для отправки комментариев
Доброго времени суток, задача получить показания с сонара 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 выдает ошибки
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 583 580 586 16 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8]) (subreg:QI (reg/f:HI 384) 1)) C:\Users\intel\Documents\Arduino\wifi_super\wifi_super.ino:73 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)))
не посвященым не вникать?
Выложите (или дайте сыслку), пожалуйста, библиотеку NewPing
можно и без библиотеки
есть два скетча первый отсюда
https://istarik.ru/blog/esp8266/29.html
он создает веб сервер выводит адрес. по адресу в браузере можно подключится к esp8266 видеть состояние лампочки и включать выключать ее. Второй скетч любой с сонаром sr04. Причем что с библиотекой что без. например :
int echoPin = 9; int trigPin = 8; void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { int duration, cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; Serial.print(cm); Serial.println(" cm"); delay(100);}задача: данные сонара (второго скетча) вывести в первом скетче в ответе клиенту:
Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> " + vklotkl; Content += "</form></body></html>";
вместо переменной vklotkl
Этот скетч нормально компилируется.
int echoPin = 9; int trigPin = 8; void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { int duration, cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; Serial.print(cm); Serial.println(" cm"); delay(100); }Дайте мне скетч, который вызывает ошибку со всем его потрохами (библиотеками), чтобы я мог повторить ошибку у себя.
прошу прощения но иначе как чудом не могу объяснить. Отключил датчик и есп модуль (чтобы на работе завтра на другой плате попробывать). Залил скетч чтобы скопировать ошибку, залился без ошибок. Подключил назад модуль и датчик, и о чудо работает!!!! Крайне удивлен и прошу прощения за потраченное время.
а нет снова та же ошибка, скетч выложу завтра с работы уже плохо соображаю
скетч выложу завтра с работы уже плохо соображаю
казнить нельзя помиловать
и снова здравствуйте
вот скетч который не компилируется:
#include <SoftwareSerial.h> SoftwareSerial ESPport(10, 11); #define BUFFER_SIZE 128 char buffer[BUFFER_SIZE]; int echoPin = 9; int trigPin = 8; void setup() { pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); // Serial.begin(115200); // Терминал // ESPport.begin(115200); // ESP8266 webserver(); } ///////////////////основной цикл, принимает запрос от клиента/////////////////// void loop() { //getDistance(); int ch_id, packet_len, d; 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(); otvet_klienty(ch_id); } } } clearBuffer(); } //////////////////////формирование ответа клиенту//////////////////// void otvet_klienty(int ch_id) { float duration,cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; //cm=50; String Header; Header = "HTTP/1.1 200 OK\r\n"; Header += "Content-Type: text/html\r\n"; Header += "Connection: close\r\n"; String Content; Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> "+String(cm); 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)); } void webserver(){ 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)); // режим клиента Serial.println(GetResponse("AT+CWDHCP=1,0",300)); // режим клиента Serial.println(GetResponse("AT+CIPSTA=\"*.209\",\"*.1\",\"255.255.255.0\"",300)); // ip connectWiFi("**","**pas"); // подключаемся к домашнему роутеру (имя точки, пароль) 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)); // узнаём адрес }пишет:
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:90: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 671 668 674 37 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0 S1 A8]) (subreg:QI (reg/f:HI 450) 1)) C:\Users\Intel\Documents\Arduino\wifi_super\wifi_super.ino:32 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 Uno.если в блоке:
//////////////////////формирование ответа клиенту//////////////////// void otvet_klienty(int ch_id) { float duration,cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; //cm=50; String Header; Header = "HTTP/1.1 200 OK\r\n"; Header += "Content-Type: text/html\r\n"; Header += "Connection: close\r\n"; String Content; Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> "+String(cm); 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); } }вместо
float duration,cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; //cm=50;написать например
float duration,cm; cm=50;то все компилируется и работает. Запускается веб сервер, по адресу пишет растояние 50.
отдельно скетч определения расстояния откуда копирую код
int echoPin = 9; int trigPin = 8; void setup(){ Serial.begin(9600); pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); } void loop(){ int duration,cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration =pulseIn(echoPin, HIGH); cm = duration / 58; Serial.print(cm); Serial.println(" cm"); delay(100); }тоже работает. Что я не так связываю? И что за ошибки?
И что за ошибки?
С такой проблемой сталкиваюсь второй раз. Пока могу сказать, что это в любом случае не Ваша ошибка, но Вы её чем-то провоцируете. Сегодня в течение дня найду время заняться и, надеюсь, разберусь как убрать провокацию.
В 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 следущее
# ctags # ------------------------------ tools.ctags.path={runtime.tools.ctags.path} tools.ctags.cmd.path={path}/ctags tools.ctags.pattern="{cmd.path}" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "{source_file}" # additional entries tools.avrdude.path={runtime.tools.avrdude.path} preproc.macros.flags=-w -x c++ -E -CC #preproc.macros.compatibility_flags={build.mbed_api_include} {build.nRF51822_api_include} {build.ble_api_include} {compiler.libsam.c.flags} {compiler.arm.cmsis.path} {build.variant_system_include} #recipe.preproc.macros="{compiler.path}{compiler.cpp.cmd}" {compiler.cpreprocessor.flags} {compiler.cpp.flags} {preproc.macros.flags} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {preproc.macros.compatibility_flags} {includes} "{source_file}" -o "{preprocessed_file_path}"и как понимаю нет никаких -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?
Менее интеллектуально будет выбрасывать из кода неиспользуемые функции.
Вот смотрите. Если Вы описали в программе какую-нибудь функцию и ни разу нигде её не вызываете, её по идее не нужно включать в окончательный загружаемый код. Тут всё зависит от того, как именно Вы её описали
// Случай №1 void kakaya_to_funkciya_1(void) { .... } // Случай №2 static void kakaya_to_funkciya_2(void) { .... }В втором случае 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