sehr rudimentäres kooperatives multitasking
Posted: Tue 15 May, 2007 11:32 pm
Hi Leutz,
auch wenn das noch ein klein wenig entfernt ist vom richtigen multitasking, so kommt es doch den kooperativen multitasking sehr nahe und bringt einiges an interessanten Funktionen mit sich.
Worum geht es? Ich dachte mir, ich lerne mal etwas über Funktionspointer und habe in ner ruhigen Stunde mal ein kleines, sowas wie Multitasking OS zusammengebaut.
Um das eigendliche Context-Switching muss ich mir noch Gedanken machen, dazu muss man etwas tiefer in asm rein und u.a. die CPU-Register sichern.
Was kann das ?
nun ja, man schaue sich folgendes an
Die Parameter, die die Tasks als Übergabe bekommen, dienen hier nur zum Testen. Natürlich kommen die in einer richtigen Anwendung nicht vor.
...und das for(i=0; i<10; i++) ist natürlich auch nur dafür da, das Verhalten zu begucken, da mit ansonsten die Ausgabe der printf's davonrennt
Das komplette Paket zum nur testen (ordner debug mit der .exe) und dem MS VC-Projekt gibtz hier:
http://medra.dyndns.org/thOS/scheduler/ ... ointer.rar
sowie auch die einzeldateien zum einsehen.
Ich denke, selbst diese rudimentäre Sache ermöglicht schon eine recht mächtige Programmierung, wenn man in die Tasks mit einbaut, dass sie rechenzeit abgeben.
Noch ist das nicht implementiert, ich denke noch über eine Art sleep(ms) funktion nach, sowie über eine prioritätssteuerung.
Weiterhin kommt noch die Messung der einzelnen Tasks mittels Timer hinzu.
Wer jetzt sagt, das krieg ich doch auch hin mit
while(1)
{
func1();
func2();
func3();
}
sollte sich das ganze doch vllt etwas genauer ansehen.
Sicher nicht für jesen Microcontroller interessant, aber dennoch ein interessanter Ansatz mit vielen schönen Möglichkeiten, wenn man seine Software erweitern will.
Auch interessant für die Kombination mit (m)einer Shell, wo der Benutzer direkten Zugriff auf das System hat.
Oder man könnte Bedarfsgesteuert aus einer ISR oder von wo auch immer heraus eine Task auf einfache Art aktivieren, und sie entweder ne weile (oder einfach nur ein mal) laufen lassen, und dann mit irgendeinem anderen kriterium oder irgendwo anders wieder deaktivieren. Sie wird ja - auch wenn vorher deaktiviert - immer bis zum "ende" ausgeführt.
Greetz,
/r.
PS: Nicht alle auf einmal hauen *duck*
auch wenn das noch ein klein wenig entfernt ist vom richtigen multitasking, so kommt es doch den kooperativen multitasking sehr nahe und bringt einiges an interessanten Funktionen mit sich.
Worum geht es? Ich dachte mir, ich lerne mal etwas über Funktionspointer und habe in ner ruhigen Stunde mal ein kleines, sowas wie Multitasking OS zusammengebaut.
Um das eigendliche Context-Switching muss ich mir noch Gedanken machen, dazu muss man etwas tiefer in asm rein und u.a. die CPU-Register sichern.
Was kann das ?
nun ja, man schaue sich folgendes an

Code: Select all
#include <stdio.h>
#include <conio.h>
#include "main.h"
#include "scheduler.h"
int func1(int);
int func2(int);
int func3(int);
int func1(int a)
{
static counter1=0;
printf("\nTask 1: %i", a);
deleteTask(func1);
return(0);
}
int func2(int a)
{
printf("\nTask 2: %i", a);
//deleteTask(func2);
return(0);
}
int func3(int a)
{
printf("\nTask 3: %i", a);
//deleteTask(func3);
return(0);
}
int main()
{
int i=0;
schedulerInit();
// insert new tasks
insertTask(func1);
insertTask(func2);
insertTask(func3);
// set tasks active
setTaskState(func1, TASK_RUNNING);
setTaskState(func2, TASK_RUNNING);
setTaskState(func3, TASK_RUNNING);
printf("\nScheduler started...:");
// run the scheduler. later this will be done by an isr with constant timing
for(i=0; i<10; i++)
{
printf("\nNo. %i", i);
scheduler();
}
printf("\n\n");
return(1);
}
...und das for(i=0; i<10; i++) ist natürlich auch nur dafür da, das Verhalten zu begucken, da mit ansonsten die Ausgabe der printf's davonrennt

Das komplette Paket zum nur testen (ordner debug mit der .exe) und dem MS VC-Projekt gibtz hier:
http://medra.dyndns.org/thOS/scheduler/ ... ointer.rar
sowie auch die einzeldateien zum einsehen.
Ich denke, selbst diese rudimentäre Sache ermöglicht schon eine recht mächtige Programmierung, wenn man in die Tasks mit einbaut, dass sie rechenzeit abgeben.
Noch ist das nicht implementiert, ich denke noch über eine Art sleep(ms) funktion nach, sowie über eine prioritätssteuerung.
Weiterhin kommt noch die Messung der einzelnen Tasks mittels Timer hinzu.
Wer jetzt sagt, das krieg ich doch auch hin mit
while(1)
{
func1();
func2();
func3();
}
sollte sich das ganze doch vllt etwas genauer ansehen.
Sicher nicht für jesen Microcontroller interessant, aber dennoch ein interessanter Ansatz mit vielen schönen Möglichkeiten, wenn man seine Software erweitern will.
Auch interessant für die Kombination mit (m)einer Shell, wo der Benutzer direkten Zugriff auf das System hat.
Oder man könnte Bedarfsgesteuert aus einer ISR oder von wo auch immer heraus eine Task auf einfache Art aktivieren, und sie entweder ne weile (oder einfach nur ein mal) laufen lassen, und dann mit irgendeinem anderen kriterium oder irgendwo anders wieder deaktivieren. Sie wird ja - auch wenn vorher deaktiviert - immer bis zum "ende" ausgeführt.
Greetz,
/r.
PS: Nicht alle auf einmal hauen *duck*
