VS Aufgabe 2 - Runnable


Ja, das ist mir durchaus bewußt - wenn ich aber gern eine Semaphore mit Startwert 2 hätte? Was mach ich dann?


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?

Fragen ueber Fragen :]…


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);?


Google mal nach “zählende Semaphore” und betrachte den ersten Treffer … may the force be with you :slight_smile:


Spontan haette ich das auch so gemacht… Hat das schon mal jemand ausprobiert?
Ist ueberhaupt jemand schon so weit …?


Uiii, Volltreffer!!! :wink:


[quote=Legolas]

Ich haette mir wohl die Uebungsfolien genauer durchlesen sollen :smiley: .


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 :smiley: :smiley: :smiley:


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 :frowning:


da mosert der linker - sicher dass du auch die entsprechenden bibliotheken dazulinkst?


Naja, welche brauche ich denn?

Ich habe in a2.cpp: api.h, a2.h
in a2.h: api.h

Im Visual Studio unter Windows kompiliert’s und linkt’s auch, nur unter Linux nicht :wand:


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

an einen laufenden RCXSimulator

ROOTDIR = $(PWD)

SOURCES = a2.cpp <— geändert
TARGET_NAME = a2 <— geändert

it is unlikely that anything below must be modified

#----------------------------------------------------
[…] (nichts geändert)

Es kommt beim Kompilieren der foglende output:

/proj/i4vs/pub/RCX/bin/h8300-elf-ld -T /proj/i4vs/pub/RCX/rcx.lds -nostdlib --gc-sections /home/cip/2002/simmmuel/A2RCX/obj/a2.o -whole-archive /proj/i4vs/pub/RCX/bin/kernel.a -o a2.elf32
/proj/i4vs/pub/RCX/bin/kernel.a(c++.o)(.text.cplusplus_main+0x17): In function cplusplus_main': /proj/i4vs/pub/RCX/jx-rcx.src/c++.cpp:15: undefined reference to __Z7rcxmainv’
make: *** [a2.elf32] Error 1

Was zum $#~+%& ist das schon wieder?


Fullquote :slight_smile:
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“


Ja umgekehrt habe ich es auch schon versucht, aber da gab’s gleich beim allerersten P deadlock :#:


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?


Ach so, jetzt weiss ich was falsch war. ‘main’ muss man in ‘rcxmain’ umbenennen (siehe Beipiel in /proj/i4vs/pub/RCX/rcx_example).
Trotzdem Danke!


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?