Hi
auf die Frage nach den einfachsten Betriebssystem bekam ich die Antwort:
"while(1)". Ok das kann man nicht wirklich verneinen. Es kann zwar nicht
viel, ist dafür aber auch wirklich einfach.
Anfänger:
Das ist jetzt auf keinen Fall der Weißheit letzter Schluss. Es soll nur
als Anregung dienen.
Profis:
Macht ihr das auch so, oder so ähnlich?
Konzept:
In einen Timer wird eine Variable (oder ein Array von Variablen)
runtergezählt. Meistens löst der Timer bei mir im ms Takt einen
Interrupt aus. Wenn die Zahl 0 ist oder 255 (bei 16 Bit 65535) wird
nicht runtergezählt. 0 ist das Zeichen das der Timer abgelaufen ist, und
die höchste Zahl das der Timer aus ist. In den beiden Fällen wird der
Timer nicht runtergezählt.
Die while-schleife
1 | int main(void)
|
2 |
|
3 | {
|
4 | inits();
|
5 | while(1)
|
6 | {
|
7 | if ( Timer1_done )
|
8 | {
|
9 | Timer1_set(30);
|
10 | // Mach was alle 30 ms
|
11 | }
|
12 | if ( Timer2_done )
|
13 | {
|
14 | }
|
15 | // usw.
|
16 | }
|
17 | }
|
Jetzt achte ich nurnoch darauf das die nicht Zeitkritischen Teile sehr
schnell fertig sind. Also nicht deutlich über eine ms. Es muss ja nicht
nach den Timer geschaut werden. Man kann auch schauen ob Daten am UART
angekommen sind. Bei mir werden sie von einer interruptroutine in eine
ringbuffer geschrieben und in der while-schleife wird nurnoch gepollt ob
was im Buffer steht, das ist ja dann nichtmehr zeitkritisch.
Durch den Timer hat man ein SEHR einfachen Prozess-Scheduler, dieser
wird keine Funktion unterbrechen, man muss also selber dafür sorgen das
diese nicht zu lange dauern.
ps:
es ist nichts großartiges, bloß habe ich in letzter Zeit Programme von
"Profis" gesehen, die alles andere als "sauber" waren. Nicht hier, keine
sorge. Ich hoffe man erkennt auf was ich rauswill :-)