CTimer: Timerklasse für zyklische Aufrufe

Bei meinen Mikrokontrollerprojekten kommt es oft vor, dass zyklisch etwas ausgeführt werden muss. Dazu wird mittels eines Timers jede Millisekunde ein Interrupt erzeugt. Nach 10 Interrupts erfolgt dann der Aufruf der Funktion, die alle 10ms etwas tun soll.

Damit dies nicht für jede Klasse/Funktion erneut programmiert werden muss habe ich eine Klasse (CTimer) mit entsprechenden virtuellen Funktionen programmiert. Dadurch können zyklische Aufrufe einfach in eine eigene Klasse implementiert werden, indem die eigene Klasse von CTimer abgeleitet wird.

Beispiel für eine eigene Klasse:

1
2
3
4
5
6
7
class eigene_klasse: CTimer
{
	void Timer10ms(){
	//Das hier wird automatisch alle 10ms aufgerufen,
	//ohne dass irgendetwas implementiert werden muss!
	};
};

Realisiert wird das mit einer kleinen Hilfsklasse, die die entsprechenden Funktionen aufruft.
Diese muss nur in der entsprechenden Datei (main.cpp) verwendet werden:

Beispiel

In diesem Beispiel wird die Funktion Timer10ms der eigenen Klasse zyklisch aufgerufen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "CTimer.h"
 
//Diese Hilfsklasse muss vor der Deklaration der eigenen Klasse kommen
CTimerHelper TimerHelper;
 
//Dieser Interrupt wird jede Millisekunde aufgerufen
ISR( Timer1ms)
{
	//Das berechnet, ob irgend etwas gemacht werden muss
	TimerHelper.Interrupt1ms();
}
 
eigene_klasse test_10ms;
 
int main(void)
{
	//Todo: Register so laden dass jede ms die ISR aufgerufen wird
 
	while(1)
	{
		//Von hier aus werden die entsprechenden Funktionen aufgerufen
		//In diesem Beispiel alle 10ms die Funktion test_10ms.Timer10ms()
		TimerHelper.process();
	}
}

Die eigentlichen Funktionen werden in main aufgerufen, so dass es keine Probleme mit Zugriffen aus der Interruptroutine gibt.
Wenn gewünscht ist, dass die entsprechenden Funktionen in der Interruptroutine aufgerufen werden kann einfach das „TimerHelper.process();“ dorthin verschoben werden.

Übersicht über CTimer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CTimer
{
	friend class CTimerHelper;
private:
	CTimer* m_ptr_next_element {nullptr};
public:
	CTimer();
	~CTimer();
 
#if TIMER_SUPPORT_1MS 
	virtual void Timer1ms(){};
#endif
	virtual void Timer10ms(){};
	virtual void Timer100ms(){};
	virtual void Timer1s(){};
};

Die Klasse stellt Funktionen für 1ms (wenn TIMER_SUPPORT_1MS wahr ist), 10ms, 100ms und 1s zur Verfügung.
Damit ist es sehr leicht und elegant möglich, Zeitabhängigkeiten in eigene Klassen zu integrieren.

Hier der aktuelle Stand der Datei.
CTimer_25_01_2015
SHA256: 9d59af60a21696bb7748cea6a62265cf70914acc4f2f1259d221832aa3383853

25.01.2015 - Erste Version
986 Total Views 1 Views Today

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.