Programmieren von LegoMindstorms-Robotern mit NQC
Programmieren von LegoMindstorms-Robotern mit NQC
Programmieren von LegoMindstorms-Robotern mit NQC
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.