Hllo liebes Forum, ich stehe mal wieder vor einem Problem und weiß nicht genau wie ich es lösen soll. Also ich habe eine Variable mask in der werden durch interrupts verschiedene Bits gesetzt. Parallel dazu wird zyklisch eine Funktion aufgerufen, die sich jeweils immer das älteste bit raussucht und diese gleichzeitig wieder löschen soll, so dass eine art ring entsteht.. Vielen Dank für eure Hilfe Dominik
Das Problem ist unlösbar. Es gibt keine Möglichkeit, das "Alter" eines Bits an ihm selbst zu erkennen. Diese Möglichkeit musst du erst schaffen. Z.B. durch einen Zeitzähler für jedes Bit.
hast du denn schon irgendwas an Code-Fetzen, oder suchst/sammelst du noch grundstzlich Ideeen zur Verwirklichung?
Wird mask von einer Richtung her mit 1en aufgefüllt, oder ist dieser zugriff willkürlich?
Wie wärs wenn Du einfach einen Pointer auf das älteste Element machst, dann kannst Du auch einfach/direkt darauf zugreifen. Wenn dann neue Werte hinzugefügt werden, dann muss nur der Pointer auf den neuen "ältesten" Wert umgestellt werden (wahrscheinlich in Deinen ISRs).
Ja das habe ich wohl vergessen, maks wird von 0...14 gezählt und fängt dann wieder von vorne an. Sorry
Dominik schrieb: > maks wird von 0...14 gezählt also doch gezählt? Wie kommen da jetzt die EInzelbits ins Spiel? Erzähl doch mal dein Problem von einer globalen Warte aus gesehen, ehe wir uns da jetzt Gedanken für eine Lösungsmöglichkeit machen, die dein eigentliches Problem gar nicht löst.
Okay... Na dann fang ich mal an... Also ich habe 14 MOB´s (Message Objects) diese werden in eine ISR der reihe nach vollgeschrieben. Gleichzeitig habe ich eine 16 Bit Variable (mask) in der die beschriebenen mobs markiert werden. Zyklisch wird eine Funktion aufgerufen die die Mobs der reihe nach leeren soll und die mask wieder auf null setzt, wenn der mob leer ist. Pro Funktionsaufruf soll immer ein mob gelesen und geleert werden Ich hoffe jetzt ist es ein bisschen verständlicher erklärt. Gruß Dominik
Die MOBs werden nicht der Reihe nach gefüllt, sondern immer das unterste gerade freie. Um nun wieder die Reihenfolge zu erkennen, mußt Du den Timestamp vergleichen. Peter
Ja das ist richtig, also muss ich doch wenn ich beim höchsten mob angekommen bin wieder bei eins anfangen, wie kann ich das denn am geschicktesten realisieren? Gruß Dominik
Für mich hört sich das irgendwie nach einem ordinären Ringpuffer an...
Hallo Dominik, wenn ich dein Problem richtig verstanden habe, wäre dafür ein Ringbuffer sicher keine schlechte Idee. Suche mal danach, ist eigentlich ziemlich einfach zu implementieren. Du mußt ihn nur an deine MOB's anpassen. Gruß, Steffen
Habe meinen Ansatz so überlegt, jedesmal wenn ich in die ISR gehe wird ein Zähler hochgezählt. Ein zweiter Zähler wird hochgezählt wenn ich mir den mob hole, der zweite Zähler sollte immer eins kleiner sein als der ISR Zähler. Hole ich mir einen MOB, so wird dieser in der Maske wieder gelöscht.. Nunja und dann komm ich irgendwie nicht weiter..
ja werde mal danach schauen, das ist doch eine art fifo oder ?? Gruß Dominik
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.