Stránka 1 z 1

Optimalizace kódu

Napsal: 11 dub 2024, 17:58
od Axamith
Mám rozpracovaný na mé poměry dosti složitý kód, dostal jsem se do situace, kdy flash paměť byla z 95 % zaplněna. Pustil jsem se do optimalizace. Dostal jsem se na cca 80%. Když jsem "uklízel v setupu, zjistil jsem zajímavou věc. Mám tam kus kódu, který mi vypisuje hodnoty z EEPROM. Běžně ho mám zakomentovaný a jen když potřebuji info, uvolním ho.
Zakomentavaný kód dává velikost programu 79 %
Když ho uvolním, tak 68 % (???)
když tuto část kódu smažu, program má opět 79 %

Přikládám část Setup, ve kterém je zakomentovaná sporná část vypisující eeprom. Nevkládám celý kód, je to přes 2000 řádků kódu ...
Napadá někoho, proč se takto zvláštně chová?

Kód: Vybrat vše

void setup() {
  Serial.begin(9600);
/*
//===============  
for (long i = 0; i <= adressMax; i++) {
    if (countE == 0) {
      Serial.print("EEPROM ");
      Serial.print(i);
      Serial.print(": ");
    }
    Serial.print(EEPROM.read(i));
    countE ++;
    if (countE < 10) Serial.print(", ");
    if (countE == 10) {
      Serial.println();
      countE = 0;
    }
  }
  while (1) delay(1000);
//===============
*/

RezimPrace = 0;
ss = 0;
mode = 0; // 0 = listovani PGM, 1 = zvratny, 2 = radialni, 3 = manual L, 4 = manual R
pgm = 1;

  SetupMillis = SetupMillis * 1000; // převod sec. na milisec.
  LCD_head ();
  Keypad(); // čtení klávesnice
  setup_progressbar();

      if (ZnakKey == 65)  { // Menu nastaveni >>> F1
            AktualMillis = millis();
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Setup program");
            SettingMode = 1;
            KeyValue = 1;
           // edit_pgm = 99;
            delay(1000);          
            menu ();
}
      if (ZnakKey == 66)  { // Nastaveni zrychlení motoru >>> F2
            AktualMillis = millis();
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Setup motor");
            SettingMode = 2;
            KeyValue = 1;
            delay(1000);
            Setupmotor ();
}            
      if (ZnakKey == 68)  { // Tovarni nastaveni >>> F4
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Original settings");
            delay(2000);
  EEPROM.write(200, 255); // priprava pro reset EEPROM
  EepromSetings ();
   }
  for(int i=5;i<9;i++){ // nastavení pinu PWM
   pinMode(i,OUTPUT);
  }
   for(int i=5;i<9;i++){ // pocatecni stav pinu PWM
   digitalWrite(i,LOW);
  }

}


Re: Optimalizace kódu

Napsal: 11 dub 2024, 18:51
od AstroMiK
Jen nepotvrzená teorie:
Myslím, že když překladač zjistil, že by se mu celý kód (včetně té odkomentované části) už nevešel do procesoru, tak zapnul vyšší optimalizaci.

Re: Optimalizace kódu

Napsal: 11 dub 2024, 19:19
od Axamith
Teoreticky ano. Je zajímavé, že se nesnažil optimalizovat při zaplnění paměti na 95 %. Úprava jiné části kódu se takhle nechovala, alespoň jsem ji nezaregistroval.
Jako vedlejší produkt celé akce je, že jsem se naučil psát kód úsporněji :-D

Re: Optimalizace kódu

Napsal: 12 dub 2024, 02:15
od gilhad
Pokud se ti celý program vejde do flash, tak ho není potřeba zmenšovat z je jedno, jestli je flash zaplněná z půlky, 90%, nebo nezbývá ani jeden volný byte.
Teprve až začne jeden volný byte chybět, je nutno to potimalizovat na velikost..
(Není chyba psát úsporně od začátku, ale je chyba přehnaně optimalizovat, dokud program není plně funkční a není potřeba nějakou optimalizaci dělat - půlka flash volná ti nijak nepomůže - teda až na to, že můžeš v budoucnu přidávat další a dlaší kód)

Re: Optimalizace kódu

Napsal: 12 dub 2024, 02:18
od gilhad
Ještě jak koukám na ten kód, tak po jeho odkomentování může překladač dojít k závěru, že po while(1) už nic dalšího nepoběží a tak odoptimalizovat konec té funkce :)

Re: Optimalizace kódu

Napsal: 12 dub 2024, 15:55
od Axamith
Hřebíček na hlavičku, dělalo to while (1).
Optimalizaci jsem začal dělat při cca 95 % flash a když jsem viděl, co toho ještě musím dopsat.