Forum: Compiler & IDEs Ereignise alle x Sekunden durchführen


von Wiederholer (Gast)


Lesenswert?

Hi,

ich habe folgendes Problem. Ich möchte bestimmte Ereignisse alle x 
Sekunden ausführen.

Zum Beispiel

Ereignis A alle x ms
Ereignis B alle y s
Ereignis C ...

Das löse ich bisher so, dass ich einen Timer habe, der in einer 32 Bit 
Variable Millisekunden hoch zählt. Anschliesend vergleiche ich in einer 
Endlosschleife:
1
if( ms-EreignisA >= 1000) {
2
   EreignisA=ms;
3
   ...
4
}

Gibt es dafür noch elegantere Lösungen?

von Tobi (Gast)


Lesenswert?

Ja, für sowas bieten sich Interrupts an.

von Wiederholer (Gast)


Lesenswert?

Ich zähle die ms ja im Timer Compare Interrupt hoch.

von Karl H. (kbuchegg)


Lesenswert?

Wiederholer schrieb:

>
1
> if( ms-EreignisA >= 1000) {
2
>    EreignisA=ms;
3
>    ...
4
> }
5
>
>
> Gibt es dafür noch elegantere Lösungen?

Was findest du daran unelegant?

eine Alternative wäre vielleicht noch
1
   performChecks = 0;
2
   cli();
3
   if( ms != ms_alt )    // ist eine Millisekunde um?
4
   {
5
     ms_alt = ms;
6
     performChecks = 1;
7
   }
8
   sei();
9
10
   if( performChecks )  // Zeitauswertungen nur jede volle Millisekunde
11
   {
12
     EreignisA--;
13
     if( EreignisA == 0 )           // ist die Zeit für A rum?
14
     {
15
       EreignisA = TIME_FOR_A;
16
       ....
17
     }
18
19
20
     EreignisB--;
21
     if( EreignisB == 0 )           // ist die Zeit für B rum?
22
     {
23
       EreignisB = TIME_FOR_B;
24
       ....
25
     }
26
27
     .....
28
   }

Dann werden deine Zeit-Ereignisse auch nur dann bearbeitet, wenn eine 
Millisekunde um ist und nicht ständig. Und du hast auch noch die 
Möglichkeit die Zeit für ein Ereignis auch einmal abzukürzen bzw. zu 
verlängern, indem du EreignisA direkt manipulierst.

von Peter D. (peda)


Lesenswert?


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.