Re: Langzeitstabilität der CC2-Station? Kategorie: CC2-Unit & Appl.Board / CC2-Station (von Olaf - 26.02.2004 12:25) | ||
Als Antwort auf Re: Langzeitstabilität der CC2-Station? von Ralf - 25.02.2004 0:01 | ||
| ||
Ralf, so ganz kann ich deine Argumentation mit dem wann muss ich wie globale varibalen bei multithreading schützen nicht nachvollziehen. Im Conrad Handbuch ist die Probelmatik bei Multithreading doch wunderbar (und richtig) erläutert ? Aliasing von Speicherzugriffen ? Konkurrenz mehrerer Prozesse um eine Ressource Weiter unten im Handbuch steht dann wie capture und release funktionieren. Damit gilt (zumindest unter original OS und OSOPT_V2) "Die capture-Anweisung existiert in einer expliziten und einer impliziten Form. Die explizite Form erwartet die Angabe eines Bezeichners einer globalen (!) byte-Variable." ... mein tipp nur die explizite benutzen, die implizite ist nicht so gut nachvollziehbar und spart weder speicher noch rechenzeit.... "Beim Ausführen der capture-Anweisung testet der aktuelle Thread, ob der Wert der Variablen 0 ist (= ??Freizeichen?). Wenn ja, dann schreibt der Thread seine eigene Nummer (Wert 1 ? 255) in die Variable und merkt sich die Adresse der byte-Variable. Wie bereits erwähnt, dieser Vorgang läuft atomar, in einer einzigen Operation der virtuellen Maschine ab." So, und damit ist dann wohl auch klar das nur ein schützen von Lese oder Schreibzugriffen auf globale Variablen NICHT ausreicht. Im Multithreading müssen, sofern ein schreibender thread exisitert, ALLE also sowohl Schreib- als auch Lesezugriffe mit capture/release geschützt werden !! Ansonsten kann genau der Fall eintreten den Ralf unten beschreibt... > hat z.B Thread xy gerade in Byte 3 und Byte 2 der Variable einen Teil > vom neuen Wert eingetragen und dann wird umgeschaltet auf Thread z. Von Thread z wird gerade > jetzt die Variable gelesen, und schon existiert ein Wert, den es so gar nicht geben dürfte. und wie jemand anders gesagt hat irgend wann wird der Fall auch eintreten ! Wenn man dieses nicht tut braucht man sich nicht über die Langzeitstabilität wundern und auch keine Hardware tauschen... ?brigens betreibe ich eine Haussteuerung mit ca. 60 I/O ports 2 externen LCD display, diverser Zusatzhardware. Die Software ist voll multithreaded, arbeitet mit Interrupts von den MAX7311 und PCF chips und ist sehr flexibel und erweiterbar entworfen. Die volle Ausbaustufe habe ich noch nicht erreicht aber die CC2Station läuft seit fast 2 Jahren (ich hatte damals eine der ersten) ohne Probleme oder undeterministschem Verhalten. Allerdings auch im Keller, wo immer ca. 15 Grad Temp sind. Inzwischen bin ich sehr zuversichtlich was die Langzeitstabilität der Hardware und des OS angeht. Olaf > Hallo Frank > > ( sun ist eine globale long-Variable ) > capture glob.cFlag; > glob.sun = 0; > release; > > Nach einem capture mu? mit release das Multitasking so schnell wie möglich wieder frei gegeben > werden. > Dieses Verfahren ist erforderlich, wenn über globale Variablen Daten zwischen Threads ausgetauscht > werden. Wenn es möglich ist, dass zwei Threads gleichzeitig auf die Variable zugreifen, einer zum > lesen, der andere zum schreiben, dann tun sie das auch irgend wann mal, das ist sicher. > Bei so einem Fehler hat z.B Thread xy gerade in Byte 3 und Byte 2 der Variable einen Teil > vom neuen Wert eingetragen und dann wird umgeschaltet auf Thread z. Von Thread z wird gerade > jetzt die Variable gelesen, und schon existiert ein Wert, den es so gar nicht geben dürfte. > > Eins von beiden mu? dann geschützt werden: Die Lese- oder die Schreibzugriffe. Man wird > die Schreibzugriffe schützen, wenn sie von verschiedenen Threads ausgeführt werden und/oder > wenn die Zahl der Lesezugriffe grö?er ist als die der Schreibzugriffe. Nur wenn von einem Thread > relativ wenig Lesezugriffe erfolgen und viele Schreibzugriffe in EINEM Thread (nacheinander) > ausgeführt werden, wird man den/die Lesezugriffe schützen. > > Bei Hardwarezugriffen ist es ähnlich (wenn die Treiber nicht schon gecapturet sind, da muss Du > Dir die Funktionen mal genau ansehen). > > Beim Fehlersuchen kannst Du capture/release ruhig verstreuen wie Salz. Noch besser ist: Andere > Threads erstmal abzuschalten um zu gucken, was passiert dann. > > Viele Grü?e > Ralf > > > > > Hallo Ralf! > > > > Vielleicht löst das ja auch mein Problem, wäre zu schön um wahr zu sein. Du hast wirklich jeden > > Zugriff auf eine globale Variable geschützt? Könntest Du mir vielleicht mal Auszüge Deines > > Programms zeigen? Würd mich mal interessieren, wie die das nun genau gemacht hast? Will ja nun > > auch keine capture/release verstreuen wie das Salz in der Suppe. > > > > Besten Dank im Voraus, > > Frank | ||
Antwort schreiben Antworten: Re: Langzeitstabilität der CC2-Station? (von Frank - 26.02.2004 13:47) |