Du kannst doch ganz einfach eine zaehlende Semaphore implementieren und dann die kritischen Abschnitte mit Mutex sichern. Und bei der V Operation weckst du mit cond_signal halt einen Wartenden auf.
@Erik:
Du nimmst einfach einen unsigned int als Semaphore, schuetzt jeden Zugriff mit einer mutex-Variable und verwendest zusaetzlich eine condition-Variable, um daran zu blockieren / aufgeweckt zu werden. Also im P() ein cond_wait und im V() ein cond_broadcast.
Wie soll denn eine RCXAddress aussehen?
Und warum soll das CommSys gleich 3 Varianten haben? Verhaelt sich der RCXSim doch unterschiedlich zum richtigen RCX?
Und was ist mit der Portabilitaet gemeint? Welche der benoetigten Funktionen stehen denn nicht sowohl unter Linux als auch Solaris zur Verfuegung?
Ich glaube die 3 Varianten braucht man weil man bei reiner UDP-Kommunikation so viel senden kann wie man will. Bei UDP-Sim kann man immer nur ein einziges Byte pro Nachricht versenden, bei serieller Kommunikation ebenso, aber eben über die serielle Schnittstelle … btw: wie macht man das eigentlich? Einfach dieses /dev/legonding öffnen und write/read drauf ausführen?
[quote=Sebbi]
Bei UDP-Sim kann man immer nur ein einziges Byte pro Nachricht versenden, bei serieller Kommunikation ebenso, aber eben über die serielle Schnittstelle [/quote]
Wo steht das eigentlich? Oder ist das vom Himmel gefallen? (Sprich, man muss sich die Information selber besorgen)
Bei mir bleibt der thread immer vor pthread_mutex_lock hängen.
Wie initialisiert ihr den/die/das (weiß das einer) mutex?
Auch mit pthread_mutex_init(&mutex, NULL);?
Das funktioniert immer noch nicht richtig. In einer Schleife mit max. 100000 Iterationen teste ich die Semaphore. Aber nach 270-340 Iterationen gibt’s dead lock. Wie benutze ich die Semaphore?
Der Startwertwert ist doch count = 0;
Erst V, dann kritischer Abschnitt, dann wieder P, oder?
PS: in der abgegebenen Lösung wird natürlich nur mit 100 Iterationen getestet
Mal was Neues, weiß einer wo die folgenden Fehler herkommen:
/tmp/cc28SLhw.o(.text+0x364): In function CommunicationSystem::start_send_now_thread()': : undefined reference to thread_create’
/tmp/cc28SLhw.o(.text+0x596): In function CommunicationSystem::send_now()': : undefined reference to sendchar’
/tmp/cc28SLhw.o(.text+0x5a9): In function CommunicationSystem::send_now()': : undefined reference to sendchar’
/tmp/cc28SLhw.o(.text+0x661): In function CommunicationSystem::receive(Address*, Buffer*)': : undefined reference to rcvchar’
/tmp/cc28SLhw.o(.text+0x698): In function Semaphor::Semaphor[not-in-charge]()': : undefined reference to init_semaphore’
/tmp/cc28SLhw.o(.text+0x6b6): In function Semaphor::Semaphor[in-charge]()': : undefined reference to init_semaphore’
/tmp/cc28SLhw.o(.text+0x6d4): In function Semaphor::Semaphor[not-in-charge](int)': : undefined reference to init_semaphore’
/tmp/cc28SLhw.o(.text+0x6f2): In function Semaphor::Semaphor[in-charge](int)': : undefined reference to init_semaphore’
/tmp/cc28SLhw.o(.text+0x708): In function Semaphor::P()': : undefined reference to p’
/tmp/cc28SLhw.o(.text+0x71e): In function Semaphor::V()': : undefined reference to v’
Ich include brav mein api.h, das sieht dann so aus:
#include “api.h”
Selbst M$ VC 5 kompiliert das alles, nur unter Linux ist es nicht kompilierbar
Achso, warte mal, die Fehler kamen mit meiner Makefile. Ich habe inzwischen die offizielle aus /proj/i4vs/pub/RCX/rcx_example kopiert, und leicht abgeändert.
Der Inhalt ist nun:
“make” baut das Projekt
“make load” laedt das Program auf den RCX und
startet ein simples terminal-Programmtarget zur
“make simlaod” startet den Simulator und lädt das Program.
Ausserdem wird ein xterm gestartet,
welches die Kommunikation mit dem
simulierten RCX ermöglicht
“make debug” startet den Simulator mit dem Programm im debugger modus
wartet auf die ankopplung eines GDB (siehe make debugger)
“make debugger” startet den GDB und koppelt diesen
Fullquote
Mit Count = 1 hast du die gleiche Funktion wie sie etwa so ein Mutexding liefert … Count = 0 bedeutet, dass blockierend gestartet wird … denn eigentlich ist P() = „ich betrete einen kritischen Bereich“ und V() = „ich verlasse ihn“
Ich hatte bei meinen diversen Versuchen auch solche „undefined references“. Hat mich auch fast zur Verzweiflung gebracht… Dann hab ich zum kompilieren statt gcc g++ verwendet, und plötzlich lief alles… Unter anderem konnte ich das Zeug dann auch ohne Probleme auf den Sun’s kopilieren.
Hast du die Environment-Variablen richtig gesetzt, so wie in /proj/i4vs/pub/faq beschrieben?
Wenn ich rcvchar() mache, kommt immer der Fehler ‘ASSERTION: Domain != NULL failed’ im Java-Fenster des RCX Simulators. Kann mir einer sagen, was das soll?