Zeit die vergeht für diese Schleife???

#570924
Lesenswert?
• ▲
▼
Fall 1: s ist long

Soll heissen, dass jeder Compiler, der etwas auf sich hält,
diese Schleife komplett rausschmeist und durch die Zuweisung
  s = 65536;
ersetzt

Fall 2: s ist int

Dann gibt es eine Warnung da 65535 nicht mehr in einen int passt


(*) In allen Fällen ist natürlich angenommen, dass s nicht
volatile ist.
#570927
Lesenswert?
• ▲
▼
Simon Küppers wrote:
> Nein, aber der Compiler wird sowas vermutlich wegoptimieren ;)
>
> @Karl-Heinz:
>
> Zu deinem dritten Fall: Die Schleife bricht schon bei s = 65535 ab. Das
> passt aber in einen unsigned int.

Habs gemerkt :-)
Du hast aber schneller geantwortet als ich das Posting
berichtigen konnte.

Er hat ja  <65535, das geht im Falle unsigned int.


#570935
Lesenswert?
• ▲
▼
Immer noch das gleiche Problem:
Ein normaler Optimierer wird diese Schleife rauswerfen,
da sie nichts tut, ausser Zeit zu verbraten. Aufgabe eines
Optimierers ist es nun mal ein Programm soweit zu optimieren,
dass möglichst wenig Zeit verbraten wird. Die obige Schleife
ist ein gefundenes Fressen für jeden Optimierer.

Was willst du eigentlich bezwecken?
Gast #570940
Lesenswert?
• ▲
▼
und was dann? Nutze AVR Studio. Optimierung beim Code ist aus -O0. 
Wollte eigentlich nur wissen wieviel Zeit für die Schleife gebraucht 
wird das mit den
65534 war mein Fehler max dafür wäre ja (2 hoch 16) minus 2 gewesen. 
Danke!
In AVR Studio läuft die Schleife braucht aber sehr lang bis wieder etwas 
anders getan wird. (der AVR soll mit 20 MHz laufen)

Danke übrigens für die schnellen antworten.
#570944
Lesenswert?
• ▲
▼
stampfkern wrote:

> In AVR Studio läuft die Schleife braucht aber sehr lang bis wieder etwas
> anders getan wird. (der AVR soll mit 20 MHz laufen)

Das kann viele Ursachen haben.

Wie bereits gesagt:
Für ein halbwegs genaues Timing und kurze Wartezeiten kann
man die Funktionen aus delay.h benutzen.

Oder aber man geht gleich auf einen Timer. Die meisten Programme
bauen sowieso rund um einen Timer für den Basistakt des Programmes
auf.
#570945
Lesenswert?
• ▲
▼
stampfkern wrote:
> die delay.h hatte ich auch schon verbraucht aber mehr Speicher als wenn
> ich mein ganzes Progrämmchen unoptimiert kompiliere.

Das kann nicht sein.
Wenn der Optimizer eingeschaltet ist, dann sind da ein paar
bytes mehr drinn. Nichts dramatisches. Wenn du mit den delay.h
Funktionen einen enormen Speicherverbrauch feststellst, dann hast
du ganz einfach keinen Optimizer eingeschaltet.

Der Grund dafür: In der Berechnung der Schleifenzahl in den
delay Funktionen kommen Floating Point Ausdrücke vor. Bei
eingeschaltetem Optimizer werden die vom Optimizer wegoptimiert.
Nur wenn der Optimizer ausgeschaltet ist, dann bleiben die
übrig und sorgen dafür, dass auch gleich noch die halbe Floating
Point Library mit ins Boot kommt. Ganz abgesehen davon, dass dann
auch die Zeiten nicht stimmen :-)

delay.h -> Optimizer einschalten.

Gast #570956
Lesenswert?
• ▲
▼
okay werde es nochmal mit delay.h versuchen.

Trotzdem würde ich gerne wissen wieviele Taktzyklen die For Schleife pro 
Durchlauf braucht wenn s eine uint16_t ist.

for (s = 0; s<1; s++)
  {
    ;
  }
#570965
Lesenswert?
• ▲
▼
stampfkern wrote:
> okay werde es nochmal mit delay.h versuchen.
>
> Trotzdem würde ich gerne wissen wieviele Taktzyklen die For Schleife pro
> Durchlauf braucht wenn s eine uint16_t ist.
>
> for (s = 0; s<1; s++)
>   {
>     ;
>   }

Es gibt nur eine Möglichkeit das herauszufinden:
Du lässt dir ein Assembler Listing vom Compiler
erzeugen und zählst die Takte nach.

* Bei jedem Compilerupdate
* Bei unterschiedlichen Optimizereinstellungen

kann und wird sich diese Anzahl aber verändern.
Gast #570971
Lesenswert?
• ▲
▼
ja danke auf die Assembleridee hätte ich auch kommen können. Habs jetzt 
mit delay.h erfolgreich und auch platzsparend gemacht die -Os hat 
wirklich geholfen der code ist jetzt nochmal 0.3 prozent kleiner.

Danke vielmals
Gast #570973
Lesenswert?
• ▲
▼
Das hängt vom Compiler (inklusive dessen Version) und den 
Optimierungseinstellungen ab. Wenn du's unbedingt wissen mußt, schau dir 
den generierten Assembler-Code an und zähl die Taktzyklen zusammen.

> die delay.h hatte ich auch schon verbraucht

Hm?

> aber mehr Speicher als wenn ich mein ganzes Progrämmchen unoptimiert
> kompiliere.

Den Satz zu parsen hat bei mir wegen des fehlenden Kommas etwas 
gedauert.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.