Hallo, hier soll es um die Erarbeitung gehen, wie auf einem AVR (hier ein Mega
ein Scheduler implementiert werden kann. Im unteren ausklappbarem Code steht der Post, wie ich diesen Thread ursprünglich angefangen habe. Die eigentlichen Aktionen gehen erst bei Eintrag #6 los.
Vorraussetzung für diesen Thread ist, dass man Assembler versteht und weiß, was bei einem Interrupt im AVR vor sich geht.
Auch sollen hier nicht die Philosophien diverser Scheduler, Multitasksystem oder Betriebssysteme erörtert werden.
ich denke allerdings nicht, das eine Vorstellung davon, was ein Scheduler ist zwangsweise nötig ist. Im Sinne des induktiven Lernens also villeicht interessant. Es soll um ein How-To gehen, das ganz unten anfängt - weil das auch mein Startpunkt in Sachen Scheduler auf AVR ist 
Es sei nur kurz gesagt, dass die Grundidee eines Schdulers ist folgende ist:
Es gibt ein Sammelsorium an Aufgaben/Funktionen. In bestimmten Zeitabständen wird ein so genannter Scheduler aufgerufen, oft in Form einer ISR. Dadurch wird natürlich ein gerade laufende Funktion unterbrochen. Der Scheduler in der ISR kann dann anhand "irgendwelcher" Informationen entscheiden, ob es villeicht sinnvoll ist, erstmal eine andere Funktion aufzurufen, bevor zur ersten zurückgeprungen wird.
Code:
Hallo da,
ich bin auf dem Weg zum ersten mal zu einem Scheduler zu greifen. Ich weiß wohl, dass das was ich erreichen will der Norm nach aus Scheduler und Dispatcher besteht.
Hintergrund:
Ich habe an der UART vom Mega8 eine GPS Antenne und will auf Basis eines Zielortes, des eigenen Standortes und dem Kurs über Grund eine Zielpeilung machen. Das geht auch schon und man kann sich vorstellen, dass die Aufgabe in Funktionen unterteilt ist "gathering_data()", "compute_lan_lon_diff();", "divide_y_by_x"();" usw...
Jetzt soll das Teil aber bald noch mehr können. Ich habe vor einen Interrupt auf Basis des Timer2 mit 20kHz laufen zu lassen, wo der Scheduler läuft und entscheidet, wenn etwas anderes anliegt, ob zuerst das erledigt werden sollte.
Problem:
Jetzt komm ich gedanklich nicht weiter, wie ich das tatsächlich umsetzte. Ich habe etwas Bauchschmerzen mit der Idee, aus der ISR heraus vom Scheduler/Dispatcher eine Funktion aufzurufen.
Wie bekomme ich es also hin, dass nach Ablauf der ISR nicht in eine der GPS Funktionen zurückgesprungen wird, sondern erstmal an eine andere Stelle?
Muss ich da am Stack für den Programmcounter rumspielen und die Adresse einer anderen Funktion "reinmogeln"?
viele Grüße,
The Man
Lesezeichen