mikrocontroller.net

Forum: Compiler & IDEs -Os optimiert wichtigen Code weg


Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich habe gcc (3.4.4)  mal auf die Option -Os eingestellt, um Speicher
zu sparen. Nun bin ich auf ein Phänomen gestoßen. Ich habe ein Makro
geschrieben
#define
activate_emitter()    PORTC&=~((1<<K_1)|(1<<K_2));PORTB&=~(1<<K_4);PORTD&=~(1<<K_3)  //
alle IR-Sendedioden einschalten

, das ein paar Portpins ändert. Dieses wird in meinem Programm aber
knallhart wegoptimiert. Gibt es irgendweine Möglichkeit das zu umgehen
und dem Compiler zu sagen, das muss auf jeden Fall mit rein? Oder gibt
es da andere Tricks?

Gruß Willi

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm...

Habe jetzt den Code um eine Zeile verschoben und siehe da, er wird auf
einmal mit reingenommen.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kontext, d.h. der Teil vom Programm in dem das Makro eingesetzt wird?

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (state.actual == IDLE)    // Wenn derzeit nichts gemacht wird
{  
  state.var = 0;        // Hilfsvariable löschen
  

  switch (uart0.in_buffer[0])  // Befehl erkennen
  {        
    case FOR:                                  
      if (increase_count())
      {
        state.actual = FURL;              
        speed_1 = FAST_IN;      // Startgeschwindigkeit
        speed_2 = SLOW_IN;
        activate_emitter();      // Lichtschranken aktivieren            
      }
    break;

    case BACK:              
      if (decrease_bill(&bill_counter))
      {  
        state.actual = UNROLL;      
        speed_1 = SLOW_OUT;        // Startgeschwindigkeit
        speed_2 = FAST_OUT;
        activate_emitter();      // Lichtschranken aktivieren
      }
    break;

    #ifdef BUGTRACKING
    default:          // keine Anweisung erkannt          
      bug.occured = true;    // Fehlerbericht        
      bug.code = NO_COMMAND;
      deactivate_emitter();  // LS aus
    break;  
    #endif
          
  }// switch (uart0.in_buffer[0])

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich hatte ähnliche Probleme.  Software, die mit der alten Version lief,
compiled zwar aber läuft nicht mehr fehlerfrei mit -Os.  Ich habe erst
mal wieder die alte Version installiert und will das Problem
untersuchen.

Reiner

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Willi

"Dieses wird in meinem Programm aber knallhart wegoptimiert."


Wie hast Du das denn festgestellt ?


Manchmal braucht es ne Weile, bis man durch das Assemblerlisting
durchsteigt.

Daß etwas nicht so dasteht, wie man es erwartet, heißt noch lange
nicht, daß es der Compiler falsch macht.


Bisher habe ich immer gemerkt, daß der Compiler doch recht hatte.


Peter

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

wenn man sich den erzeugten Code im Disassembler anschaut, so tauchen
die Setz-Befehle für die Ports gar nicht auf. Zumal diese wirklich
verändert werden müssen, weil sie vorher mit High initialisert wurden.
Aber vielleicht hast du ja recht, ich werde mir mal den Code genauer
ansehen. Wer weiss, vielleicht hab ich wirklich irgendwo etwas
Unsinniges stehen.

Gruß Willi

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habe jetzt den Code um eine Zeile verschoben und siehe da, er wird
> auf einmal mit reingenommen.

Du hast in Deinem Makro keine Klammerung um den Gesamtausdruck. Das
kann böse Seiteneffekte haben. Ist der Code oben der vor oder nach
Deiner Verschiebe-Änderung?

Was helfen kann: den Code nach dem Precompiler anschauen.

Gruß, Stefan

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Klammern, das könnte es sein. Der Code ist vor der Änderung, nach
der Änderung steht die Zeile mit activate zwei Zeilen höher.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du mir ein compilefähiges File als Attachment hinlegst,
würde ich mir das auch mal angucken.  Mit den Schnipseln kann
man das nicht wirklich nachvollziehen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.