Hi, Kleine frage bezüglich des Round-Robin-Verfahrens in einem Scheduler: Ein Round-Robin ist im prinzip ja ein kleiner ringpuffer, welcher nach einer festen reihenfolge prozesse abarbeitungszeit im pozessor zur verfügung stellt. findet ein prozesswechsel statt muss ja dafür gesorgt werden, dass register des prozessors für den jeweiligen prozess geladen werden, bzw für den "schlafen" gelegten prozess zu sichern. weis jemand zufällig nach welcher strategie, die registerinhalte gesichert werden? ein einfacher stack nach dem lifo-prinzip kann es ja nicht sein, da der overhead dann dynamisch mit der prozessanzahl steigen würde ...
:
Verschoben durch Moderator
so weit ich weiss hat jeder Task normalerweise einen TCB (Task Control Block), in welchem u.a. seine Register gesichert / wiederhergestellt werden. Dieser Speicher muss für jede Task reserviert werden. Beim Cortex-M bieten sich für Taskwechsel die LDM / STM Befehle an, sowie der SysTick Timer für die Timeslices. --- PS: Richtige Kommasetzung macht einen Text ungemein lesbarer!
Ok das klingt irgendwie vernünftig :) Dann hab ich noch ne kleine Frage zum Präemptiven Multitasking: Bei dem PM werden Prozesse dem Prozessor zeitweise zur abarbeitung seiner aufgaben übergeben. und je nach priorisierung und spezifischer zeit entzieht der betriebssystemkern dem prozess den prozessor. aber wie soll da eigentlich ablaufen? wie soll der prozessor denn wissen, wann es zeit ist, den prozess schlafen zu legen? läuft ein timer im hintergrund, welcher beim prozesswechsel mit einem spezifischen werden geladen wird und bis null zurück zählt?
> Beim Cortex-M bieten sich für Taskwechsel die LDM / STM Befehle an, > sowie der SysTick Timer für die Timeslices. Damit im Grunde schon beantwortet. Für preemptives Multitasking ist ein Timer erforderlich. Dieser braucht nur runterzählen zu können, über ein RELOAD Register verfügen und einen Interrupt auszulösen. Der Interrupt zündet dann den Taskwechsel.
Oki Danke :) Ein Betriebssystem hat ja eine SPeicherverwaltung, .. und mal angenommen ich mache auf meinem Kontroller mal KEIN OS drauf. Wie würde sich denn in C eien Speicherreserivierung durch malloc verhalten?
Zum freiwilligen Abgeben der Rechenzeit (z.B. Sleep(300), WaitForEvent(...) usw.) brauchst dann noch so was wie einen Softwarwe Interrupt, damit du wieder in den System Mode kommst und zur nächsten, wartenden Task umschalten kannst. Meist laufen Tasks im User Mode. Wichtig ist auch, dass aus einer ISR heraus (z.B. UART RX) kein Taskwechsel erfolgen darf, das haut dir sonst den Task Stack durcheinander.
rennreh schrieb: > Wie würde sich denn > in C eien Speicherreserivierung durch malloc verhalten? genauso wie mit einem OS? Indem der Heap Stück für Stück vergeben wird? Mit einem OS auf einem µC läuft die Speicherverwaltung weiterhin genau so ab wie ohne. Interessant wirds, wenn eine MPU oder MMU mit ins Spiel kommt ...
Ok Vielen Danke :) Gibt es für Mikrokontroller Echzeitbetriebssystem (nicht auf x86 basierte), welche im protected mode laufen oder ist es im embedded bereich eher untypisch? ich habe gesehen, dass der cortex m3 beispielsweise mehere user level hat, kann es auch hier schon sein, dass es hardwaremäßig schon nicht möglich ist auf bestimmte bereiche im speicher zuzugreifen?
Protected Mode setzt eine MPU oder MMU voraus. Es gibt (wenige) Cortex-M3 Microcontroller mit MPU, MMU findest du erst bei grösseren Cores. User / System Level heisst nur, dass der User Code bestimmte Sachen nicht machen darf. Dann landet der Code im Fault.
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.