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
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.
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.
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
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
@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).
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.