Ошибка компилятора, помогите!

intel174
Offline
Зарегистрирован: 29.03.2017

Доброго времени суток, задача получить показания с сонара sr04 через esp8266 по wifi Arduino Mega есть скетч

001#include <NewPing.h>
002 HardwareSerial & ESPport = Serial1;
003 
004const int ledPin =  13;    
005int ledState = HIGH;          
006#define BUFFER_SIZE 128
007char buffer[BUFFER_SIZE];
008String vklotkl;
009 
010#define TRIGGER_PIN  9
011#define ECHO_PIN     8
012#define MAX_DISTANCE 200
013NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
014 
015void setup()
016{
017   
018  pinMode(ledPin, OUTPUT);       
019  Serial.begin(115200); // Терминал
020  ESPport.begin(115200); // ESP8266 
021  Serial.println(GetResponse("AT+CIOBAUD=9600",100));
022  Serial.begin(9600); // Терминал
023  ESPport.begin(9600); // ESP8266 
024  clearSerialBuffer();
025  Serial.println("RESET 3,5 sek");
026  Serial.println(GetResponse("AT+RST",3400)); // перезагрузка ESP
027  Serial.println(GetResponse("AT+CWMODE=1",300)); // режим клиента  
028  connectWiFi("****","****"); // подключаемся к домашнему роутеру (имя точки, пароль)
029  Serial.println(GetResponse("AT+CIPMODE=0",300)); // сквозной режим передачи данных.
030  Serial.println(GetResponse("AT+CIPMUX=1",300)); // multiple connection.
031  Serial.print("Start TCP-server: ");
032  Serial.println(GetResponse("AT+CIPSERVER=1,88", 300)); // запускаем ТСР-сервер на 88-ом порту
033  Serial.println(GetResponse("AT+CIPSTO=2", 300)); // таймаут сервера 2 сек
034  Serial.println(GetResponse("AT+CIFSR", 300)); // узнаём адрес
035  digitalWrite(ledPin,ledState);
036 
037  Serial.print(sonar.ping_cm());
038}
039 
040///////////////////основной цикл, принимает запрос от клиента///////////////////
041void loop()
042{
043 
044  Serial.print(sonar.ping_cm());
045 
046 int ch_id, packet_len;
047 char *pb; 
048 
049 
050 
051 ESPport.readBytesUntil('\n', buffer, BUFFER_SIZE);
052   
053 if(strncmp(buffer, "+IPD,", 5)==0)
054  {
055 
056   sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
057   if (packet_len > 0)
058    {
059      pb = buffer+5;
060      while(*pb!=':') pb++;
061      pb++;
062      if((strncmp(pb, "GET / ", 6) == 0) || (strncmp(pb, "GET /?", 6) == 0))
063       {
064          
065        Serial.println(buffer);
066        Serial.print("get led from ch :");
067        Serial.println(ch_id);
068        delay(100);
069        clearSerialBuffer();
070         
071        if(ledState == LOW)
072          {
073            ledState = HIGH;
074            vklotkl = "VKL";
075          }
076         
077        else
078          {
079            ledState = LOW;
080            vklotkl = "OTKL";
081          }
082         
083        digitalWrite(ledPin, ledState);
084 
085 
086         
087        otvet_klienty(ch_id);
088       }
089    }
090  }
091  clearBuffer();
092}
093 
094//////////////////////формирование ответа клиенту////////////////////
095void otvet_klienty(int ch_id)
096{
097  String Header;
098 
099  Header =  "HTTP/1.1 200 OK\r\n";
100  Header += "Content-Type: text/html\r\n";
101  Header += "Connection: close\r\n"
102   
103  String Content;
104  //float d_1 = us_1.Ranging(CM);   // get distance
105  //float d_2 = us_2.Ranging(CM);   // get distance
106  //float d_3 = us_3.Ranging(CM);   // get distance
107 
108 
109  Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> "+vklotkl;
110  Content += "</form></body></html>";
111  
112  Header += "Content-Length: ";
113  Header += (int)(Content.length());
114  Header += "\r\n\r\n";
115   
116  ESPport.print("AT+CIPSEND="); // ответ клиенту
117  ESPport.print(ch_id);
118  ESPport.print(",");
119  ESPport.println(Header.length()+Content.length());
120  delay(20);
121 
122  if(ESPport.find(">"))
123    {
124      ESPport.print(Header);
125      ESPport.print(Content);
126      delay(200);
127    }
128}
129/////////////////////отправка АТ-команд/////////////////////
130String GetResponse(String AT_Command, int wait)
131{
132  String tmpData;
133   
134  ESPport.println(AT_Command);
135  delay(wait);
136  while (ESPport.available() >0 ) 
137   {
138    char c = ESPport.read();
139    tmpData += c;
140     
141    if ( tmpData.indexOf(AT_Command) > -1 )        
142      tmpData = "";
143    else
144      tmpData.trim();      
145           
146   }
147  return tmpData;
148}
149//////////////////////очистка ESPport////////////////////
150void clearSerialBuffer(void)
151{
152       while ( ESPport.available() > 0 )
153       {
154         ESPport.read();
155       }
156}
157////////////////////очистка буфера////////////////////////
158void clearBuffer(void) {
159       for (int i =0;i<BUFFER_SIZE;i++ )
160       {
161         buffer[i]=0;
162       }
163}
164////////////////////подключение к wifi/////////////////////       
165boolean connectWiFi(String NetworkSSID,String NetworkPASS)
166{
167  String cmd = "AT+CWJAP=\"";
168  cmd += NetworkSSID;
169  cmd += "\",\"";
170  cmd += NetworkPASS;
171  cmd += "\"";
172  Serial.println(cmd);
173  Serial.println(GetResponse(cmd,6500));
174}

веб сервер запускается и работает, с сонара данные получает и пишет в 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.

как победить?

 

 

 

 

 

 

 

 

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

Что и куда Вы переносите? Потрудитесь, пожалуйста, выложить ТОТ САМЫЙ скетч, который не нравится компилятору.

И сделайте так, чтобы в сообщении компилятора сохранились оригинальные переводы строк (например, выложите сообщение тоже как код).

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

Во, блин, опять куски на Лиспе

(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)))

intel174
Offline
Зарегистрирован: 29.03.2017

это и есть то самый код.

если пишу

Serial.print(sonar.ping_cm());

в setupe он выводит в порт, пишу в loope выдает ошибки

 

 

01C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':
02 
03C:\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'
04 
05 }
06 
07 ^
08 
09C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: this is the insn:
10 
11(insn 583 580 586 16 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0  S1 A8])
12 
13        (subreg:QI (reg/f:HI 384) 1)) C:\Users\intel\Documents\Arduino\wifi_super\wifi_super.ino:73 1 {pushqi1}
14 
15     (expr_list:REG_ARGS_SIZE (const_int 7 [0x7])
16 
17        (nil)))
18 
19C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing out
20 
21lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status
22 
23c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed
24 
25collect2.exe: error: ld returned 1 exit status
26 
27exit status 1
28Ошибка компиляции для платы Arduino/Genuino Mega or Mega 2560.
intel174
Offline
Зарегистрирован: 29.03.2017

Во, блин, опять куски на Лиспе (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)))

 

не посвященым не вникать?

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

Выложите (или дайте сыслку), пожалуйста, библиотеку NewPing

intel174
Offline
Зарегистрирован: 29.03.2017

можно и без библиотеки

есть два скетча первый отсюда

https://istarik.ru/blog/esp8266/29.html

он создает веб сервер выводит адрес. по адресу в браузере можно подключится к esp8266 видеть состояние лампочки и включать выключать ее. Второй скетч любой с сонаром sr04. Причем что с библиотекой что без. например :

1int 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

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

Этот скетч нормально компилируется.

01int echoPin = 9;
02int trigPin = 8;
03void setup() {
04  Serial.begin (9600);
05  pinMode(trigPin, OUTPUT);
06  pinMode(echoPin, INPUT);
07}
08void loop() {
09  int duration, cm;
10  digitalWrite(trigPin, LOW);
11  delayMicroseconds(2);
12  digitalWrite(trigPin, HIGH);
13  delayMicroseconds(10);
14  digitalWrite(trigPin, LOW);
15  duration = pulseIn(echoPin, HIGH);
16  cm = duration / 58;
17  Serial.print(cm);
18  Serial.println(" cm");
19  delay(100);
20}
Изменена опция сборки, пересобираем все
Sketch uses 3 200 bytes (10%) of program storage space. Maximum is 30 720 bytes.
Global variables use 210 bytes (10%) of dynamic memory, leaving 1 838 bytes for local variables. Maximum is 2 048 bytes.

Дайте мне скетч, который вызывает ошибку со всем его потрохами (библиотеками), чтобы я мог повторить ошибку у себя.

intel174
Offline
Зарегистрирован: 29.03.2017

прошу прощения но иначе как чудом не могу объяснить. Отключил датчик и есп модуль (чтобы на работе завтра на другой плате попробывать). Залил скетч чтобы скопировать ошибку, залился без ошибок. Подключил назад модуль и датчик, и о чудо работает!!!! Крайне удивлен и прошу прощения за потраченное время.

intel174
Offline
Зарегистрирован: 29.03.2017

а нет снова та же ошибка, скетч выложу завтра с работы уже плохо соображаю

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

intel174 пишет:

скетч выложу завтра с работы уже плохо соображаю

казнить нельзя помиловать

intel174
Offline
Зарегистрирован: 29.03.2017

и снова здравствуйте

вот скетч который не компилируется:

001#include <SoftwareSerial.h>
002SoftwareSerial ESPport(10, 11);
003  
004#define BUFFER_SIZE 128
005char buffer[BUFFER_SIZE];
006int echoPin = 9;
007int trigPin = 8;
008void setup()
009{
010  pinMode(trigPin,OUTPUT);
011  pinMode(echoPin,INPUT);
012   
013//  Serial.begin(115200); // Терминал
014//  ESPport.begin(115200); // ESP8266 
015 
016  webserver(); 
017 
018   
019}
020///////////////////основной цикл, принимает запрос от клиента///////////////////
021void loop()
022{
023 //getDistance();
024 int ch_id, packet_len, d;
025 char *pb; 
026 
027 
028 
029 ESPport.readBytesUntil('\n', buffer, BUFFER_SIZE);
030   
031 if(strncmp(buffer, "+IPD,", 5)==0){  
032   sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
033   if (packet_len > 0)
034    {
035      pb = buffer+5;
036      while(*pb!=':') pb++;
037      pb++;
038      if((strncmp(pb, "GET / ", 6) == 0) || (strncmp(pb, "GET /?", 6) == 0))
039       {
040        Serial.println(buffer);
041        Serial.print("get led from ch :");
042        Serial.println(ch_id);
043        delay(100);
044        clearSerialBuffer();
045         
046        otvet_klienty(ch_id);
047       }
048    }
049  }
050  clearBuffer();
051}
052 
053 
054 
055 
056//////////////////////формирование ответа клиенту////////////////////
057void otvet_klienty(int ch_id)
058{
059    float duration,cm;
060    digitalWrite(trigPin, LOW);
061    delayMicroseconds(2);
062    digitalWrite(trigPin, HIGH);
063    delayMicroseconds(10);
064    digitalWrite(trigPin, LOW);
065    duration = pulseIn(echoPin, HIGH);
066    cm = duration / 58;
067    //cm=50;
068     
069  String Header;
070 
071  Header =  "HTTP/1.1 200 OK\r\n";
072  Header += "Content-Type: text/html\r\n";
073  Header += "Connection: close\r\n"
074 
075  String Content;
076     
077  Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> "+String(cm);
078  Content += "</form></body></html>";
079  
080  Header += "Content-Length: ";
081  Header += (int)(Content.length());
082  Header += "\r\n\r\n";
083   
084  ESPport.print("AT+CIPSEND="); // ответ клиенту
085  ESPport.print(ch_id);
086  ESPport.print(",");
087  ESPport.println(Header.length()+Content.length());
088  delay(20);
089 
090  if(ESPport.find(">"))
091    {
092      ESPport.print(Header);
093      ESPport.print(Content);
094      delay(200);
095    }
096}
097/////////////////////отправка АТ-команд/////////////////////
098String GetResponse(String AT_Command, int wait)
099{
100  String tmpData;
101   
102  ESPport.println(AT_Command);
103  delay(wait);
104  while (ESPport.available() >0 ) 
105   {
106    char c = ESPport.read();
107    tmpData += c;
108     
109    if ( tmpData.indexOf(AT_Command) > -1 )        
110      tmpData = "";
111    else
112      tmpData.trim();      
113           
114   }
115  return tmpData;
116}
117//////////////////////очистка ESPport////////////////////
118void clearSerialBuffer(void)
119{
120       while ( ESPport.available() > 0 )
121       {
122         ESPport.read();
123       }
124}
125////////////////////очистка буфера////////////////////////
126void clearBuffer(void) {
127       for (int i =0;i<BUFFER_SIZE;i++ )
128       {
129         buffer[i]=0;
130       }
131}
132////////////////////подключение к wifi/////////////////////       
133boolean connectWiFi(String NetworkSSID,String NetworkPASS)
134{
135  String cmd = "AT+CWJAP=\"";
136  cmd += NetworkSSID;
137  cmd += "\",\"";
138  cmd += NetworkPASS;
139  cmd += "\"";
140  Serial.println(cmd);
141  Serial.println(GetResponse(cmd,6500));
142}
143 
144void webserver(){
145   Serial.println(GetResponse("AT+CIOBAUD=9600",100));
146  Serial.begin(9600); // Терминал
147  ESPport.begin(9600); // ESP8266 
148  clearSerialBuffer();
149  Serial.println("RESET 3,5 sek");
150  Serial.println(GetResponse("AT+RST",3400)); // перезагрузка ESP
151  Serial.println(GetResponse("AT+CWMODE=1",300)); // режим клиента 
152  Serial.println(GetResponse("AT+CWDHCP=1,0",300)); // режим клиента  
153  Serial.println(GetResponse("AT+CIPSTA=\"*.209\",\"*.1\",\"255.255.255.0\"",300)); // ip
154  connectWiFi("**","**pas"); // подключаемся к домашнему роутеру (имя точки, пароль)
155  Serial.println(GetResponse("AT+CIPMODE=0",300)); // сквозной режим передачи данных.
156  Serial.println(GetResponse("AT+CIPMUX=1",300)); // multiple connection.
157  Serial.print("Start TCP-server: ");
158  Serial.println(GetResponse("AT+CIPSERVER=1,88", 300)); // запускаем ТСР-сервер на 88-ом порту
159  Serial.println(GetResponse("AT+CIPSTO=2", 300)); // таймаут сервера 2 сек
160  Serial.println(GetResponse("AT+CIFSR", 300)); // узнаём адрес
161  }
162  

пишет:

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.

если в блоке:

01//////////////////////формирование ответа клиенту////////////////////
02void otvet_klienty(int ch_id)
03{
04    float duration,cm;
05    digitalWrite(trigPin, LOW);
06    delayMicroseconds(2);
07    digitalWrite(trigPin, HIGH);
08    delayMicroseconds(10);
09    digitalWrite(trigPin, LOW);
10    duration = pulseIn(echoPin, HIGH);
11    cm = duration / 58;
12    //cm=50;
13     
14  String Header;
15 
16  Header =  "HTTP/1.1 200 OK\r\n";
17  Header += "Content-Type: text/html\r\n";
18  Header += "Connection: close\r\n"
19 
20  String Content;
21     
22  Content = "<body><form action='' method='GET'><input type='submit' value='VKL/OTKL'> "+String(cm);
23  Content += "</form></body></html>";
24  
25  Header += "Content-Length: ";
26  Header += (int)(Content.length());
27  Header += "\r\n\r\n";
28   
29  ESPport.print("AT+CIPSEND="); // ответ клиенту
30  ESPport.print(ch_id);
31  ESPport.print(",");
32  ESPport.println(Header.length()+Content.length());
33  delay(20);
34 
35  if(ESPport.find(">"))
36    {
37      ESPport.print(Header);
38      ESPport.print(Content);
39      delay(200);
40    }
41}

вместо

1float duration,cm;
2   digitalWrite(trigPin, LOW);
3   delayMicroseconds(2);
4   digitalWrite(trigPin, HIGH);
5   delayMicroseconds(10);
6   digitalWrite(trigPin, LOW);
7   duration = pulseIn(echoPin, HIGH);
8   cm = duration / 58;
9   //cm=50;

написать например

1float duration,cm;
2 
3    cm=50;

то все компилируется и работает. Запускается веб сервер, по адресу пишет растояние 50.

отдельно скетч определения расстояния откуда копирую код

01int echoPin = 9;
02int trigPin = 8;
03void setup(){
04  Serial.begin(9600);
05  pinMode(trigPin,OUTPUT);
06  pinMode(echoPin,INPUT);
07   }
08 
09   void loop(){
10    int duration,cm;
11    digitalWrite(trigPin, LOW);
12    delayMicroseconds(2);
13    digitalWrite(trigPin, HIGH);
14    delayMicroseconds(10);
15    digitalWrite(trigPin, LOW);
16    duration =pulseIn(echoPin, HIGH);
17    cm = duration / 58;
18    Serial.print(cm);
19    Serial.println(" cm");
20    delay(100);
21    }
22 
23   

тоже работает. Что я не так связываю? И что за ошибки?

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

intel174 пишет:

 И что за ошибки?

С такой проблемой сталкиваюсь второй раз. Пока могу сказать, что это в любом случае не Ваша ошибка, но Вы её чем-то провоцируете. Сегодня в течение дня найду время заняться и, надеюсь, разберусь как убрать провокацию.

В IDE 1.6.5 компилируется хорошо

В 1.8.1 ошибка вылазит

intel174
Offline
Зарегистрирован: 29.03.2017

Попробую скачать старую иде, отпишусь

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

Хорошо, а я попробую разобраться с этой.

Только не обещаю прямо сейчас, но в течение дня найду время.

intel174
Offline
Зарегистрирован: 29.03.2017

Поставил 1.6.5 скомпилировал - отказался вгружать.

1.6.3 скомпилировал вгрузил но работает не коректно.

веб страница не всегда отображается, но чаще отображается. А данные с датчика хоть и меняются от изменения расстояния, но не пропорционально и совсем не похожи на сантиметры

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

intel174 пишет:

Поставил 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. Пусть они заставляют это работать.

intel174
Offline
Зарегистрирован: 29.03.2017

может не правильно что то понял в моем файле 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

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

Это не тот файл.

Давайте так, у меня IDE установлена по адресу C:\Arduino\arduino-1.8.1\ . У Вас, возможно, в другом месте. Поэтому делайте поправку на корневую папку.

Так вот

Этот файл, что Вы показваете, находится в папке

C:\Arduino\arduino-1.8.1\hardware

а Вам нужен файл из папки

C:\Arduino\arduino-1.8.1\hardware\arduino\avr

Он там есть, посмотрите.

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

Ну, чё, помогло?

intel174
Offline
Зарегистрирован: 29.03.2017

да) Все работает как и хотел!

intel174
Offline
Зарегистрирован: 29.03.2017

счас попробую остальные три дальномера добавить, а чем черевато отключение этого lto?

 

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

intel174 пишет:

а чем черевато отключение этого lto?

Менее интеллектуально будет выбрасывать из кода неиспользуемые функции.

Вот смотрите. Если Вы описали в программе какую-нибудь функцию и ни разу нигде её не вызываете, её по идее не нужно включать в окончательный загружаемый код. Тут всё зависит от того, как именно Вы её описали

1// Случай №1
2void kakaya_to_funkciya_1(void) {
3....
4}
5 
6// Случай №2
7static void kakaya_to_funkciya_2(void) {
8....
9}

В втором случае kakaya_to_funkciya_2 будет выброшена самим компилятором и тут проблем нет и lto не при делах.

В первом же случае компилятор не может выбросить функцию kakaya_to_funkciya_1, т.к. она может вызываться из других файлов, а компилятору это неоткуда узнать - он только с одним файлом работает.

Эту функцию скорее всего выбросит компоновщик. Но это "скорее всего". Возможны варианты при которых он не поймёт, что она не нужна и оставит её в коде от греха подальше.

Так вот lto - это совместная техника компилятора и компоновщика. Первый помечает функции, которые в данном файле не нужны, а второй, основываясь на этих пометках и на своём собственном анализе, выбрасывает реально ненужные функции более надёжно, чем он может это сделать без lto-шных пометок.

Понятен механизм?

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

И, кстати, надеюсь, теперь Вам будет понятен совет: если Вы пишете функцию (или описываете глобальную переменную), которую не предполагаете вызывать из других файлов, не поленитесь использовать слово static. Этим Вы облегчите жизнь компилятору и гарантированно получите правильную оптимизацию.

intel174
Offline
Зарегистрирован: 29.03.2017

Евгений большое спасибо за помощь и пояснения!

планирую сделать прикольную штуку, но именно с ардуино это мой первый проект.

Если интересно , вкраце, автоматизированный стеллаж хранения металла.

четыре телеги заезжают на двигателях в этажерку друг над другом, для экономии места на производсвтенном участке.

arduino позволит через веб интерфейс выдвивгать необходимую полку с металлом, и показывать анимацию. будет доступно как с компюьтера так и с телефона.

а сонары нужны чтобы определять расстояние до телег для позиционирования

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

Круто! У меня вот проблема с позиционированием тележки. Я правда хочу это "в чистом поле" делать, никак не могу придумать как её позиционировать точнее, чем по GPS :(

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ЕвгенийП пишет:

Круто! У меня вот проблема с позиционированием тележки. Я правда хочу это "в чистом поле" делать, никак не могу придумать как её позиционировать точнее, чем по GPS :(

смотри какая тема

Режим RTK обеспечивает в реальном времени точность порядка 1 см в плане и 2 см по высоте.

https://ru.wikipedia.org/wiki/GPS