Schlechte Compileroptimierung?

Gast #950894
Lesenswert?

Hallo zusammen,

ich benutze in einem Programm öfters mal _delay_ms(). Leider kann man 
damit nur begrenzt lange warten, und zwar 262.14 ms / F_CPU in MHz.

Damit ich auch länger warten kann, habe ich etwas geschrieben wie

#define MAX_DELAY_MS (262 / (F_CPU / 1000000))

static void my_delay_ms(uint16_t ms) {
  while(ms > MAX_DELAY_MS) {
    ms -= MAX_DELAY_MS;
    _delay_ms(MAX_DELAY_MS)
  }
  _delay_ms(ms);
}

Wenn ich nun _delay_ms() mehrmals per Hand aufrufe, ist das Binary ca. 
500 Byte gross. Benutze ich oben genannte Hilfsfunktion, ist es fast 4KB 
gross, also um ganze 3500 Byte größer. Irgendwas läuft da doch schief, 
oder? Hat jemand eine alternative um länger als MAX_DELAY_MS zu warten 
und nicht mehrmals _delay_ms() per Hand aufrufen zu müssen?

Gruss
Flo
#950897
Lesenswert?

Es sollte sich langsam rumgesprochen haben, dass die Delay-Funktionen 
Fliesskommarechnung zur Umrechnung von Zeiten in Takte verwenden. Was 
bei Konstanten kein Problem ist, da macht das der Compiler. Bei 
Variablen hingegen findet diese Umrechnung dann zur Laufzeit statt, 
platz- und zeitraubend.
#950907
Lesenswert?

Florian wrote:

> ich benutze in einem Programm öfters mal _delay_ms(). Leider kann man
> damit nur begrenzt lange warten, und zwar 262.14 ms / F_CPU in MHz.

Hast du in der Dokumentation auch mal den nächsten Absatz gelesen?

1
When the user request delay which exceed the maximum possible one,
2
_delay_ms() provides a decreased resolution functionality. In this mode
3
_delay_ms() will work with a resolution of 1/10 ms, providing delays up
4
to 6.5535 seconds (independent from CPU frequency). The user will not be
5
informed about decreased resolution.

Oder reicht dir eine Auflösung von 1/10 ms nicht?
Gast #950909
Lesenswert?

Ich rufe meine Hilfsfunktion nur mit Konstanten als Parameter auf, nicht 
mit Variablen. Der Compiler weiss also bereits zur Compilezeit wie lange 
ich warten will, daher hat es mich etwas gewundert, dass das nicht 
wegoptimiert wird... Danke für die Antworten!
#950911
Lesenswert?

@ Florian (Gast)

>ich warten will, daher hat es mich etwas gewundert, dass das nicht
>wegoptimiert wird...

Kann er prinzipiell nicht. _delay_ms(ms) kann nicht mal variabel und mal 
fest sein. Geh mal davon aus, dass die Compiler schlauer sind als 90% 
der Programmierer ;-)

MFG
Falk
#950913
Lesenswert?

Florian wrote:
> daher hat es mich etwas gewundert, dass das nicht
> wegoptimiert wird...

Dazu müsste der Compiler die Schleife durch mehrfachen Aufruf ersetzen. 
Das macht der nicht so ohne weiteres. Daher wird er die Schleife zu 
Laufzeit berechnen und die delay Funktion entsprechend aufrufen 
(vermutlich mit dem Float Parameter).
Gast #951157
Lesenswert?

Ich verwende grundsätzlich die attached Funktionen:

 void delay_us (uint16_t n);
 void delay_ms (uint16_t m);

Diese sind vom Timing nahezu exakt, mit Ausnahme von 5 > n > 1 bei 
delay_us. Speicherplatz nur 26 Bytes.

Gruß Manni
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren