очередной глупый вопрос...

Тема в разделе "Arduino & Shields", создана пользователем ELITE, 19 июн 2018.

  1. ELITE

    ELITE Гик

    в общем всё даже интересней
    вот мой нубокод
    Код (C++):
      if(gps.available())
      {
    static int cnt = 0;
    int csv = 0;
    static int fix = 0;
    static int res = 1;
    static char data[12];
        char ch=gps.read();   // Serial.print(ch);

        if(ch == '$') { cnt = 0; csv = 0; fix = 0;  }
        else
        {
          data[cnt++] = ch; /* сбор символов /**/
         
          if(ch == ',')
          {
            data[--cnt] = 0;  /* если нашли , то ставим 0 (конец строки) /**/ cnt = 0;   csv++;

            if(csv == 1)
            {
              res = strcmp(data,"GPRMC");
              if(res == 0) fix = 1;
            }

            if(fix == 1)
            {              // Serial.print(": ");Serial.println(data);
              if(csv == 2)      { time=data; hour=((data[0]-48)*10+(data[1]-48)); minute=((data[2]-48)*10+(data[3]-48)); second=((data[4]-48)*10+(data[5]-48)); }
              else if(csv == 3) { if(data[0]==65){ gps_valid=true;}else if(data[0]==86){gps_valid=false;}}
              else if(csv == 4) { data[4]=data[3];data[3]=data[2];data[2]='\0'; lat = atol(data) + ((atol(data+3)/60.0)/10000.0); }
              else if(csv == 6) { data[5]=data[4];data[4]=data[3];data[3]='\0'; lng = atol(data) + ((atol(data+4)/60.0)/10000.0); }
              else if(csv == 8) { spd = atof(data); spd>0.50?spd*=1.852:spd=0; }
              else if(csv == 9) { crs = atoi(data); }
              else if(csv == 10){ date=data; day=((data[0]-48)*10+(data[1]-48));  month=((data[2]-48)*10+(data[3]-48)); year=((data[4]-48)*10+(data[5]-48)); }
              else if(csv == 11)
              {int i=0;fix = 0;
               long dist_tmp = 0;
              if(latp==0 || lngp==0 ) {latp=lat; lngp=lng; }
              if(latp!=lat || lngp!=lng) {dist_tmp = distance_between(lat,lng,latp,lngp);  latp=lat; lngp=lng;   }
               if(dist_tmp<80){/*80м/с = 288км/ч*/
                 if(btn_b[5]){ dist=dist+dist_tmp; }
                 if(btn_b[4]){ dist=dist-dist_tmp; }
               }  
               if(gps_valid){ gps_info();
             
    /*************************************************/
                 if(fname==""){
                    fname=date+".plt";
                    sd_filename_chek:
                    Serial.println(fname);
                    if(!SD.exists(fname)){ //если файла нет такого
                        Serial.println("SD creat File "+fname);
                       LosGps = SD.open(fname, FILE_WRITE);
                       if(!LosGps){ //если НЕ удалось открыть файл
                        SD.begin(SD_CS);LosGps = SD.open(fname, FILE_WRITE);  Serial.print("SD Reopen!");  //репеподключаю и переоткрываю
                       }
                       if(LosGps) { //если удалось открыть файл
                         LosGps.println("OziExplorer Track Point File Version 2.0");
                         LosGps.println("WGS 84");
                         LosGps.println("Altitude is in Feet");
                         LosGps.println("Reserved 3");  
                         LosGps.println("0,2,255,Treck Start "+date+" "+time+",1,0,F80");    //0,ширина,цыет,название,нормально,0,цветр ржб заполнения  http://www.oziexplorer3.com/eng/help/fileformats.html
                         LosGps.println(" ");                                                //точек в треке  
                         LosGps.close();            
                       } else {Serial.print("SD NO!"); }
                     
                     } else {
                      fname = "_"+fname;
                      goto sd_filename_chek;
                     }

                    }else{
                      if(dist_tmp!=0){  Serial.println("SD write GPS");
                        LosGps = SD.open(fname, FILE_WRITE);
                        if(LosGps){
                          LosGps.print(lat,6); LosGps.print(", ");
                          LosGps.print(lng,6); LosGps.print(", 0, ");//Код - 0, если это нормально, 1, если перерыв в дорожке.
                          LosGps.print("-777, "); /*высота*///Высота в футах (-777, если не действительна).
                          LosGps.print(", "); /*время делфи*/
                          LosGps.print(date); LosGps.print(", ");
                          LosGps.print(time); LosGps.println(" ");
                        LosGps.close();
                        } else { //не удалось открыть файл!!
                           Serial.println("SD WARNING !!!! no open file!!!");
                        }
                       
                      }
                    }

    /*************************************************/
                  }else{Serial.println("GPS Sat NO SIGNAL!");}

    //           break;
              }
            }
          }
        }
      }
     
    по сути всё в переменную int csv уперлось

    это просто счетчик
    но если я его делаю локальным (естественно весь код перестает работать)
    то получаю
    но стоит сделать глобальной
    честно я не понимаю как одна целочисленная переменная утягивает ппцсколько ресурсов....
     
    Последнее редактирование: 19 июн 2018
  2. parovoZZ

    parovoZZ Гуру

    А через параметры функций переменные не судьба передавать? У меня сейчас в разработке устройство, которое не использует ОЗУ вообще. Не, там ОЗУ, конечно, будет использоваться под буфер, но и всё. Глобальные переменные объявляю, когда уже совсем никак (для прерываний, например).
    Локальные переменные используют регистры, глобальные - ОЗУ.
     
  3. AlexU

    AlexU Гуру

    Это результат оптимизации. Если переменная является локальной, то её значение всегда будет '0'. Соответственно значение переменной 'fix' всегда будет тоже '0'. Как следствие весь код:
    Код (C++):
    if(fix == 1)
    {
    ..............
    }
    можно смело выкидывать из бинарника скетча. Что собственно компилятор и делает.
     
    b707 нравится это.
  4. parovoZZ

    parovoZZ Гуру

    Это как???
     
  5. b707

    b707 Гуру

    Речь не вообще, а о конкретно этой переменной. Она в начале блока иннициализируется csv=0 и больше во всем коде не меняется.
     
  6. parovoZZ

    parovoZZ Гуру

    Ааа. Оптимизатор вырезает безжалостно всё.
    А какой уровень оптимизации в буратино иде, кто знает?
     
  7. DetSimen

    DetSimen Guest

    дак и стоит "безжалосный"
    Пропробуй в начало .ino вставить
    #pragma GCC optimize "O2"
    и потом подставить разные O. От О0 до О3 и посмотри.

    по умолчанию стоит O2 - оптимизация по размеру
     
    Последнее редактирование модератором: 20 июн 2018
  8. parovoZZ

    parovoZZ Гуру

    буратино компилятор съест прагму?
     
  9. DetSimen

    DetSimen Guest

    дак компилятору то пофиг, это тот же GCC только в разных одеждах.
     
  10. parovoZZ

    parovoZZ Гуру

    Ну я то в атмел студио =) А что там в деревянных краях - не в курсах.
     
  11. DetSimen

    DetSimen Guest

    Мона подумать, у Атмела GCC другой.
     
  12. parovoZZ

    parovoZZ Гуру

    Самый лучший у IAR. Но и самый дорогой(((
     
  13. ELITE

    ELITE Гик

    ясно спс
    но теперь новый вопрос
    --------
    есть код (вложение)

    и непонятная мне проблема
    если я использую gps.distanceBetween, то начинает считать пройденный путь, но ПЕРЕСТАЕТ определять скорость и курс!, ....

    я пробовал выдрать эту функцию из библиотеки и отдельно положить - результат тотже, или скорость/курс или дистанция....

    но почему вместе не работает, не понимаю.... может не хватает ресурсов 328 меги?
     

    Вложения:

    • fw2_v3.ino.ino
      Размер файла:
      10,8 КБ
      Просмотров:
      312
  14. parovoZZ

    parovoZZ Гуру

    ковыряй библу или пиши сам с нуля.
    Чего именно не хватает? А то под понятие ресурс можно и ноги подвести.
     
  15. ELITE

    ELITE Гик

    жпс приемник отдает дата/время, жпс координаты , скорость и направление движение (курс)

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

    ELITE Гик

    и заметил, что в момент обнуления переменной, в которой хранится пройденный путь (инт) - скорость и курс тоже обновляются
     
  17. ELITE

    ELITE Гик

    видимо 328 не тянет мой говнокод.... удалил запись на СД карту и всё начало работать....