Forum: Compiler & IDEs Verständnisproblem Ringpuffer


von Rahul (Gast)


Lesenswert?

Hallo, und frohes neues Jahr!

In verschiedenen Threads wurde der Begriff "Ringpuffer" verwendet.
Ich nehme dabei an, dass es sich um ein Feld mit bspweise 256 möglichen
Einträgen handelt.
Nun gibt es eine Lese- und eine Schreibmarke. Die Schreibmarke wird
dazu benutzt, die Stelle zu markieren, ab der neue Daten in den Puffer
geschrieben werden können.
Die Lesemarke würde dementsprechend die aktuelle Stelle markieren, ab
der unverarbeitete Daten im Puffer stehen.

Gehe ich recht in der Annahme, dass eine entsprechende Prozedur wie
folgt aussehen würde:

unsigned char Lesemarke, Schreibmarke;
unsigned char Daten[256];

while (Lesemarke != Schreibmarke)
{
  // verarbeitet die Daten ab Lesemarke Daten[Lesemarke]

  Lesemarke ++;
}

Reicht das so, oder muß bei einem Überlauf noch mehr beachtet werden?
Ich frage deswegen, weil ich schon mal versucht habe, soetwas zu
realisieren. Das Problem dabei war dann noch, dass immer genau 4 Byte
über eine RS485-Schnittstelle empfangen werden sollten. Mit der obigen
Methode würde das wohl nicht einfach so gehen (Lesemarke+4 <=
Schreibmarke ==> neue Daten komplett empfangen).

Vielen Dank im Vorraus.
Gruß
Rahul

von Jörg Wunsch (Gast)


Lesenswert?

Das Prinzip stimmt.  Meist nimmt man allerdings Zeiger (statt
Feldindizes) zur Adressierung, außerdem hast Du vergessen, den
Ringüberlauf zu erfassen: wenn Du am Feldende mit dem Index angekommen
bist, musst Du ihn wieder auf 0 setzen.

Da Ringpuffer oft benutzt werden, um Daten (z. B. von externen
Schnittstellen) in Interruptroutinen einzusammeln und sie im normalen
Programm zu verarbeiten, musst Du außerdem noch bei Bedarf an das
vorübergehende Blockieren der Interrupts denken.

von Rufus T. Firefly (Gast)


Lesenswert?

Der Überlauf wurde nicht vergessen, da Lesemarke vom Typ unsigned char
ist und der Fifo genau 256 Bytes groß ist.

Bei anderen Fifo-Größen ist da entsprechend mehr Aufwand zu betreiben.

von Peter Mahler (Gast)


Lesenswert?

Hi,

Das ganze funktioniert auch nur dann, wenn man impliziert, dass ein
'unsigned char' 8 Bit lang ist. Gefährlich !!! Die Länge eines char
ist in Ansi-C nicht definiert. Neuere Compiler, z.B. VC++.NET
verwenden per default 16-Bit-char. Deshalb lieber gleich den
Mehraufwand treiben, als nacher auf die Nase zu fallen.

Gruss,

Peter

von Rahul (Gast)


Lesenswert?

Morgen!
Danke für die Antworten.
@Peter:
Ich gehe vom avr-gcc aus...

Apropos VC++:
Gibt es eine Entwicklungsumgebung (Compiler + Libraries) so in der Art
des WinAVR für "bunte" Windows-Programme?
Bisher habe ich nur Compiler gefunden, die auf DOS-Ebene arbeiten, also
nur "unbunte" Textmeldungen entgegen nehmen und zurückliefern.
Selbst im VC++-Kompendium von Victor Toth wird nur auf dieser Basis
gearbeitet.
Kennt da jemand eine gute Seite für den Einstieg?
Linux-Programmierung würde mich auch interessieren, habe auch schon mit
Koppix "rumgespielt", und will mir demnächst auch einen Rechner mit
Linux hinstellen.

Viele Grüsse
Rahul

von Rufus T. Firefly (Gast)


Lesenswert?

@Rahul:
Äh, die Frage meinst Du jetzt aber nicht ganz ernst, oder? Jeder
32-Bit-C-Compiler, der Windows-Binaries erzeugen kann, kann dazu
verwendet werden, Windows-Programme in "bunt" (ich vermute, daß Du
damit Programme mit Windows-Oberfläche meinst) zu erzeugen. Niemand
zwingt Dich dazu, Konsolapplikationen (== "unbunte Texmeldungen) zu
schreiben, nur ist sowas wesentlich einfacher.

MS VC++ ist, genauso wie Borland C++ Builder ein kommerzielles Produkt
mit komfortabler IDE, aber es gibt auch freie Alternativen, die in
irgendeinem Subforum hier unter dem Titel "Frei-C++ IDE" auch
ausführlichst diskutiert wurden.

Peter hat zwar recht, aber der Fall ist, sagen wir mal, unüblich.
VC++.Net (Visual Studio 2003) ist IMHO, wenn .Net-Geraffel genutzt
wird, auch kein C++-Compiler mehr; "managed C++", also "C++ mit
Garbage Collection" ist kein C++. Yuck!

Im Embedded-Bereich bleibt einem dieser Krampf gottlob noch 'ne ganze
Weile lang erspart.

Korrekter ist es natürlich, einen Datentyp eindeutiger definierter
Größe zu verwenden (uint_8).

von Rahul (Gast)


Lesenswert?

Kann es sein, dass ich da irgendwas falsch verstanden habe?
Ich würde gerne "bunte" Windows-Programme schreiben.
Bisher dachte ich, dafür bräuchte ich auch die Entwicklungsumgebung
(Visual Studio oder Teile davon) von MS.
Sehe ich es richtig, dass ich gar nicht die X-Euro für die MS-Produkte
ausgeben muß, sondern bspw. die Bloodshed-IDE inklusive Compiler
benutzen kann?

Langsam wird das hier OT...

von Rufus T. Firefly (Gast)


Lesenswert?

Genau so ist es.

  #include <windows.h>

  int main(void)
  {
    MessageBox(NULL, "Ich bin eine Meldung!", "Ich bin eine
Titelzeile", MB_OK);
    return (0);
  }

Das ist ein minimalistisches Windows-Programm. Wenn das (als *.c-Datei
abgespeichert) sich von Deinem Compiler übersetzen lässt, sind die
erforderlichen Headerdateien und Libraries vorhanden.
Eine sehr ausführliche Beschreibung dieser Art von
Windows-Programmierung findet sich im Buch "Programming Windows" von
Charles Petzold. Das ist die Ursuppe der Windows-Programmierung, oft
auch Win-API-Programmierung genannt.

Es ist allerdings empfehlenswert, Windows-Programme in C++ (und nicht
in C) zu schreiben und eine brauchbare GUI-Klassenbibliothek zu
verwenden. Die Compilerhersteller wie Microsoft oder Borland liefern
ihre jeweiligen proprietären Biliotheken (MFC und VCL) mit.
Ich würde Dir allerdings zu wxWidgets raten, das ist eine _portierbare
_ Klassenbibliothek (damit geschriebene Applikationen lassen sich auch
unter Linux oder MacOS X verwenden).
Zu wxWidgets gibt es einen kostengünstigen GUI-Editor namens
DialogBlocks (http://www.anthemion.co.uk/dialogblocks/).

Ursprünglich nur ein GUI-Editor, mutiert das Teil immer mehr zu einer
vollwertigen IDE incl. Projekt/Makefile-Erzeugung für ziemlich viele
verschiedene (auch freie) Compiler.

Das lässt sich sicherlich auch mit dem Blutvergießen kombinieren (IMHO
beknackter Name).

Viel Vergnügen.

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.