Hallo meine lieben, ich suche einfach Möglichkeit eine queue in meinem AVR einzubauen. Wie der Name schon sagt soll das am besten für alles gehen. Egal ob int oder float oder ein struct. Kennt ihr da was gutes ? Mann könnte sie ja selber schreiben ... wäre aber mühselig für jeden Datentyp und Templates gehen in c leider nicht :( MFG Matthias
Zeiger haben doch auch einen Datentyp wie zb int* float* gibt es universal zeiger? ? Wundert mich gerade etwas wie sowas aussehen würde. MFG matthias
Matthias T. schrieb: > und Templates gehen in c leider nicht Was spricht dagegen, einfach den C++-Compiler zu nehmen? Der schluckt auch fast alles an normalen "C", und richtig eingesetzt erzeugen Templates da keinen Overhead gegenüber C. Peter II schrieb: > einfach Zeiger verwenden schon hast du nur einen Datentyp. Halte ich für ungünstig. Matthias T. schrieb: > Egal ob int oder float oder ein struct wenn du dann int* speicherst, hast du > 100% Overhead. Und brauchst zwingend dynamische Speicherverwaltung. Dann lieber einen Satz Macros, um einen Ringbuffer in einem statischen int, float, struct X - Array zu verwalten.
AntiMaker schrieb: > Was spricht dagegen, einfach den C++-Compiler zu nehmen? > Der schluckt auch fast alles an normalen "C", und richtig eingesetzt > erzeugen Templates da keinen Overhead gegenüber C. dann schau dir mal die Programmgrößen von 4 Queue mit unterschiedlichen Datentypen an. Die Programm werden sehr groß, weil für jeden Datentype alle Funktionen erstellt werden. Das ist zwar kein Overhead weil man das gleiche mit C auch machen müsste, aber beim arbeiten mit Zeigern fällt das alles weg. Dafür hat man keine Typsicherheit mehr.
weil das project schon fast fertig ist und nur die queue fehlt. Die Idee der Zeiger gällt mir, warum overhad ? Ich hatte da schon vor hauptsächlich structs reinzusetzen. Ich glaube die rumzukopieren ist auch nicht all zu toll ..... MFG Matze
Matthias T. schrieb: > Die Idee der Zeiger gällt mir, warum overhad ? weil der Ram für den Zeiger hinzukommt.
Hast Recht, Ram ist aber auch da um benutzt zu werden, stellt sich die Frage was ist günstiger, etwas Ram für den Zeiger, oder die Daten in die queue rein und raus zu kopieren. Ich will sie eigentlich auch auf eine Länge von 10-20 Elementen beschränken, also wäre der maximalbedarf sogar berechenbar und gedeckelt MFG Matthias
Man kann sich die Queue doch als Header schreiben und mit typedef den Typ der Variablen zuweisen.
Peter D. schrieb: > Man kann sich die Queue doch als Header schreiben und mit typedef den > Typ der Variablen zuweisen. nein, weil man beim zweiten typedef die gleichen Funktionsnamen hat. Da müsste man schon etwas mehr Makros verwenden. Selbst wenn er C++ mit Templates machen würde, hätte er mehrere Queue's. Die Frage ist ob das überhaut gewollt ist, oder ob alles in eine queue rein soll.
Also es sind fünf Queue's von verschiedenen structs Es soll also alles garnicht in eine, aber ich will für fünf typen einfach nicht fünf Queue's definieren :)
Wäre sowas für den AVR noch händelbar, oder ist das schon zuviel Overhead? https://troydhanson.github.io/uthash/utringbuffer.html (erster Google-Treffer)
Matthias T. schrieb: > ich suche einfach Möglichkeit eine queue in meinem AVR einzubauen. > > Wie der Name schon sagt soll das am besten für alles gehen. > Egal ob int oder float oder ein struct. Klassischer (byteweiser) Ringpuffer (FIFO) mit Zugriffsfunktionen für variable Länge, fertich. Gelesen und geschrieben wird immer Byte-für-Byte. Im Falle Schreiber in main() - Leser im Interrupt muss man allerdings aufpassen, d.h. den Schreibzeiger erst beim abgeschlossenem Schreibvorgang aktualisieren oder im Interrupt den Pufferfüllstand vorm Lesen prüfen.
Wenn es Dir darum geht, dass Queue und Elemente (bzw. deren Zugriff) Typsicher sind, dann must Du entsprechende Typen (bzw Funktionen) definieren. Der Mechanismus kann dann generell sein, für jeden Typ kommen ein paar Zeilen hinzu. Der "Overhead" beschränkt sich auf vielleicht 10 Zeilen pro Typ. Mehr Laufzeit oder Platz muss es (dank Inline) nicht kosten. Zeige einfach Deinen Code mit einem typen, und ich baue es Dir gerne auf 4 Typen um, ohne nennenswerte Kollarteralschäden.
https://www.mikrocontroller.net/articles/FIFO#FIFO_als_Bibliothek Allerdings nicht für mehrere Datentypen geeignet. Es sei denn, man kopiert die Dateien und erzeugt getrennte Funktionen. OVerloading für Arme.
Hmm, man könnte den FIFO oben dahin erweitern, als daß man immer mit Bytes arbeitet und beim Initialisieren die Länge der Daten übergibt. Dann muss man die Pointerarithmetik halt zu Fuß machen. Nicht perfekt, aber brauchbar.
Wenn du es in C machen willst, gibts eigentlich nur den weg über void pointer. Kannst dir als Beispiel ja mal den C qsort anschauen, wie der definiert ist: http://en.cppreference.com/w/c/algorithm/qsort Du musst halt auf alle Fälle auch immer die size eines einzelnen Elements mitübergeben und damit arbeiten. Geht halt nicht anders in C... Ist aber nicht schlimm, es gibt genug Programme in denen das gemacht wird, muss man halt nur sauber programmieren und testen.
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.