www.mikrocontroller.net

Forum: Compiler & IDEs Programmcode um FiFo auszulesen


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel (Gast)
Datum:

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

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char index_in, index_out;

unsigned char fifo[256];


int put_fifo( unsigned char in)
{
  if( ((index_in + 1) & 0xFF) == index_out )
    return -1;                                  // FIFO full

  fifo[index_in++ & 0xFF] = in;
  return 0;
}


int get_fifo( void )
{
  if( index_in == index_out )
    return -1;                                  // FIFO empty

  return fifo[index_out++ & 0xFF];
}


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.