Forum: Mikrocontroller und Digitale Elektronik Hilfe suche Softwarelösung in c


von Dominik (Gast)


Lesenswert?

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

von Detlev T. (detlevt)


Lesenswert?

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.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

hast du denn schon irgendwas an Code-Fetzen, oder suchst/sammelst du 
noch grundstzlich Ideeen zur Verwirklichung?

von ich (Gast)


Lesenswert?

Wird mask von einer Richtung her mit 1en aufgefüllt, oder ist dieser 
zugriff willkürlich?

von Lötauge (Gast)


Lesenswert?

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).

von Dominik (Gast)


Lesenswert?

Ja das habe ich wohl vergessen, maks wird von 0...14 gezählt und fängt 
dann wieder von vorne an.


Sorry

von Karl H. (kbuchegg)


Lesenswert?

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.

von Dominik (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Dominik (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Für mich hört sich das irgendwie nach einem ordinären Ringpuffer an...

von Ste N. (steno)


Lesenswert?

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

von Dominik (Gast)


Lesenswert?

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..

von Dominik (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.