13.07.2015 Aufrufe

Programmierung LEGO NXT Roboter mit NXC

Programmierung LEGO NXT Roboter mit NXC

Programmierung LEGO NXT Roboter mit NXC

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.

until (sem == 0);sem = 1; //Acquire(sem);// Do something with the motors// critical regionsem = 0;//Release(sem);Die erste Programmzeile until (sem == 0) veranlasst einen Task (definieren wir diesen als task_1) solangezu warten, bis die Motoren freigegeben wurden. Ist dies der Fall, kann task_1 nun seinerseits auf die Motorenzugreifen. Dabei wird der Semaphore sem der Wert 1 zugewiesen. Anschließend wird der kritische Programmblockausgeführt. Danach wird der sem der Wert 0 zugewiesen und auf die Motoren kann nun wiederzugegriffen werden. Nun lässt sich das zuvor „fehlerhaft“ programmierte Programm, <strong>mit</strong> Hilfe der Semaphorekorrigieren, da<strong>mit</strong> das unvorhersehbare Verhalten des <strong>Roboter</strong>s nicht länger auftaucht.int sem;//Deklaration der globalen Variable semtask move_square(){while (true){until (sem == 0); sem = 1;OnFwd(OUT_AC, 75);sem = 0;Wait(1000);until (sem == 0); sem = 1;OnRev(OUT_C, 75);sem = 0;Wait(850);}}task submain(){SetSensor(IN_1, SENSOR_TOUCH);while (true){if (SENSOR_1 == 1){until (sem == 0); sem = 1;OnRev(OUT_AC, 75); Wait(500);OnFwd(OUT_A, 75); Wait(850);sem = 0;}}}task main(){sem = 0;Precedes(move_square, submain);}Es kann hier argumentiert werden, dass es nicht notwendig ist, in der Task move_square die Semaphore auf 1bzw. 0 zu setzen. Dem kann allerdings widersprochen werden, da der Befehl OnFwd faktisch aus zwei Befehlenbesteht (siehe auch Kapitel 8). Es ist nicht gewollt, dass diese Befehlssequenz von einer anderen Taskunterbrochen wird. Semaphoren sind sehr nützlich und manchmal auch notwendig, wenn komplexereProgramme <strong>mit</strong> parallelen Task geschrieben werden 18 .18 Deadlock-Problem: Bei der Verwendung paralleler Programmstrukturen kann das sogenannte Deadlock-Problemm auftreten. Hierbei warten zwei Abläufe (Tasks) gegenseitig aufeinander (hier: auf die Freigabe derResource Motor). Zur Behebung dieser Problematik können verschiedene Techniken angewendet werden. Dieeinfachste Lösung wäre, jede Task darf nur eine Resource gleichzeitig verwenden.36

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!