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

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

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

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

 

 

 

 

 

 

 

 

ЕвгенийП
ЕвгенийП аватар
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 выдает ошибки

 

 

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.
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. Причем что с библиотекой что без. например :

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

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

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

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);
}
Изменена опция сборки, пересобираем все
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

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

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

#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);
    }

   

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

ЕвгенийП
ЕвгенийП аватар
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
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. Этим Вы облегчите жизнь компилятору и гарантированно получите правильную оптимизацию.

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