Semaphore "global"?

Hallo Leute,

hängen wieder mal bei so einer Fragestellung…

Ist es möglich innerhalb des Modules das Semaphore „global“ zu nutzen? Mir scheint es so, als ob der gesetzte Name nur für die Funktion gilt, oder liege ich da falsch?

Es wäre jetzt zu kompliziert zu erklären, aber eigentlich bräuchte ich das „bestimmte“ Semaphore für das ganze Modul…

Joachim

Das gilt doch eigentlich für den Namen, den du vergibst. Oder ist das Verhalten im Modul anders?

…wie gesagt, mir erscheint es so, als ob es nur innerhalb der Funktion gilt und eben nicht übergreifend modulweit. Kann aber eben auch sein, das ich da einen Denkfehler habe und ich woanders noch einen Fehler habe…

Joachim

Wäre dann hilfreich deinen Code zu sehen.
Aber warum brauchst du es Modulweit ?
Michael

Hallo Michael,

sind ja inzwischen über 2000 Zeilen Code…

Im Prinzip geht es darum:
Es soll eine eigenständige 1-Wire-Funktionalität geschaffen werden. Herzstück ist der DS2482. Ich habe die notwendigen Code von der Dallas/Maxim-Website auf PHP portiert, dieser benutzt jedoch globale Variablen, die ich mit Set/Get-Buffer abgebildet habe. Das funktioniert soweit sehr gut. Es muss aber sichergestellt werden, dass jede Anfrage komplett abgearbeitet wird, damit das Ergebnis korrekt ist.
Nun nutzt man z.B. die DeviceSearch Routine, aber parallel wird ein DS1820 abgefragt - jedes für sich funktioniert, nur wenn sich die beiden „ins Gehege“ kommen, kann das nach hinten losgehen. Die Wahrscheinlichkeit das da Prozesse parallel laufen steigt mit der Anzahl der Sensoren.

Deswegen hatte ich in allen Funktionen, die auf das „Gewirr“ von 1-Wire-Funktionen zugreifen ein Semaphore immer mit dem gleichen Namen eingerichtet, ich vermute aber dieses wirkt nur für die jeweilige Funktion…

Eigentlich sollte es doch aber definiert sein, welche Gültigkeit Semaphore hat?

Joachim

Nein die sind immer global.
Das gewusel kann doch der Splitter abbilden.
Ist aber die Frage wie du es genau umsetzt, fragt jedes Device einzeln ab und der Splitter Sync das ganze.
Oder sucht der Splitter einmalig und fragt dann permanent alle Sensoren nacheinander ab und schiebt es zu den Devices.
Gibt ja viele Wege nach Rom :wink:
Ich nutzte bei meinem aktuellen Projekt den letzten Weg.
Wobei ich nicht bei jeden Sensor einzeln die Messung starte und dann bis zur Abfrage warte, sondern die Messung für alle gleichzeitig starten lasse und dann nacheinander jeden Auslese.

Michael

…ja, gibt mindestens diese zwei Wege.
Ich habe mich entschlossen, explizit den Sensor abzufragen der „dran“ ist. In den jeweiligen DSxxxx-Instanzen wird der Zeitintervall eingestellt etc., diese schiebt dann die Anfrage an den Splitter der alles erledigt und dann nur das oder die Ergebnisse zurückspielt.

Setze ich alle DSxxx-Instanzen auf deaktiviert, wird der DeviceSearch korrekt durchgeführt, wenn ich Instanzen aktiviere, dann wird meistens nur ein Teil gefunden. Interessanterweise wird vor jeder Abfrage ein Verify durchgeführt, ob der Sensor vorhanden ist, was auch die DeviceSearch-Routine nutzt, dass funktioniert wiederum einwandfrei…

Muss ich wohl noch mal weiter beobachten…

Joachim