Guten Morgen,
ich schreibe gerade für den STM32 einen Treiber für ein DOGM163.
Die Kommunikation ist ja per SPI sehr einfach gehalten. Das einzige was
mich stört ist das je nach dem was für einen Befehl man an das Display
sendet gewartet werden muss. Wie kann ich auf einfache weiße die paar µs
warten ohne das ich ich nichts mache.
Also ich was Sinnvolles mache.
Danke für die Hilfe
Für diesen Fall würde ich sagen: gar nicht.
Du könntest einen Timerinterrupt benutzen, der alle paar µs mal
nachschaut. Aber für eine einmalige (oder zumindest seltene)
Initialisierung einen Timer verballern?
Du könntest auch ein OS benutzen und der Thread, in dem die
Initialisierung läuft, wartet einfach und andere Threads können
arbeiten. Wenn du aber eigens deswegen mit einem Betriebssystem anfängst
würde ich das auch nicht als effizient bezeichnen.
Ich bin gespannt was andere dazu sagen, mit Hardware kenne ich mich
deutlich besser aus als mit Software.
Bei den meisten Projekten (auch kleineren) habe ich immer einen
Systemtimer drin, welcher solche Sachen wie Tastenentprellen,
Echtzeituhr, etc macht. Den rufe ich aller 1 - 10ms auf. Wenn es dich
nicht stört, dass du etwas länger warten musst, könnte man es über so
eine Lösung machen. Du setzt ein Flag und wenn der Timer das 2. mal
getriggert wird, kannst du weiter machen.
Hansjörg schrieb:> finde ich schade wenn
Hast Du denn etwas, was der Prozessor in der Zeit tun kann? Dann nutz
einen Timer, wenn nicht warte einfach.
Du bekommst kein Geld zurück wenn der STM ständig ausgelastet ist,
Warten ist eine der Hauptbeschäftigungen von Controllern.
Hansjörg schrieb:> Wie kann ich auf einfache weiße die paar µs> warten ohne das ich ich nichts mache.
Indem du eben dort genau nicht nur die Ansteuerung des DOGM163
erledigst, sondern die Wartezeiten mit anderen Aufgaben füllst. Das
widerspricht aber dem Konzept eines Treibers. Der Overhead, den du dir
mit einem taskwechselfähigen OS einhandelst, wiegt die paar µs Gewinn
höchstwahrscheinlich nicht auf, schon gar nicht auf "einfache weiße".
Bei jedem Zeichen das ich an das Display sende sind 45us zu warten.
Das ist schon relativ viel Zeit in der man nichts tut.
Oder sehe ich das falsch.
Wenn ich zb einen String mit 10 Zeichen an das Display schicke muss ich
10mal 45us warten. Mit Interrupt Flag muss ich mir aber auch merken wo
ich gerade beim Senden war.
Das ist auch nicht gerade das gelbe vom Ei.....
Hansjörg schrieb:> Bei jedem Zeichen das ich an das Display sende sind 45us zu warten.> Das ist schon relativ viel Zeit in der man nichts tut.> Oder sehe ich das falsch.> Wenn ich zb einen String mit 10 Zeichen an das Display schicke muss ich> 10mal 45us warten. Mit Interrupt Flag muss ich mir aber auch merken wo> ich gerade beim Senden war.> Das ist auch nicht gerade das gelbe vom Ei.....
du müsstest alles was ans Display gehen soll in einen Puffer packen und
dann in jedem Interrupt ein Byte ausgeben. Ob die Initialisierung des
Puffers und die INTs die 45μs aufwiegen müsste man mal ausrechnen. Wenn
immer nur ein Byte raus muss könnte man das auch per DMA machen.
Sascha
Moin,
Es gibt so eine Zeitspanne im Bereich zwischen ein paar NOPs (µsec) und
"vernuenftiger" IRQ Haeufigkeit (~ msec), da isses einfach kagge bei
einer CPU mit warten. Ist halt so. Sollte man vermeiden. Also z.b. ein
anderes Display einsetzen ;-/
Gruss
WK
Genau da beginnt die Pragmatik beim Programmieren.
Ich würde mir ja wünschen, man dürfte ein Byte senden, das nicht
wirklich gesendet wird, sondern einfach eine entsprechend lange Pause
macht.
Dann kann man das alles ohne Sonderbehandlung machen.
So musst Du abschatzz, wie oft das vorkommt, wie lange eine Interrupt
Verarbeitung dauert und wie dein RTOS und dein uC getaktet ist. Und je
nach Ergebnis warten (nops, Schleife von nops), einen Timer nutzen
(gesonderter Interrupt), etwas anderes zwischendurch machen (was länger
dauert oder per free running counter überwacht wird) oder halt ein sleep
von 1 bzw 2 einlegen.
Das klingt nach einer Aufgabe für einen Timer getriggerten DMA.
Die STM32 haben genug Timer, da lässt sich mal der eine oder andere für
Spezialaufgaben nutzen.
Buffer füllen -> SPI+Timer+DMA einstellen -> nach einem DMA Done IRQ
kann der nächste Buffer gesendet werden.
Hansjörg schrieb:> Bei jedem Zeichen das ich an das Display sende sind 45us zu warten.
Au weia ... Steht das so im Datenblatt? Dann hilf wohl nur senden aus
einem Timer- Interrupt.
Hansjörg schrieb:> Wenn ich zb einen String mit 10 Zeichen an das Display schicke muss ich> 10mal 45us warten. Mit Interrupt Flag muss ich mir aber auch merken wo> ich gerade beim Senden war.
DMA. Initialisierung mit Timer.
Hansjörg schrieb:> Hi,> beim Atmel habe ich einmach _delay_us() verwendet aber beim STM32 finde> ich schade wenn der Gute mit 72Mhz rennt und im Code gewartet wird.
Die Forderung war "Warten ohne nichts zu tun", da wäre ein _delay_us()
auch falsch ;)
Zum Thema selbst: Ich würde da auch richtig DMA und Timer gehen wenns so
wichtig ist nicht nichts zu tun.
Hansjörg schrieb:> Wie kann ich auf einfache weiße die paar µs warten ohne das ich ich nichts
mache.
Ich weiß nicht welchen STM32 du nutzt, aber Cortex-M3 besitzen einen
CycleCounter. Das ist ein 32bit Counter, der mit jedem CPU Takt um eins
inkrementiert wird.
Korrekt macht man das so, daß man nicht nach einem Befehl wartet, bis
das Display damit fertig ist, sondern indem man vor dem Senden eines
Befehls prüft, ob das Display den vorigen Befehl fertig hat. Die
sinnvollste Variante dafür ist die Auswertung des BUSY Flags.
Denn damit fängt man nicht nur Variationen des Display-Taktes ab (das
ist ja nur ein simpler RC-Oszillator) sondern auch Variationen in der
Ausführungszeit. Das Datenblatt nennt die maximale Ausführungszeit. Es
kann durchaus auch schneller gehen.
Dummerweise kann man das BUSY Flag unter Verwendung des SPI Interface
nicht abfragen. Deswegen wäre die erste Frage: muß es wirklich SPI sein?
Falls doch, dann kann man einen Timer dazu verwenden, die
Ausführungszeit des Display-Controllers zu simulieren. Man setzt dafür
einen Timer auf, der vom gesetzten Wert in µs-Intervallen auf 0 zählt.
Nachdem man einen Befehl an das LCD sendet, setzt man den Timer auf die
Ausführungszeit des Befehls (den Maximalwert aus dem Datenblatt). Immer
bevor man einen (weiteren) Befehl absetzt, schaut man, ob der Timer
schon auf 0 steht und wenn nicht, wartet man halt darauf.
Wenn das Display noch ein Busy Flag hat, könntest Du diesen an einen
Interruptus hängen und damit einen Puffer abarbeiten .. ?
Vorteil: Man ist zeitmäßig nicht auf ein bestimmtes Display festgelegt.
SPI...
Bei einem LCD- Display mit 3*16 Zeichen ist es natürlich extrem
sinnvoll, beim Schreiben auch noch die allerletzte Mikrosekunde
einzusparen...
Einfach per Timer die Zeiten aus dem Datenblatt abwarten, und fertig.
Oliver
Klar, DMA mit Timer kann man alles machen.
Aber mal anders herum gefragt:
Wäre es so schlimm wenn nur z.B. jede ms ein Zeichen zum Display
gesendet wird?
Mehr wie 100 Zeichen wirst du wahrscheinlich nicht haben auf dem
Display.
Und selbst wenn wären es dann noch 10Hz Aktualisierungsrate.
Ich würde mir also überlegen ob ich einen ms Interrupt anlege. In dem
kannst du dann alles mögliche machen. Von Taster abfragen, LEDs bedienen
oder eben auch ein neues Zeichen zum Display senden. Dann wartet der
Controller effektiv garnicht und du hast die restliche Zeit für
Echtzeit-Geschichten frei.
Man legt einen Puffer an für alle Zeichen des Text-LCD.
Ein Timerinterrupt 1ms gibt dann immer ein Zeichen aus bzw. das Byte zur
Zeilenumschaltung.
Hier mal ein Beispiel für den AVR:
Beitrag "Formatierte Zahlenausgabe in C"
Axel S. schrieb:> Korrekt macht man das so, daß man nicht nach einem Befehl wartet, bis> das Display damit fertig ist, sondern indem man vor dem Senden eines> Befehls prüft, ob das Display den vorigen Befehl fertig hat.
Dann verbringt man vor dem Senden die Zeit mit "gucken ob fertig" und
hat damit auch nicht richtig etwas gewonnen, weil irgendeine andere
Aufgabe sich immer um "Busy-Gucken" kümmern muss.
Wolfgang schrieb:> Axel S. schrieb:>> Korrekt macht man das so, daß man nicht nach einem Befehl wartet, bis>> das Display damit fertig ist, sondern indem man vor dem Senden eines>> Befehls prüft, ob das Display den vorigen Befehl fertig hat.>> Dann verbringt man vor dem Senden die Zeit mit "gucken ob fertig" und> hat damit auch nicht richtig etwas gewonnen, weil irgendeine andere> Aufgabe sich immer um "Busy-Gucken" kümmern muss.
Ich habe ganz bewußt nichts konkretes dazu geschrieben, wie dieses
"Warten" aussehen sollte. Denn das hängt ganz und gar davon ab, was das
Programm sonst noch so treibt. Man könnte das auszugebende Zeichen
widrigenfalls ja in einen Puffer schreiben. Und sich beim Ablauf des
Timers per Interrupt informieren lassen. Eine ISR aufsetzen, die den
Puffer leert. Oder gleich den ganzen Weg gehen und FIFO Pufferung für
das Display implementieren.
Aber im Zweifelsfall muß man zwischen den einzelnen Zeichen, die aufs
Display gemalt werden, ja ohnehin noch andere Sachen tun. Und sei es
nur, daß man die nächste Ziffer aus einer mehrstelligen Zahl extrahiert.
Wenn die Wartezeit kurz genug ist, dann reicht das ja womöglich schon.
PS: überhaupt ging es mir nicht darum, eine optimale Strategie zur
Ausgabe von Zeichen zu formulieren. Mir ging es einzig darum, daß
unmittelbar nach der Ausgabe des Zeichens der falschestmögliche
Zeitpunkt zum Warten ist. Denn in diesem Moment habe ich ja schon alles
erreicht, was zu erreichen war: ich bin mein Zeichen ans Display
losgeworden. Ob es jetzt 10µs braucht, um es auf das Glas zu malen oder
10ms, das kann mir zu diesem Zeitpunkt vollkommen egal sein. Interessant
wird das erst, wenn ich das nächste Zeichen ausgeben will. Aber ein
Treiber weiß ja nicht (kann gar nicht wissen) wann das Hauptprogramm
das nächste Zeichen ausgeben wird.
Guten Morgen,
danke für die guten Ansätze.
Ich denke über folgende 3 Ansätze nach.
SPI mit Dma mit Timer
Display anstatt über SPI über 4/8 Bit ansteuern und Busy Flag nutzen
Oder einfach die Interrupt Methode von Peter.
Aber ganz entschieden habe ich mich noch nicht.
Danke Allen für die Hilfe
Axel S. schrieb:> Interessant> wird das erst, wenn ich das nächste Zeichen ausgeben will. Aber ein> Treiber weiß ja nicht (kann gar nicht wissen) wann das Hauptprogramm> das nächste Zeichen ausgeben wird.
die Frage muss doch mal gestellt werden, wer kann so schnell ein LCD
ablesen dasmehr als 4 Aktualisierungen pro Sekunde gelesen werden
können?
Ich mache nur 4 Aktualisierungen pro Sekunde nur deswegen weil die
angezeigte Uhrzeit relativ flüssig laufen soll, ob die Zeit nun 10ms
früher oder später aufs Display gemalt wird ist doch egal!
Auch bei der Überwachung einer Batterie-spannung oder -strom bekomme ich
Peeks nicht mit, wenn ich sie gelesen habe sind sie lange vorbei, was
nun, allenfalls könnte man peek detect einsetzen und extra irgendwo
schreiben und stehen lassen, genau wie früher am analogen
Zeigerinstrument mit Leuchtanzeige für peek (overload)
Genau wie bei einer Stopuhr auf dem LCD, versucht doch mal 1/10 oder
1/100 Sekunden zu lesen!
Joachim B. schrieb:> Ich mache nur 4 Aktualisierungen pro Sekunde nur deswegen weil die> angezeigte Uhrzeit relativ flüssig laufen soll, ob die Zeit nun 10ms> früher oder später aufs Display gemalt wird ist doch egal!
Ja, 3 oder 4 pro Sekunde reichen als Refresh aus.
Wenn man durch viele Menüs scrollen muss, dann sollte es jedoch bis zu
10/s sein, da man "sein" Menü durchaus so schnell erkennt (und dann halt
1 oder 2 zurück muss). Gilt aber nur bei sehr vielen Menüpunkten (>>10)
Zudem kommt es noch darauf an, wie es gefüllt wird. Wenn man zuerst
alles Löschen muss, dann sollte es sehr schnell (<20ms) wieder voll sein
um ein "Blinken" zu vermeiden. Wenn man jedes Zeichen einzeln
überpinselt, sollte das ganze trotzdem in 20-50ms fertig sein.
A. S. schrieb:> Zudem kommt es noch darauf an, wie es gefüllt wird. Wenn man zuerst> alles Löschen muss, dann sollte es sehr schnell (<20ms) wieder voll sein> um ein "Blinken" zu vermeiden.
bei TFT Displays habe ich mir abgewöhnt alles zu Löschen, das dauerte zu
lange, aber ich hatte den Text im SRAM zwischengespeichert und nur die
geänderten Buchstaben Pixel mit SW übermalt somit änderten sich nur die
neueren Pixel.
Dummerweise ist da jede LIB jedes Display verschieden, z.B. für ein
Nokia5110.
Es gibt eine LIB (nur) für AVR die löscht automatisch das ganze Feld
unter dem neuen Buchstaben und die von Adafruit (für ESP32) tut es eben
nicht, da muss man dann selber erst mal das Feld löschen vor Neumalen
des Buchstabens (oder Ziffer oder Sonderzeichen)
Joachim B. schrieb:> die von Adafruit (für ESP32) tut es eben nicht, da muss man dann selber> erst mal das Feld löschen vor Neumalen des Buchstabens (oder Ziffer oder> Sonderzeichen)
Bei der Adafruit_GFX kommt es darauf an wie man setTextColor() aufruft:
mit nur einem Argument wird die Textfarbe gesetzt und Hintergrund ist
transparent, bei zwei Argumenten wird Vorder- und Hintergrund gesetzt
und der Hintergrund auch gefüllt.
Außer bei den TT Fonts.
Johannes S. schrieb:> Bei der Adafruit_GFX kommt es darauf an wie man setTextColor() aufruft:> mit nur einem Argument wird die Textfarbe gesetzt und Hintergrund ist> transparent
.setTextColor(BLACK);
reicht also nicht?
hast du ein Beispiel, das wusste ich nicht, ich wunderte mich nur das
sich so langsam alle Pixel füllten!
also statt
Joachim B. schrieb:> .setTextColor(BLACK);
.setTextColor(BLACK, WHITE)?
hmm mal probieren, danke
Funktioniert einwandfrei, danke dafür, ich sollte mal wieder anfangen
Anleitungen zu lesen, fällt mir schwer weil ich ein Mann bin :))))
Johannes S. schrieb:> Aber diese Lib ist für Grafikdisplays und die kann der TO bei seinem> DOGM163 nicht gebrauchen.
aber beim nokia5110 klappt das, bei anderen TFT bin ich nicht sicher,
wäre zu probieren!
Hansjörg schrieb:> Das einzige was> mich stört ist das je nach dem was für einen Befehl man an das Display> sendet gewartet werden muss.
Stimmt doch garnicht.
Also, nur zum Einrichten muß wirklich gewartet werden: ab Einschalten 40
ms, dann für Funktion, Oszillator, Kontrastspannung usw. jeweils etwa 30
µs und das war's dann.
Die normalen Zugriffszeiten, also Byte schreiben usw. sind im unteren
Nanosekundenbereich. Das längste davon ist die Zykluszeit von etwa
400..500 ns.
Für all so etwas lohnt sich weder ein RTOS, noch ein Timer oder gar ein
Timer+DMA - was für eine besonders grandiose Idee, insbesondere für den
4 Bit Betrieb.
Nein, zum einmaligen Initialisieren darf schlichtweg per Trampelschleife
gewartet werden und später ist das nicht mehr nötig.
Allenfalls kann man das Busyflag auswerten um sicherzugehen.
Und sowas wie ein Nachstellen des Kontrastes darf dann ruhig mal 30 µs
dauern.
Siehe Datenblatt vom st7036:
http://www.lcd-module.de/eng/pdf/zubehoer/st7036.pdf
W.S.
Hansjörg schrieb:> Die Kommunikation ist ja per SPI sehr einfach gehalten. Das einzige was> mich stört ist das je nach dem was für einen Befehl man an das Display> sendet gewartet werden muss. Wie kann ich auf einfache weiße die paar µs> warten ohne das ich ich nichts mache.> Also ich was Sinnvolles mache.> Danke für die Hilfe
Das ist eine reine Effizienzbetrachtung.
Es gibt einen Bereich von Wartezeiten, in dem SICHER das busywait die
effizienteste Lösung ist.
Und es gibt einen Bereich von Wartezeiten, bei denen SICHER eine
Timer-getriebene Lösung (wie auch immer im Detail ausgeführt, kann z.B.
eine Timer-ISR samt state-machine sein oder auch der Scheduler eines OS
samt wartefähigem Task) die effizienteste Lösung ist.
Die sicheren Bereiche kann man leicht ausrechnen, wenn man das Target,
die Softwareumgebung und deren Zeitverhalten kennt.
Wirklich Wert, darüber genauer nachzudenken, sind nur die Wartezeiten
zwischen den beiden "SICHER"-Bereichen.
Bei "µs" ist es aber nunmal leider so, dass die einen Bereich von drei
Größenordnungen umfassen. Sprich: du hast nicht hinreichend über das
Problem nachgedacht, insbesondere nicht über das, was für dein Target
und dessen Zielumgebung als "sicher" gelten kann...
Hol' das nach!
Was mir aufgefallen ist, gerade bei Display-Ansteuerung ist eine
möglichst hohe Geschwindigkeit oft unnötig. Dem Benutzer bemerkt gar
nicht, ob man bei sowas 30..50µs oder eine ganze Millisekunde wartet.
Ich mache bei sowas daher entweder alles in Hardware oder mit
irgendwelchen Wartezeiten, die gerade entstehen und auf jeden Fall lang
genug sind.
Ben B. schrieb:> Was mir aufgefallen ist, gerade bei Display-Ansteuerung ist eine> möglichst hohe Geschwindigkeit oft unnötig. Dem Benutzer bemerkt gar> nicht, ob man bei sowas 30..50µs oder eine ganze Millisekunde wartet.
wie schon geschrieben wurde, was soll denn der Prozzi in der
verbleibenen Zeit noch alles machen?
ob er 4x oder 10x pro Sekunde das Display aktualisiert welches sagen wir
1ms dauert, die Restzeit ist doch riesig
Hallo,
Ihr vergesst dabei eine Sache. Die Wartezeiten addieren sich, je nach
Länge der Displayausgabe. Die üblichen Libs warten mit harten delays.
Wenn nebenbei zum Beispiel eine schnelle serielle Kommunikation läuft
gehen Daten verloren, weil die Einlesefunktion nicht zum Zug kommt.
Entweder man bekommt ein unkritisches Zeitfenster für die Displayausgabe
hin. Oder man lässt den SPI Interrupt einen Buffer leeren welcher
letztlich das Display bedient.
Veit D. schrieb:> Hallo,>> Ihr vergesst dabei eine Sache. Die Wartezeiten addieren sich, je nach> Länge der Displayausgabe. Die üblichen Libs warten mit harten delays.> Wenn nebenbei zum Beispiel eine schnelle serielle Kommunikation läuft> gehen Daten verloren, weil die Einlesefunktion nicht zum Zug kommt.
Unsinn. Für sowas hat der liebe Gott Interrupts und Zwischenpuffer
erfunden.
> Entweder man bekommt ein unkritisches Zeitfenster für die Displayausgabe> hin. Oder man lässt den SPI Interrupt einen Buffer leeren welcher> letztlich das Display bedient.
Und worüber reden wir denn WIRKLICH? Ein großes 4x20 LCD mit 80 Zeichen
braucht bei 40us/Zeichen 3,2ms Updatezeit. Naja, nicht wirklich schnell
aber auch kein Drama, wenn man das mit 10 Hz / 100ms aktualisiert,
kostet halt 3,2% CPU-Zeit.
Wer die Wartepausen WIRKLICH nicht mag oder gebrauchen kann schreibt in
einem halbwegs schnellen Timer- Interrupt immer nur 1 Zeichen auf das
LCD. Bei 1 kHz kommt man da auf 12,5Hz Updaterate mit geschätzt
5us/Zeichen bzw. 0,5% CPU Last.
W.S. schrieb:> Für all so etwas lohnt sich weder ein RTOS, noch ein Timer oder gar ein> Timer+DMA - was für eine besonders grandiose Idee, insbesondere für den> 4 Bit Betrieb.
Mal wieder Leseverständnis: 6! Setzen!
Hier gehts um den SPI Modus eines DOGM LCD.
Anonsten ist es im Forum bekannt genug, dass du DMA nicht verstanden
hast und es daher verteufelst.
Was will man denn ständig für ausgefallene Befehle an so ein
3 x 16 Text-Display schicken?
Eine Updaterate höher, als 2 x die Sekunde kann keiner lesen,
weil auch die LCs kaum schneller sind.
Schreibst du alle 3 Zeilen 2 x die Sekunde komplett neu, dann
gehen dafür keine 10 ms verloren.
Also 1 % der "Arbeitszeit".
- Wie schlecht ist der Rest programmiert, wenn da noch was
rausgeholt werden muss?
Falk B. schrieb:> Und worüber reden wir denn WIRKLICH? Ein großes 4x20 LCD mit 80 Zeichen> braucht bei 40us/Zeichen 3,2ms Updatezeit. Naja, nicht wirklich schnell> aber auch kein Drama, wenn man das mit 10 Hz / 100ms aktualisiert,> kostet halt 3,2% CPU-Zeit.>> Wer die Wartepausen WIRKLICH nicht mag oder gebrauchen kann schreibt in> einem halbwegs schnellen Timer- Interrupt immer nur 1 Zeichen auf das> LCD. Bei 1 kHz kommt man da auf 12,5Hz Updaterate mit geschätzt> 5us/Zeichen bzw. 0,5% CPU Last.
eben nur wenn ich es schreibe hagelt -
Joachim B. schrieb:> wie schon geschrieben wurde, was soll denn der Prozzi in der> verbleibenen Zeit noch alles machen?>> ob er 4x oder 10x pro Sekunde das Display aktualisiert welches sagen wir> 1ms dauert, die Restzeit ist doch riesigBeitrag "Re: wie im µs Berich effizient warten"
Hansjörg schrieb:> Wie kann ich auf einfache weiße die paar µs> warten ohne das ich ich nichts mache.> Also ich was Sinnvolles mache
Lustige Frage übrigens...
Der TO fragt also ernsthaft, was er in der Zeit, bis mal wieder ein
Zeichen an das Display zu senden ist, Sinnvolles machen könne! Da kann
die Antwort doch nur lauten: was weiße ich denn?? Wenn sein Programm
also nichts anderes macht, als ab und zu ein Zeichen zu senden, woher
soll dann in der "Zwischenzeit" was sinnvolles kommen? Offensichtlich
verstehe ich das Problem nicht :-)
Gruß Rainer
W.S. schrieb im Beitrag #6430108:
> Was bist du doch für ein Blödmann
Danke für die Freundlichkeiten ;)
Der Rest des Postes ist wieder eine typische W.S. Nebelkerze, auch so
lohnt sich DMA+Timer.
Einmal einstellen, abfeuern und die CPU wichtigerere Dinge erledigen
lassen.