Forum: Compiler & IDEs ATMEL-Studio6, C, wie sehe ich was wegoptimiert wird?


von Frischling (Gast)


Lesenswert?

Ich arbeite in ATMEL-Studio 6 mit C und kompiliere mit Optimization 
(-O0).
So funktioniert mein Code. Bereits mit (-O1) geht nix mehr. Wie kann ich 
mir anzeigen lassen welche Variablen oder Pointer(weil sie 
wahrscheinlich nicht volitale deklariert worden sind) denn nun 
wegoptimiert worden sind?

Vielen Dank schon mal im Voraus.

von Oliver (Gast)


Lesenswert?

Im Assemblerlisting nachschauen...

Besser:
Verstehen, was volatile macht, und wofür es gebraucht wird, und es dann 
sinnvoll einsetzten.

Oliver

von Frischling (Gast)


Lesenswert?

Danke für die schnelle Antwort.


Oliver schrieb:
> Im Assemblerlisting nachschauen...


Das hatte ich gemacht und mir den Disasembly anzeigen lassen, allerdings 
was müsste ich den lesen, wenn da an einer Stelle etwas wegoptimiert 
worden ist?

> Besser:
> Verstehen, was volatile macht, und wofür es gebraucht wird, und es dann
> sinnvoll einsetzten.
>
> Oliver

Das verstehe ich und um es noch besser zu verstehen(im Zusammenspiel mit 
dem Compiler), möchte ich es gerne auch sehen.

von Justus S. (jussa)


Lesenswert?

Frischling schrieb:
> Das hatte ich gemacht und mir den Disasembly anzeigen lassen, allerdings
> was müsste ich den lesen, wenn da an einer Stelle etwas wegoptimiert
> worden ist?

du musst den Assembler-Code natürlich auch verstehen bzw nachvollziehen, 
nicht nur lesen...

von Karl H. (kbuchegg)


Lesenswert?

Frischling schrieb:

>> Besser:
>> Verstehen, was volatile macht, und wofür es gebraucht wird, und es dann
>> sinnvoll einsetzten.
>>
>> Oliver
>
> Das verstehe ich und um es noch besser zu verstehen(im Zusammenspiel mit
> dem Compiler), möchte ich es gerne auch sehen.

Was willst du da sehen?
Dass der COmpiler manchmal Operationen, die du eigentlich erwarten 
würdest, weglässt bzw. an eine andere Stelle schiebt?


So ist das nicht weiter sinnvoll. Viel besser ist, wenn du auf C-Ebene 
verstehst, was du tun darfst, was du nicht tun darfst und wofür du von 
der Sprachdefinition her keinerlei Garantie hast. Grundsätzlich kann der 
Compiler alles umstellen und zwar bis zur Unkenntlichkeit im 
Assemblercode. Er darf alles tun, solange das sichtbare Verhalten des 
Programms nach aussen sich nicht verändert. D.h. der Compiler wird 
gnadenlos jedes Schlupfloch ausnutzen, welches du ihm aufgrund von 
Defiziten in deinen C-Kenntnissen lässt. Genau deshalb ist es auch 
wichtig, dass man die Sprache gut beherrscht und nicht nur 15% des 
Sprachumfangs kennt, die man sich so recht und schlecht in Foren 
zusammengeschnorrt bzw. in untauglichen Tutotials angelesen hat.

von Frischling (Gast)


Lesenswert?

Justus Skorps schrieb:
> Frischling schrieb:
>> Das hatte ich gemacht und mir den Disasembly anzeigen lassen, allerdings
>> was müsste ich den lesen, wenn da an einer Stelle etwas wegoptimiert
>> worden ist?
>
> du musst den Assembler-Code natürlich auch verstehen bzw nachvollziehen,
> nicht nur lesen...

Ähm ja, das ist mir auch klar, das versuche ich auch, nur beantwortet 
das die Frage nicht, oder?

von Frischling (Gast)


Lesenswert?

Karl Heinz schrieb:
> Genau deshalb ist es auch
> wichtig, dass man die Sprache gut beherrscht und nicht nur 15% des
> Sprachumfangs kennt, die man sich so recht und schlecht in Foren
> zusammengeschnorrt bzw. in untauglichen Tutotials angelesen hat.

Gut, du sagst mit jetzt, "Wenn du schnell laufen willst, musst du 
schnell laufen".

von Erdbewohner (Gast)


Lesenswert?

So viel ich weiss, gibt kein listing, wo steht was der Compiler wo 
wegoptimiert und umgestellt hat. Du kannst höchstens aufgrund des 
Assembler-Codes versuchen zu verstehen, was der Compiler gemacht hat.
Sonst stell doch mal den Quellcode rein.

von Frischling (Gast)


Lesenswert?

Erdbewohner schrieb:
> So viel ich weiss, gibt kein listing, wo steht was der Compiler wo
> wegoptimiert und umgestellt hat. Du kannst höchstens aufgrund des
> Assembler-Codes versuchen zu verstehen, was der Compiler gemacht hat.

Ich denke so werde ich es machen, danke. Ich habe auch schon die 
Vermutung, dass ich Variablen die ich im externen RAM anspreche volatile 
machen muss, da der Compiler ja gar nicht sehen/wissen kann, dass sich 
die Variable ändert/nicht ändern kann. Das schaue ich mir mit ADD-WATCH 
an und dann im Disasembly schauen was wieso passiert.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Map file...

Ansonsten: drauf geachtet, shared variablen als volatile zu deklarieren?

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


Lesenswert?

Frischling schrieb:
> Ich habe auch schon die Vermutung, dass ich Variablen die ich im
> externen RAM anspreche volatile machen muss, da der Compiler ja gar
> nicht sehen/wissen kann, dass sich die Variable ändert/nicht ändern
> kann.

Ja, das ist die Grundregel: wenn sich irgendetwas an einer Stelle
ändert, für die der Compiler es gar nicht wissen kann, dann muss man
das entsprechende Objekt als “volatile” markieren.

Der Klassiker dafür ist halt eine Variable, die aus einem
Interruptkontext heraus geändert wird, aber im Haupt-Thread dann
überwacht.  Aber es gibt natürlich auch andere Fälle.

Was für eine Art „externen RAM“ benutzt du denn da?

von Karl H. (kbuchegg)


Lesenswert?

Frischling schrieb:
> Karl Heinz schrieb:
>> Genau deshalb ist es auch
>> wichtig, dass man die Sprache gut beherrscht und nicht nur 15% des
>> Sprachumfangs kennt, die man sich so recht und schlecht in Foren
>> zusammengeschnorrt bzw. in untauglichen Tutotials angelesen hat.
>
> Gut, du sagst mit jetzt, "Wenn du schnell laufen willst, musst du
> schnell laufen".

Nein.
Ich sag dir: wenn du schnell laufen willst, dann musst du erst mal 
langsam laufen lernen.
Es hat keinen Sinn, sich jetzt nach Methoden und Möglichkeiten zu 
erkundigen, wie man den New York Marathon gewinnen kann, wenn du noch 
nicht mal richtig krabbeln kannst.
Das man beim Krabbeln lernen auch mal auf die Schnauze fällt ist normal. 
Nur darf man dabei nicht stehen bleiben. Die Devise heißt weiter lernen. 
Irgendwann ist man dann soweit, dass man sein erstes richtiges Programm 
schreiben kann. Aber mit zu wenig wissen, hat es keinen Sinn zu 
versuchen, ein Programm abseits der Lernstube zu schreiben. Leider 
wollen das viele nicht wahr haben, und denken mit dem wenigen was sie 
wissen können sie die Welt der Programmierung revolutionieren. 
Überspitzt ausgedrückt.

von Oliver (Gast)


Lesenswert?

Frischling schrieb:
> Erdbewohner schrieb:
>> Du kannst höchstens aufgrund des
>> Assembler-Codes versuchen zu verstehen, was der Compiler gemacht hat.
>
> Ich denke so werde ich es machen, danke.

Ganz ernsthaft, wenn du dich schon selber als Frischling bezeichnest, 
lass es. Das schaffst du nicht. Was der Compiler mit eingeschalteter 
Optimierung aus dem C-Code macht, ist "höheres Durcheinander". Daraus 
etwas zu erkennen, erfordert sehr gute Kenntnisse in Assembler, und 
Übung im Lesen solches compiler-erzeugten Codes.

Oliver

von Frischling (Gast)


Lesenswert?

Karl Heinz schrieb:

> Nein.
> Ich sag dir: wenn du schnell laufen willst, dann musst du erst mal
> langsam laufen lernen.
> Es hat keinen Sinn, sich jetzt nach Methoden und Möglichkeiten zu
> erkundigen, wie man den New York Marathon gewinnen kann, wenn du noch
> nicht mal richtig krabbeln kannst.
> Das man beim Krabbeln lernen auch mal auf die Schnauze fällt ist normal.
> Nur darf man dabei nicht stehen bleiben. Die Devise heißt weiter lernen.
> Irgendwann ist man dann soweit, dass man sein erstes richtiges Programm
> schreiben kann. Aber mit zu wenig wissen, hat es keinen Sinn zu
> versuchen, ein Programm abseits der Lernstube zu schreiben. Leider
> wollen das viele nicht wahr haben, und denken mit dem wenigen was sie
> wissen können sie die Welt der Programmierung revolutionieren.
> Überspitzt ausgedrückt.

Ich weiß, da gebe ich dir auch recht. Das Programm funktioniert(wiznet 
udp packete hin und her schicken), ohne Optimize, krabbeln geht also 
schon. Jetzt versuche ich zu verstehen warum der Compiler an bestimmten 
Stellen wegoptimiert. Beim nächsten Programm will ich das halt gleich 
wissen und net erst wenn der Code fertig ist. So, ich krabbel weiter.

von Karl H. (kbuchegg)


Lesenswert?

Frischling schrieb:

> Ich weiß, da gebe ich dir auch recht. Das Programm funktioniert(wiznet
> udp packete hin und her schicken), ohne Optimize, krabbeln geht also
> schon. Jetzt versuche ich zu verstehen warum der Compiler an bestimmten
> Stellen wegoptimiert. Beim nächsten Programm will ich das halt gleich
> wissen und net erst wenn der Code fertig ist. So, ich krabbel weiter.


Dann geb ich dir den Tip, den Optimizer nicht erst zum Schluss 
einzuschalten, sondern gleich von Anfang an.
Denn der Supergau ist es, wenn man vor einem 'fertigen' Programm steht, 
nichts geht und man hat keine Ahnung wo man anfangen soll zu suchen.
Das erste was man lernt ist: Entwickle in Stufen. Nach jeder Stufe wird 
getestet! Und erst dann, wenn man einigermassen sicher ist, dass die 
gerade fertig gestellte Stufe so leidlich fehlerfrei ist, kommt dir 
nächste Stufe drann. Und ja, da hat man den Optimizer schon lange am 
laufen und nur zu Debug-Zwecken wird er abgeschaltet.

von Εrnst B. (ernst)


Lesenswert?

Karl Heinz schrieb:
> Dann geb ich dir den Tip, den Optimizer nicht erst zum Schluss
> einzuschalten, sondern gleich von Anfang an.

Und auch die Warnings von Anfang an Einschalten, und Jede Warnung sofort 
beheben.
Am besten gleich mit "-Werror" kompilieren.

Bei vielen dieser "Optimierungs-Fallen" gibt der Compiler nämlich nette 
Warnungen aus. "Unreachable code", "Comparsion is always true", 
"Statement has no effect", ....

von Frischling (Gast)


Lesenswert?

Εrnst B✶ schrieb:
> Karl Heinz schrieb:
>> Dann geb ich dir den Tip, den Optimizer nicht erst zum Schluss
>> einzuschalten, sondern gleich von Anfang an.
>
> Und auch die Warnings von Anfang an Einschalten, und Jede Warnung sofort
> beheben.
> Am besten gleich mit "-Werror" kompilieren.
>
> Bei vielen dieser "Optimierungs-Fallen" gibt der Compiler nämlich nette
> Warnungen aus. "Unreachable code", "Comparsion is always true",
> "Statement has no effect", ....

Yes, das war der Tip den ich suchte! Optimize einstellen und warnings 
anschauen. Danke Dir!

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.