gregorss:
Klasse, das rettet mir den Tag!
Ich lege nochmal nach und habe noch einen zusätzlichen Task draufgelegt, der folgendes zusätzlich macht:
In der loop() Funktion zählt eine Zählvariable (loopCount) bis 5000 hoch und gibt dann einen Wert dafür aus, wieviele loop() Durchläufe "pro Sekunde" das Programm schafft.
In der loop() Funktion is ein kleines delay von einer Millisekunde (delayMicroseconds(1000) enthalten
Da könnte man meinen: 1000 Mikrosekunden (eine Millisekunde) ist doch nicht viel, aber das bei jedem Schleifendurchlauf, das läppert sich ganz schön zusammen!
Aber vergleiche mal dieses Programm:
void setup() {
Serial.begin(9600);
}
void readTimeFromRTC(unsigned long now)
/*Simulation einer Funktion, die alle50ms eine Funktion ausführt,
* z.B. ein RTC-Modul auslesen
*/
{
static unsigned long lastReadTime;
if(now-lastReadTime>=50)
{
// do it!
Serial.print('Z');
lastReadTime=now;
}
}
void readTemperature(unsigned long now)
/*Simulation einer Funktion, die alle 10s eine Funktion ausführt,
*
*z.B. eine Temperatur messen
*/
{
static unsigned long lastReadTime;
if(now-lastReadTime>=10000)
{
// do it!
Serial.println("Temperatur messen");
lastReadTime=now;
}
}
void updateDisplay(unsigned long now)
/*Simulation einer Funktion, die einmal pro Sekunde eine Funktion ausführt,
*
*z.B. einen angezeigten Text aktualisieren;
*/
{
static unsigned long lastUpdateTime;
if(now-lastUpdateTime>=1000)
{
// do it!
Serial.print("\nTime counting: ");
Serial.println(now/1000);
lastUpdateTime=now;
}
}
unsigned long time;
unsigned int loopCount;
void loop()
{
unsigned long now=millis();
readTimeFromRTC(now);
readTemperature(now);
updateDisplay(now);
loopCount++;delayMicroseconds(1000);
if (loopCount==50000) //loop has run 50000 times
{
float loopsPerSecond=loopCount/((now-time)*0.001);
Serial.print("loops per second: ");
Serial.println(loopsPerSecond);
loopCount=0; // reset counter
time=now; // reset time
}
}
-...und dann lösche mal das delayMicroseconds(1000); heraus und lasse nochmal laufen!
Die Version, die das kleine delay() von einer Millisekunde in jedem loop() Durchlauf drin hat, schafft natürlich weniger als 1000 loop() Durchläufe pro Sekunde und braucht knapp über 50 Sekunden Laufzeit, bis es einmal auf 50000 hochgezählt hat.
Und sobald Du das delay() aus dem Programm herauslöscht, rennt es plötzlich über 50 mal schneller.
Soviel zum Thema "eine Millisekunde ist doch nicht viel".
Alleine für sich genommen zwar nicht.
Aber in einem effektiv programmierten Programm, dessen loop() Funktion viele Tausend male pro Sekunde durchläuft, sinkt die Performance auf einen Bruchteil des ursprünglichen Wertes.
Ich messe beim Programm mit delayMicroseconds(1000) in der loop Funktion
loops per second: 978.26
Und im ansonsten funktionsgleichen Programm ohne delayMicroseconds(1000) messe ich (
loops per second: 65274.15 (etwas schwankende Werte)
Bei fast identischer Funktionalität: Kleines -delay() - großer Unterschied!