Hi, ich habe einen kleinen simplen Scheduler auf einem ATmega162 geschrieben. Ich habe einen 32kB SRAM-Baustein als externen Speicher angeschlossen und benutze diesen als eigentlichen "Arbeitsspeicher". Der Scheduler erlaubt in seiner jetzigen Form die pseudoparallele Ausführung von bis zu 8 Tasks, wobei jeder Task feste 4kB des externen SRAMs zugeteilt bekommt. Das Scheduling erfolgt durch den Timer0 Overflow. Das Scheduling-Intervall kann mit der entsprechenden Prescaling-Wahl beeinflußt werden. Bei einem Task-Switch werden alle Register (inkl. Status Register), der Stack-Pointer uns natürlich der Programmcounter gespeichert und danach alle Register etc. vom nächsten Task geladen. Es ist ein einfacher Round-Robin-Algorithmus, es werden also alle Tasks nacheinander durchgegangen. Ein Task-Switch dauert bei einer Taktfrequenz von 16MHz ca. 16µS. Für extrem Zeitkritische Aufgaben ist so ein Scheduler natürlich nicht geeignet, aber wenn es nicht auf die absolute Geschwindigkeit ankommt, ist er sicherlich ganz praktisch. Ich will ihn irgendwann noch etwas erweitern, so dass ein Task z.B. einen Interrupt-Handler registrieren kann, oder aber dass sich ein Task freiwillig schlafen legt u.ä. Ich kann keine Fehlerfreiheit beim Schedulen garantieren, hab das ganze nur rudimentär getestet. Tasks werden der übersichtlichkeit halber in einzelnen Dateien abgespeichert. Als Beispiel sind zwei Tasks dabei, die zwei Pins auf PortB abwechselnd an- und ausschalten. Die Tasks werden in der tasks.asm "included". Die Hauptdatei ist die tasktest.asm. Bin wür Wünsche und Anregungen offen! Gruß, Christof
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.