22.11.2013 Aufrufe

Programmieren von LegoMindstorms-Robotern mit NQC

Programmieren von LegoMindstorms-Robotern mit NQC

Programmieren von LegoMindstorms-Robotern mit NQC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

int sem;<br />

task main()<br />

{<br />

sem = 0;<br />

// Ausgangswert für die Variable<br />

start move_square;<br />

SetSensor(SENSOR_1,SENSOR_TOUCH);<br />

while (true)<br />

{<br />

if (SENSOR_1 == 1)<br />

// Signal <strong>von</strong> Berührungsensor<br />

{<br />

until (sem == 0); sem = 1; // Motor frei? Signalisiere “Motoren<br />

belegt”<br />

OnRev(OUT_A+OUT_C); Wait(50); // Übernehme Steuerung!<br />

}<br />

}<br />

}<br />

OnFwd(OUT_A); Wait(85);<br />

sem = 0;<br />

// signalisiere “Motoren frei”<br />

task move_square()<br />

{<br />

while (true)<br />

{<br />

until (sem == 0); sem = 1; // Motor frei? Signalisiere “Motoren belegt”<br />

OnFwd(OUT_A+OUT_C); // Übernehme Steuerung!<br />

sem = 0;<br />

// signalisiere “Motoren frei”<br />

Wait(100);<br />

until (sem == 0); sem = 1; // Motor frei? Signalisiere “Motoren belegt”<br />

OnRev(OUT_C);<br />

// Übernehme Steuerung!<br />

sem = 0;<br />

// signalisiere “Motoren frei”<br />

Wait(85);<br />

}<br />

}<br />

Du könntest argumentieren, dass es in move_square() nicht notwendig ist, das Semaphor auf 1 und zurück auf 0 zu<br />

setzen. Auf den ersten Blick hast du Recht. Dennoch ist dieses sinnvoll. Der Grund ist, dass sich der OnFwd() Befehl in<br />

Wirklichkeit aus zwei Befehlen zusammensetzt (siehe Kapitel 9). Dieser Befehlsablauf sollte nicht durch eine andere Task<br />

unterbrochen werden.<br />

Semaphore sind sehr nützlich und, wenn du schwierigere Programme <strong>mit</strong> parallelen Tasks schreibst, wirst du sie fast immer<br />

benötigen. Dennoch gibt es einige wenige Fälle, in denen auch diese Methode scheitert. Finde sie heraus.<br />

11.3. Zusammenfassung<br />

In diesem Kapitel betrachteten wir einige der Probleme, die auftreten können, wenn parallele Tasks dieselben Motoren<br />

ansteuern. Achte darauf, weil unvorhergesehene Verhaltensweisen deines Roboters oft darauf zurückzuführen sind.<br />

Wir sahen zwei unterschiedliche Möglichkeiten solche Probleme zu lösen.<br />

• Die erste Lösung stoppt und startet Tasks wieder, und stellt so sicher, dass nur eine kritische Task läuft.<br />

• Die zweite Lösung verwendet Semaphore, um die Ausführung <strong>von</strong> Tasks zu steuern. Dieses garantiert, dass immer nur<br />

eine Task die Motoren steuert.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!