Forum: Compiler & IDEs Programmcode um FiFo auszulesen


von Daniel (Gast)


Lesenswert?

Moin ! Für einen FiFo den ich auslesen möchte suche ich einen 
Programmcode bzw. eine Idee wie ich soetwas am besten realisieren kann.

Ich hab einen Puffer von 256 Bytes. Nun, irgendwie muss ich ja 
sinnvollerweise an die Daten kommen, die zum Beispiel in der Mitte des 
Fifo stehen bzw. ich brauche einen "Hilfezeiger" der mir sagt, dass 
diese Stelle schon gelesen worden ist.

Es wäre nett, wenn mir jemand eine Idee oder nen groben Plan geben 
könnte, wie ich das am besten programmieren kann!


Mfg Daniel

von Matthias (Gast)


Lesenswert?

Wo ist denn der FIFO?? ist das ein externes IC?
Ist der FIFO in Software realisiert?

Wie sollen wir dir hier helfen, wenn wir nix wissen worum es geht?

Glaubst du etwa, dass wir hier alle eine Glaskugel haben?

von Karl H. (kbuchegg)


Lesenswert?

Daniel wrote:
> Moin ! Für einen FiFo den ich auslesen möchte suche ich einen
> Programmcode bzw. eine Idee wie ich soetwas am besten realisieren kann.
>
> Ich hab einen Puffer von 256 Bytes. Nun, irgendwie muss ich ja
> sinnvollerweise an die Daten kommen, die zum Beispiel in der Mitte des
> Fifo stehen

Nein. Musst Du nicht. Der Sinn einer FiFo ist es, dass ich genau
das nicht kann, bzw. mich nicht darum kümmern muss.
Auf der einen Seite werden die Daten reingesteckt, auf der anderen
Seite werden die Daten in der Reihenfolge ihres Eintreffens wieder
ausgelesen. Mittendrinn wird nicht zugegriffen.

> bzw. ich brauche einen "Hilfezeiger" der mir sagt, dass
> diese Stelle schon gelesen worden ist.

Was du meinst ist wahrscheinlich: ein Ringbuffer der eine
FiFo relaisiert.  "Ringbuffer" ist dein Stichwort bei google.

von Daniel (Gast)


Lesenswert?

Korrekt ich suchen einen Programmcode, wie ich einen 256kByte Ringpuffer 
verarbeiten kann bzw. wie ich die richtige Stelle für das lesen und 
schreiben bekomme!?

Meine Suche bei Google war leider n. sehr ertragreich!

Hat jemand was für mich!?

von Matthias (Gast)


Lesenswert?

..suchen einen Programmcode..i Google war leider n. sehr ertragreich

Natürlich nicht. In der Zeit wo du googlest, hättest du auch 
selbstgeschrieben..

von Karl H. (kbuchegg)


Lesenswert?

Daniel wrote:
>
> Meine Suche bei Google war leider n. sehr ertragreich!

Ehrlich?
Ringbuffer gibts wie Sand am Meer.

>
> Hat jemand was für mich!?

Ist doch eigentlich ziemlich trivial.
Und ja: Du brauchst eine Markierung wo das nächste
Element in den Ringbuffer einzufügen ist. Und ja,
du brauchst eine Markierung von wo das letzte mal
aus dem Ringbuffer gelesen wurde.
Der Rest ist: je nach Operation den richtigen Index
um 1 erhöhen und darauf achten, dass der Index auch
wirklich im Kreis rum geht.

Eine weitere Hilfsvariable die angibt wieviele Elemente
im Ringbuffer momentan enthalten sind, ist oft ganz
nützlich um einen möglichen Sonderfall zu knacken
und unterscheiden zu können ob der Ringbuffer jetzt
voll oder ob er leer ist. Hängt aber von der konkreten
Implementierung der Lese/Schreibmarken ab, ob das notwendig
ist.


-> Nimm dir einen Zettel, mal dir einen Ringbuffer mit
8 Elementen auf und geh einfach mal mit Papier und Bleistift
die Einfüge und Ausleseoperation durch, so wie du sie dir
vorstellst. Dann achtest du auf Fehler und verfeinerst dein
mentales Modell. Und dann ... wenn du genau weist was in
welcher Reihenfolge zu geschehen hast und welche Variablen
du benötigst ... dann setzt dich zu deinem Computer und schreib
das entsprechende Programm dazu.
Diesen Vorgang nennt man allgemein: Software Entwicklung.

von Daniel (Gast)


Lesenswert?

OK - jetzt hole mir nen Zettel und nen Stift und werde mal meine 
Software selber entwickeln..

Sonst lernt man das "programmieren wohl nie" ???

von Peter D. (peda)


Lesenswert?

1
unsigned char index_in, index_out;
2
3
unsigned char fifo[256];
4
5
6
int put_fifo( unsigned char in)
7
{
8
  if( ((index_in + 1) & 0xFF) == index_out )
9
    return -1;                                  // FIFO full
10
11
  fifo[index_in++ & 0xFF] = in;
12
  return 0;
13
}
14
15
16
int get_fifo( void )
17
{
18
  if( index_in == index_out )
19
    return -1;                                  // FIFO empty
20
21
  return fifo[index_out++ & 0xFF];
22
}


Peter

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.