Forum: Compiler & IDEs Wie Timer Schnittstelle übergeben?


von Pier S. (bigpier)


Lesenswert?

Hallo Experten:-)
Habe eine Frage die mir unter den Nägeln brennt.
Des öffteren ist mir passiert das ich in einer Funktion ein Timeout 
realisieren musste, dabei habe ich noch nie eine gute und elegante 
Möglichkeit gefunden eine Variable die von einem Timer dekrementiert 
wurde zu übergeben.
Das Ganze sollte so funktionieren das ich die Funktion ohne weiteres 
wiederverwendet werden kann.
Ich hoffe ich habe meine Frage einigermaßen verständlich gestellt habe.
Lg
Peter

von Pier S. (bigpier)


Lesenswert?

Habe ich die Frage doch schlecht gestellt?

von Felix A. (madifaxle)


Lesenswert?

Baue dir doch ein Software-Modul, welches einen Timer entsprechend 
deinen Vorstellungen benutzt und füge zwei Funktionen hinzu, eine die 
den Timeoutzähler startet und eine, die dir meldet, wenn der Timeout 
abgelaufen ist.

Dabei kannst du auch mehrere Variablen als Timeouts benutzen, wenn du z. 
B. aus deiner einen Funktion den ersten Timeout und aus deiner zweiten 
Funktion den zweiten Timeout benutzt.

Die Timeoutvariablen bleiben im Timeout-Softwaremodul und es wäre nur 
nötig, der Timeoutfunktion zum Setzen und Lesen des Timeouts eine Nummer 
zu übergeben (0 oder 1).

Quasi:

void initTimeoutModul(void);
void setTimeout(uint16_t timeout_ms, uint8_t timeout_nummer);
bool getTimeout(uint8_t timeout_nummer);

von W.S. (Gast)


Lesenswert?

Pier S. schrieb:
> Habe ich die Frage doch schlecht gestellt?

Nö.

Ich häte da einen Tip für dich: Lade dir die Lernbetty herunter und guck 
dort nach delayed events. Ich mach das nun schon eine ganze Weile so, 
daß ich mir in der Firmware einen Systemtick einrichte, der nebenher die 
Uhrzeit erledigen kann (so man braucht) und der eben auch eine kleine 
Liste von Events führt. Bei jedem Tick schaut er in diese Liste, ob da 
ein abgelaufener Event drin steht und wenn ja, dann trägt er diesen 
Event in die Event-Queue ein und löscht ihn aus seiner Liste. Dieser 
Event kann dann in der Grundschleife beachtet werden und die daraus sich 
ergebenden Aktionen durchgeführt werden. Natürlich gibt es auch ne 
Funktion, um so einen Event aus der Liste des Timerticks zu löschen, 
falls er sich vorher erledigt hat.

Mal ein grobes Beispiel:
1
void StarteMeineLangeAktion(void)
2
{ ... }
3
4
bool BehandleMeineLangeAktion(void)
5
{ ... }
6
7
void MyFunc(void)
8
{ AddDelayedEvent(MY_TIMEOUT, 5000); // 5 sek Timeout
9
  StarteMeineLangeAktion();
10
}
11
12
in main:
13
 ..
14
  if (EventAvail())
15
  { e = GetEvent();
16
    if (e==MY_TIMEOUT)  { MachDasErforderliche() };
17
    if (e==WAS_ANDERES) { TuEbenWasAnderes() };
18
    ...
19
  }
20
  if (BehandleMeineLangeAktion())
21
  KillDelayedEvent(MY_TIMEOUT);



W.S.

von 123 (Gast)


Lesenswert?

Pier S. schrieb:
> Hallo Experten:-)
> Habe eine Frage die mir unter den Nägeln brennt.
> Des öffteren ist mir passiert das ich in einer Funktion ein Timeout
> realisieren musste, dabei habe ich noch nie eine gute und elegante
> Möglichkeit gefunden eine Variable die von einem Timer dekrementiert
> wurde zu übergeben.

Was meinst Du mit übergeben ?
Ist das ein Hardwaretimer ?
Nimmst Du volatile Variablen darin ?

> Das Ganze sollte so funktionieren das ich die Funktion ohne weiteres
> wiederverwendet werden kann.

Also eine Funktion die aus dem Timer aufgerufen wird ?
Zeige dochmal Deinen Code der Dir nicht paßt.
Ich würde das z.B. so lösen (Pseudocode):
1
timeroverflow()
2
{
3
 int decrement;
4
 if (decrement-- == TIMEOUT)
5
 {
6
   timertimeout();
7
 }
8
}

von Peter D. (peda)


Lesenswert?

Ich benutze dazu meinen Scheduler:

Beitrag "Wartezeiten effektiv (Scheduler)"

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.