Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Prüfen, ob Thread läuft Kategorie: Programmierung (von André H. - 11.03.2007 19:21)
Als Antwort auf Prüfen, ob Thread läuft von Heiko - 5.03.2007 15:33
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0, OSOPT V3.1
Hallo Heiko,

> Was passiert eigentlich?, wenn ein Thread einen zweiten startet (Run), dieser 2. zählt z.B. von 0 bis 500.
> Nun stoppt ein anderer Thread den laufenden 2. bei einem Zählerstand von z.B. 100 (Halt).
> Wenn der 2. nun erneut gestartet wird (Run), zählt er dann bei 100 oder wird er komplett neu gestartet und
> der Zähler beginnt von vorn?

Wenn ein Thread mittels halt; oder auch run 0;, was beides
identisch ist, angehalten wird, und dann wieder mit run grö�er 0 oder resume
"gestartet" wird, läuft er genau an der Stelle weiter, an der er angehalten wurde.

> Ich denke mir (könnte man sicher auch mit einem kleinen Prog testen), da bei 'Halt' nur die Prio auf 0
> gesetzt wird, er bei 100 weitermacht.

Korrekt.

> Wenn dem so ist, gibt es eine Möglichkeit einen Thread zu stoppen und komplett neu zu starten,
> so da� der Zähler neu gestartet wird?

Dazu dient das Schlüsselwort reset.
Hierdurch wird der Thread zurückgesetzt.
Er wird aber nicht unbedingt angehalten, sondern auf die durch den Compiler
definierte Prio gesetzt.
D.h. bei Threads mit dem Namen "main" beträgt die Standard-Prio 32, bei allen anderen 0.

> Kann man eigentlich prüfen, ob ein bestimmter Thread läuft und mit welcher Prio?

Das ist möglich, aber derzeit noch zu umständlich.
Man muÃ? zuerst die Threadnummer des Threads ermitteln.
AnschlieÃ?end kann man kann man auf die Variablenbereich mit den Thread-Infos
zugreifen und das entsprechende Feld auslesen.
Dazu ist einiges an Kenntnisse der internen Offsets nötig.

Aber mal sehen:
Im internen RAM(Segment 0) an 0xF924 befindet sich der RAM-Pointer
mit dem Offset der Daten des aktuellen Threads.
Die Thread-Daten bestehen aus einem Datensatz von je 20Byte.
Darin befindet sich an Offset 0 das Word für den Programmzähler (Offset VM-Code).
An Offset 2 sollte die Startadresse(W) des Thread-Stackpointers im RAM sein.
An Offset 4 des Thread-Stackpointer(W) selbst, an Offset 6(W) die Adresse des Capture-Flag
ab Offset 8 befinden sich zwei Long-Werte die mit "sleep" zu tun haben.
An Offset 16 befindet sich die Threadpriorität(B).
An Offset 17 die vorherige Priorität(B).
An Offset 18 und 19 zwei weitere Werte, die ich noch nicht ganz zuordnen konnte. ;-)

Wichtig zu wissen wäre noch, da� im RAM (Segment 8) die Threaddaten ab Adresse 0 stehen sollten.
Man kann die Lesefunktionen des Moduls flash.c2 dazu miÃ?brauchen, die Daten zu lesen.
Um die Threadnummer herauszufinden, ohne die Threads im eigenen Programm durchzählen
zu müssen, kann man die Threadnummer des jeweils aktuell ausgeführten Threads ermitteln.
Dazu muÃ? lediglich 0xF91A im internen RAM (Seg0) ausgelesen werden.
Um die Prio des aktuell ausgeführten Threads zu erfassen, mu� an der in 0xF924 (Seg0)
gespeicherten Adresse für Segment 8 plus einem Offset von 16 lediglich
der Bytewert gelesen werden.

Dies zu ein paar kleinen Intera des OS.

MfG André H.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten: