Forum: Mikrocontroller und Digitale Elektronik TNKernel: Task soll vorzeitig Rechenzeit abgeben


von Peter (Gast)


Lesenswert?

Hallo,
Ich benutze den TNKernel, eigentlich ein sehr gutes RTOS, aber ich habe 
ein kleines Problem. Ich habe eine Task am Laufen, die nur ein paar 
Polling-Aktionen macht und daher nicht so viel Rechenzeit braucht. Ich 
möchte nun gern erreichen, daß diese Task nach jedem Schleifendurchlauf 
den Rest ihrer Zeitscheibe abgibt, also so, daß eine andere Task sofort 
dran kommt.
So wie es jetzt ist, verbrät sie ihre vollen 20ms sinnlos in der 
Schleife.
Weiß jemand wie man das machen kann?
BTW, Ich habe vor einigen Tagen auch schon den Entwickler angemailt, 
aber bis jetzt noch keine Antwort erhalten.

Danke,
 Peter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

In der Dokumentation steht

> When the currently running task loses its claim for executing
> (by the issuing of a system call or interrupt), a context
> switch is performed. The current context (processor registers,
> stack pointer, etc.) is saved and the context of another task
> is restored.

Das interpretiere ich so, daß Du zum "Zurückgeben" des ungenutzten 
Zeitscheibenrests nur eine Systemfunktion aufrufen musst.

Das ist unter anderen* (RT)OSen auch so realisiert, dort dient Sleep(0) 
diesem Zweck.

Allerdings verhält sich die hier geeignet erscheinende Funktion 
tn_task_sleep() etwas anders als erwartet; die Angabe von 0 als Argument 
ist nicht zulässig.

Vielleicht findet sich ja eine andere Systemfunktion, die sich 
entsprechend harmlos verhält - ich programmiere selbst nicht mit 
TNKernel.

Erfolg!


*) So beispielsweise bei OS-9/68K und -man staune!- Win32

von Peter (Gast)


Lesenswert?

Hallo Rufus, danke für deine Antwort.
Ja, Sleep(0) kenne ich auch von Win32. Der TNKernel hat interne 
Funktionen namens tn_switch_context() und tn_switch_context_exit(), mit 
denen sowas angeblich möglich sein soll. Aber leider funzt nichts davon. 
tn_switch_context() tut einfach gar nichts (die Task läuft unbeeindruckt 
weiter), während tn_switch_context_exit() die Task lahm legt, so daß sie 
gar nicht mehr dran kommt. Wenn sich der Entwickler nicht meldet, werde 
ich wohl den TNKernel selber modifizieren müssen. Mir wird schon was 
einfallen....

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
Noch kein Account? Hier anmelden.