Forum: Compiler & IDEs -Os optimiert wichtigen Code weg


von Slowflyer (Gast)


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
1
#define
2
activate_emitter()    PORTC&=~((1<<K_1)|(1<<K_2));PORTB&=~(1<<K_4);PORTD&=~(1<<K_3)  //
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

von Slowflyer (Gast)


Lesenswert?

Hmm...

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

von A.K. (Gast)


Lesenswert?

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

von Slowflyer (Gast)


Lesenswert?

1
if (state.actual == IDLE)    // Wenn derzeit nichts gemacht wird
2
{  
3
  state.var = 0;        // Hilfsvariable löschen
4
  
5
6
  switch (uart0.in_buffer[0])  // Befehl erkennen
7
  {        
8
    case FOR:                                  
9
      if (increase_count())
10
      {
11
        state.actual = FURL;              
12
        speed_1 = FAST_IN;      // Startgeschwindigkeit
13
        speed_2 = SLOW_IN;
14
        activate_emitter();      // Lichtschranken aktivieren            
15
      }
16
    break;
17
18
    case BACK:              
19
      if (decrease_bill(&bill_counter))
20
      {  
21
        state.actual = UNROLL;      
22
        speed_1 = SLOW_OUT;        // Startgeschwindigkeit
23
        speed_2 = FAST_OUT;
24
        activate_emitter();      // Lichtschranken aktivieren
25
      }
26
    break;
27
28
    #ifdef BUGTRACKING
29
    default:          // keine Anweisung erkannt          
30
      bug.occured = true;    // Fehlerbericht        
31
      bug.code = NO_COMMAND;
32
      deactivate_emitter();  // LS aus
33
    break;  
34
    #endif
35
          
36
  }// switch (uart0.in_buffer[0])

von Reiner (Gast)


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

von peter dannegger (Gast)


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

von Slowflyer (Gast)


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

von Stefan K. (_sk_)


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

von Slowflyer (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.