в общем всё даже интересней вот мой нубокод Код (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 уперлось это просто счетчик но если я его делаю локальным (естественно весь код перестает работать) то получаю но стоит сделать глобальной честно я не понимаю как одна целочисленная переменная утягивает ппцсколько ресурсов....
А через параметры функций переменные не судьба передавать? У меня сейчас в разработке устройство, которое не использует ОЗУ вообще. Не, там ОЗУ, конечно, будет использоваться под буфер, но и всё. Глобальные переменные объявляю, когда уже совсем никак (для прерываний, например). Локальные переменные используют регистры, глобальные - ОЗУ.
Это результат оптимизации. Если переменная является локальной, то её значение всегда будет '0'. Соответственно значение переменной 'fix' всегда будет тоже '0'. Как следствие весь код: Код (C++): if(fix == 1) { .............. } можно смело выкидывать из бинарника скетча. Что собственно компилятор и делает.
Речь не вообще, а о конкретно этой переменной. Она в начале блока иннициализируется csv=0 и больше во всем коде не меняется.
дак и стоит "безжалосный" Пропробуй в начало .ino вставить #pragma GCC optimize "O2" и потом подставить разные O. От О0 до О3 и посмотри. по умолчанию стоит O2 - оптимизация по размеру
ясно спс но теперь новый вопрос -------- есть код (вложение) и непонятная мне проблема если я использую gps.distanceBetween, то начинает считать пройденный путь, но ПЕРЕСТАЕТ определять скорость и курс!, .... я пробовал выдрать эту функцию из библиотеки и отдельно положить - результат тотже, или скорость/курс или дистанция.... но почему вместе не работает, не понимаю.... может не хватает ресурсов 328 меги?
ковыряй библу или пиши сам с нуля. Чего именно не хватает? А то под понятие ресурс можно и ноги подвести.
жпс приемник отдает дата/время, жпс координаты , скорость и направление движение (курс) но такео впечатление, что функция расчета пути между координат чтото такое делает, изза чего перестают работать другие функции....хотя в ней по сути просто несколько математических операций....
и заметил, что в момент обнуления переменной, в которой хранится пройденный путь (инт) - скорость и курс тоже обновляются