Forum: Mikrocontroller und Digitale Elektronik queue mit c für alle datentypen


von Matthias T. (matthias_199)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

einfach Zeiger verwenden schon hast du nur einen Datentyp.

von Matthias T. (matthias_199)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

Matthias T. schrieb:
> gibt es universal zeiger?
1
void*

von AntiMaker (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Matthias T. (matthias_199)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

Matthias T. schrieb:
> Die Idee der Zeiger gällt mir, warum overhad ?

weil der Ram für den Zeiger hinzukommt.

von Matthias T. (matthias_199)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Man kann sich die Queue doch als Header schreiben und mit typedef den 
Typ der Variablen zuweisen.

von Peter II (Gast)


Lesenswert?

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.

von Matthias T. (matthias_199)


Lesenswert?

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 :)

von AntiMaker (Gast)


Lesenswert?

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)

von Jim M. (turboj)


Lesenswert?

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.

von A. S. (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

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.

von ui (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.