Timeout - best practice

OP #4089657
Lesenswert?
• ▲
▼
Hallo zusammen,
ich bin gerade dabei meine Quelltexte kritisch zu durchsuchen und komme 
so wieder bei den Grundlagenfragen an, von denen ich ganz vergessen 
hatte, daß ich noch gar nicht die Standardlösungen kenne.

Jetzt geht es mir um die Implemtierung eines Timeouts (reine Software, 
ohne Watchdog). Wie wird das normal gelöst? Meine jetzige Lösung ist:
1
// Timer-Variable wird extern jede Millisekunde in Interrupt hochgezählt.
2
extern glu_millis unit_least24_t;
3

4
uint_fast8_t initMyHardware (void)
5
{
6

7
    uint_least24_t timeout;
8
    int_fast16_t diff;
9

10
    powerOnMyHardware();
11

12
    timeout = glu_millis + HWTIMEOUT;
13
    while(!isHardwareReady()) {
14
        if (diff = timeout-glu_millis, diff < 0) {
15
            return STATUS_TIMEOUT;
16
        }
17
    }
18

19
    // weiter gehts ...
20

21
}

Wie sieht für dieses Klasse von Problemen die "gute Standardlösung" aus?

Viele Grüße
W.T.
Gast #4089695
Lesenswert?
• ▲
▼
> if (diff = timeout-glu_millis, diff < 0)

Das ist äußerst irritierend. Hinter if erwarte ich eine Bedingung, keine 
Zuweisung. Und schon gar nicht eine zweite Operation.

In manchen Anwendungen initialisiert man mehrere Dinge parallel, da sind 
solche Warteschleifen dann unpassend. Für deine Anwendung mag es jedoch 
völlig Ok sein.
#4089701
Lesenswert?
• ▲
▼
irgendwann wird deine glu_millis überlaufen. Dann brauchts eine Weile 
bis der nächste timeout erkannt wird.

vielleicht besser
1
volatile int_fast16_t timeout;

in der TimerISR:
1
timeout--;

in initMyHardware:
1
timeout = HWTIMEOUT;
2
while (...) {
3
  if (timout < 0)  break;
4
}

sowas vermeide ich:
1
if (diff = timeout-glu_millis, diff < 0)

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.