Forum: Compiler & IDEs Dynamische Größe von Fifo Rinpuffer


von Ulrich (Gast)


Lesenswert?

Hallo,
ich habe mehrere Fifos(ca. 4) welche zusammen ca. 256bytes verbrachen
dürfen. Jeder einzelne soll aber maximal auf 128bytes zugreifen sollen.
Gibts da irgendwelchen Input? Falls es nix gibt, würde ich es so
implementieren (jemand interesse da mitzuhelfen?), das man es einfach
überal reinbauen kann....

PS: Jeder der jetzt postet "ich soll suchen", dem bin ich dankbar. Da
ich absolut nix gefunden habe und mich freue wenn jemand Links kennt
(und hier postet) die ich nicht kenne.

Mfg
Ulrich

von Ulrich (Gast)


Lesenswert?

Bin ich eigentlich der einzigste der sowas benötigen würde?
Je nach rückmeldung implementiere ich es schöner

von peter dannegger (Gast)


Lesenswert?

Wozu soll so etwas gut sein ?

Eine MC Anwendung soll doch immer funktionieren, d.h. auch im worst
case. Entweder alle Maximalwerte ergeben 256 (z.B. 4 * 64) oder das
ganze ist witzlos. Ich möchte jedenfalls nicht meine MC-Anwendungen
ständig neu booten müssen.

Deshalb lege ich für jede Schnittstelle maximale Paketlängen fest,
deren Überschreitung durch ein entsprechendes Protokoll verhindert wird
(z.B. überlange Pakete werden verworfen). Dabei ist es völlig
unerheblich, wenn im worst case alle gleichzeitig auftreten.


Peter

P.S.:
Auch würde der zusätzliche Verwaltungsaufwand die mögliche Einsparung
bei weitem übertreffen oder das ganze wird arschlahm durch die ständige
Umsortiererei. In jedem Fall wird es ein Codemonster welches nicht worst
case sicher ist.

von Hagen (Gast)


Lesenswert?

Peter hat absolut Recht, ich sehe auch keinerlei praktischen Nutzen
solcher pseudo-dynamischer FIFOs.

Einzigste Ausnahme sind dynamisch erzeugte FIFO Buffer zb. per Malloc()
oder so. Diese sind zb. notwendig als Buffer bei einem Dateizugriff um
die Prozessorlast besser zu gewichten. Nun hat man ja nicht zu jedem
Zeitpunkt gleich alle Dateien geöffnet und ein solcher FIFO macht ja
nur Sinn bei einer geöffneten Datei. Also wird der FIFO direkt mit dem
Dateihandle verknüpft und existiert nur dynamisch solange eine
spezifische Datei geöffnet ist. Das ist jetzt nur ein Beispiel für
einen solchen Buffer, da ja bei Dateizugriffen ein FIFO eher unüblich
ist.

Aber ansonsten sehe ich für einen statischen aber in der Größe
dynamischen FIFO keinerlei Nutzen.

Gruß Hagen

von Hagen (Gast)


Lesenswert?

Ok, es gäbe da eine sinnvolle Anwendung solcher FIFOs. Angenommen man
hat über eine Schnittstelle vrschiedene Protokolle laufen die auch noch
unterschiedliche Datenraten benötigen. Dann könnte ich mir vorstellen
das ein solcher pseudo-dynmischer FIFO Sinn machen könnte.
Ich würde dann aber die FIFOs denoch statisch programmieren und sie
dann so groß machen das das Worstcase Protokoll ohne Probleme läuft.
Denn im Worstcase benötigst du dann sowieso einen großen FIFO und
dieser benötigt entsprechende Resourcen. Dh. mit der geplanten Auswahl
des protokolles steht von Anfang an auch der Worstcase fest und somit
der FIFO und der Resourcenverbrauch. Also auch in diesem Falle würde es
zwar Sinn machen aber nicht wirklich pratischen Nutzen haben.

Gruß Hagen

von Ulrich (Gast)


Lesenswert?

@Hagen,
genau für sowas wollte ich es anwenden. Ich will per USB (super
schnell) auf verschiedene I2C Devices zugreifen.
Über USB kommen viele Daten gepulst an, welche in einem Fifo
gespeichert werden müssen. Sobald die USB-Übertragung ausgewertet ist
müssen die Daten per I2C übertragen werden und die Rückmeldungen müssen
in einen 2. FiFo rein und dann per USB wieder zurück.
Keines der Fifos ist gleichzeitig voll, aber immer abwechselnd.
Ist es da wirklich nicht sinnvoll den Speicherbedarf dynamisch zu
machen?
Natürlich gäbe es eine Maximalgrenze und wenn die erreicht wird werden
keine Daten mehr angenommen...

Aktuell habe ich folgendes Fifo fast 1:1 implementiert:
http://www.roboternetz.de/wissen/index.php/FIFO_mit_avr-gcc
Das benötigt 7 Bytes + Fifogröße.

Wenn ich das mal mit nur 2 Puffern rechne(der einfachheit wegen..)
komme ich bei 128Byte Peak pro Fifo auf 270bytes Insgesammt.

Bei meiner angedachten Lösung brauche ich 8 bytes + fifogröße * 1,125
pro Fifo.
Das macht dann bereits bei 160Bytes (Ein Fifo 128Byte das andere
32Byte) Ein Platzbedarf von nur noch 196Byte.

Ich denke ich buddel den Thread hier wieder raus wenn ich eine fertige
Lösung habe......sonst muss ich mir noch per pessimismus anhören....

von Ulrich (Gast)


Lesenswert?

Ich habe nun mein Dynamisches Fifo fertig.
Es benötigt 500byte mehr Speicher im Flash.
Damit kann man z.B.:
4Fifos mit unterschiedlichen Mindeskapazitäten anlegen.


Kann sich jemand vorstellen das er sowas braucht?
Wenn ja dann würde ich es eventuell "schöner fertig" machen.

von Egon (Gast)


Lesenswert?

Ich kann mir leider nicht vorstellen, dass jemand anderes so etwas auch
braucht. Lies weiter oben, dann siehst Du, dass die Leute lieber
statisch denken und eher nach mehr Speicher schreien, als ihn
effektiver auszunutzen.
Allein wenn Du FIFO-Programme ansiehst, wirst Du festellen, dass immer
2er Potenzen als Größe verwendet werden, weil die Programmierer
maschinengerecht programmieren und nicht bedarfsorientiert. Anstatt 80
Byte werden dann 128 Byte für einen Puffer programmiert.

Meine Meinung.

von Hagen (Gast)


Lesenswert?

Ein wichtiges Merkmal stabiler Softwareentwicklung ist Simplizität,
sprich Einfachheit. Das ist stabil, einfacher zu verstehen und ganz
wichtig es verbraucht die wenigste Arbeitszeit. Peter und ich sind
Profi Entwickler, Peter in Hardware und Software und ich nur in
Softwareentwicklung. Daher spielen diese Faktoren die größte Rolle,
besonders die Arbeitszeit da das eben Profit bedeutet.

>>Lies weiter oben, dann siehst Du, dass die Leute lieber
>>statisch denken und eher nach mehr Speicher schreien, als ihn
>>effektiver auszunutzen.

Nun das ist zu einfach gesehen. Denn 500 Bytes FLASH zusätzlich für par
FIFOs ist eine Menge mehr an Resourcen, an Speicherresourcen. Sogesehen
ist eben ein statischer FIFO nicht nur Speicher-optimaler sondern auch
einfacher und effizienter. Ein Programmierer der in diesem Falle
"statisch" denkt macht nichts falsches.

>>@Hagen,
>>genau für sowas wollte ich es anwenden. Ich will per USB (super
>>schnell) auf verschiedene I2C Devices zugreifen.

So wie du dein problem umschrieben hast ist dies kein Fall für einen
dynasmichen FIFO. In meinem obigen Posting habe ich versucht quasi eine
Grenze aufzuzeichnen und die dafür notwendigen Bedingung zu definieren.
Hauptmermal sind

- die FIFOs existierten nicht permanent, werden also zb. er bei Öffnen
einer Datei benötigt.
- die FIFOs sind "shared", dh. sie werden in EINEM Hardwarekanal
durch unterschiedliche Software-treiber benutzt.

Keine dieser Bedingungen ist durch deine Problemstellung abgedeckt. Das
heist bei dir existiert die USB-I2C-USB Verbindung permanent, die Größe
der FIFOs richtet sich vorausberechenbar nach der
Geschwindigkeitsdiffernez zwischen USB und I2C und dem festen
Datenprotokoll was darauf läuft.

Es ist durchaus üblich für beide Datenrichtungen auch zwei feste FIFOs
zu benutzen.

Gruß Hagen

von Egon (Gast)


Lesenswert?

""Peter und ich sind Profi Entwickler, ...

Was muß ich machen, um das auch zu werden ?

""Denn 500 Bytes FLASH zusätzlich für par FIFOs ist eine Menge mehr
an Resourcen,...

Das ist doch Quatsch !

Fazit: Was Ulrich gemacht hat finde ich prima !!!

von Tastendrücker (Gast)


Lesenswert?

>> ""Peter und ich sind Profi Entwickler, ...

> Was muß ich machen, um das auch zu werden ?

Davon leben könnnen...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

>> Denn 500 Bytes FLASH zusätzlich für par FIFOs ist eine Menge
>> mehr an Resourcen,...

> Das ist doch Quatsch!

It depends.  Flash-ROM ist sehr viel billiger als RAM (das ist der
Grund, warum selbst die größten AVRs nur 8 KB RAM haben).
Insofern kann es auf einem ATmega16 durchaus 500 Bytes ROM Wert sein,
wenn man damit 250 Bytes RAM einsparen kann.  Hängt halt immer
davon ab, an welcher Ecke man gerade Resourcenengpässe hat.

von Egon (Gast)


Lesenswert?

@Tastendrücker, es gibt so viele Täuscher, die auch alle Leben :-) look
at me.

@Jörg, danke. Meist ist doch RAM zu knapp; und wer hat denn schon
einmal wirklich den kompletten FLASH-Speicher mit Programmcode
ausgereizt, dass nichts mehr ging ? RAM könnte man nie genug haben.

Manchmal habe ich den Eindruck, bloss alles so zu machen wie vor 30
Jahren, das kann nicht verkehrt sein. Man findet immer Gründe, warum
etwas nicht gehen soll (beste Ausrede: braucht man nicht); mal was
Neues zu machen finde ich viel interessanter.

von peter dannegger (Gast)


Lesenswert?

@Ulrich,

zeig doch einfach mal den Code.

Funktioniert er auch, wenn einige FIFOs in Interrupts benutzt werden ?

Die 500 Byte Flash müssen nicht unbedingt stören, Hauptsache die
CPU-Last steigt nicht zu sehr.

Wieviel RAM wird denn zusätzlich für die Verwaltung benötigt ?


Bei Paketübertragung benutze ich lieber einen Linearpuffer, dann kann
man die Pakete direkt im Puffer parsen bzw. erzeugen, da kein Wrap
around möglich. Der Puffer sollte dann aber schon 2 Pakete fassen
können.
Nachdem 1 Paket geparst wurde, werden alle zwischenzeitlich empfangenen
Bytes wieder an den Pufferanfang gestellt.


Peter

von Ulrich (Gast)


Lesenswert?

@all(die die Idee gut finden):
Im Prinzip habt ihr alle Recht....

@Peter/Hagen:
Ich mache dies ja nicht beruflich sondern aus Spaß am Hobby. Wenn man
es aus der beruflichen Perspektive betrachtet macht es möglicherweise
schon Sinn bei altbewährten Sachen zu bleiben. Man geht keinerlei
Risiken ein. Lieber einen größeren Controller als mehrere Stunden
Arbeit. (Arbeitszeit ist in Deutschland das teuerste habe ich mir sagen
lassen)
Aber es hat mich schon erschrekt wie negativ ihr über etwas neues
gleich denkt. Ich hätte von Peter exact das Gegenteil erwartet.
Neue Ideen Inovationen usw...


@Hagen:
Nochmal zum Vorteil den ich in der dynamisierung sehe....:
Ich habe USB. Ich kann damit 254bytes pro ms an meinen Mikrocontroller
senden oder empfangen....Diese Daten müssen zwischengespeichert werden
können. Also benötige ich statisch gesehen 256Byte für das
Empfangs-Fifo. Diese Daten müssen nun an verschiedene I2C-Devices über
einen 100Khz gesendet und von dort auch wieder Daten empfangen werden.
Diese Daten müssen nun gespeichert werden bis sie wieder per usb
abgeholt werden....nochmal 256Byte für den Sende-Fifo. Macht allein für
diese 2 Fifos 512bytes an Speicher. Diese Fifos sind immer abwechselnd
gefüllt. Wo denkst du mache ich mit meiner Lösung was falsch? Wenn du
das so ließt, dann kannst du doch nicht bei folgender Aussage
bleiben?:
>> So wie du dein problem umschrieben hast
>> ist dies kein Fall für einen dynasmichen FIFO.

@Peter:
Der Code Funktioniert nicht wenn die Zugriffe von verschiedenen
Interrupt Ebenen erfolgt.
Der einzigste Interrupt ist der int0 alle anderen Interrups werden in
der main() gepollt.

Aktuell benötigt jedes Fifo 9Bytes für die Verwaltung.
Dann gibts halt ein Rießen-array in dem Speicherblöcke angelegt sind.
Jeder Speicherblock hat 1Byte an Verwaltungsoverhead. Das heißt das ich
für 512Bytes Netto in 16Blöcken 528Bytes Brutto benötige.

Ich kann die Daten nicht direkt auswerten. Das sieht die
usb-Implementation so nicht vor.

Veröffentlichen wollte ich den Code eigentlich erst, mit dem Rest von
dem Projekt.
Bei mir läuft der Code ganz gut und er wird gerade von einem Bekannten
der sich auch mit AVRs auskennt in den nächsten Tagen getestet.

Eins verspreche ich dir, ich poste den Code sicherlich nicht hier,
solange noch die Möglichkeit besteht dass da ein grober Fehler drin
ist.
Sonst werden die Codeschnipsel noch in der Luft zerissen bevor es ein
Blatt auf den Boden der Tatsachen geschafft hat.

Wenn der Code die Schönheitsanforderungen entspricht und ich sicher bin
das er passt veröffentlich ich ihn schon...


Mfg
Ulrich

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Wenn man es aus der beruflichen Perspektive betrachtet macht es
> möglicherweise schon Sinn bei altbewährten Sachen zu bleiben. Man
> geht keinerlei Risiken ein. Lieber einen größeren Controller als
> mehrere Stunden Arbeit.

Naja, "it depends".  Wenn man für drei oder 10 Stück eines
Miniprojekts nachdenkt, wird das Projekt auf Grund der zu
investierenden Arbeitszeit vermutlich schon so teuer genug, dass man
(falls nicht andere Gründe wie Strom- oder Flächenverbrauch dagegen
sprechen) gleich den größten verfügbaren Controller benutzen kann.
Für die Entwicklungsarbeit braucht man sowieso große Controller (Platz
für Debug-Informationen, weniger Stress, gleich alles irgendwie in den
progmem zu schieben, JTAG).  Der Preis des Controllers oder Boards
spielt keine Geige, zumindest nicht beim 8-Bit-AVR.  Da man für
ungenutzte Resourcen auch kaum Rabatt bei Atmel bekommen wird, braucht
man auch nicht mehr optimieren, wenn man das Ziel (mit der notwendigen
Reserve für spätere Bugfixes) erreicht hat.

Wenn man dagegen für mehrere tausend Stück aufwärst denkt, ändert sich
das.  Wenn man für mehrere hunderttausend Stück aufwärts denken soll,
ändert sich das drastisch, und man wird mit jedem Cent geizen wollen.

Für Bastler sind die Perspektiven sehr verschieden.  Solange man
Schüler oder Student ist, hat man oft viel Zeit und wenig Geld.  Dann
kommen Dinge wie Igor PlugUSB raus: guter Nutzen (unter Beachtung der
Randbedingungen) für wenig Geld.  Ziemlich viel Zeit in die
Entwicklung investiert.  Muss man das Hobby später neben Job und
Familie mit 1...3 Stunden am Abend betreiben, ändert sich die
Perspektive schnell.  Auf EUR 10 für einen größeren Controller
kommt's
dann nicht mehr an, und selbst die kostspielige Anschaffung eines JTAG
ICE Originals könnte sich schon irgendwie lohnen, wenn man damit in
der gleichen Zeit effektiver wird.

von Egon (Gast)


Lesenswert?

"Sonst werden die Codeschnipsel noch in der Luft zerissen bevor es ein
Blatt auf den Boden der Tatsachen geschafft hat."

Sehr, sehr klug !

von peter dannegger (Gast)


Lesenswert?

@Ulrich

"Sonst werden die Codeschnipsel noch in der Luft zerissen bevor es
ein
Blatt auf den Boden der Tatsachen geschafft hat."


Man könnte es aber auch als Gelegenheit sehen, die Fehler schneller zu
finden.

Nur zerreißen wird hier keiner was, sondern er wird auch begründen, was
seiner Meinung nach daran faul ist.


"Aktuell benötigt jedes Fifo 9Bytes für die Verwaltung."

Das ist schon recht heftig.
Bei FIFOs bis 256 Byte habe ich 2 Bytes Verwaltung, den eingehenden und
den ausgehenden Index und eventuell noch ein Bit für Überlauf. Wobei der
FIFO immer ein Leerbyte enthält (die Indexe dürfen sich ja nicht
einholen).


Wenn ich Dich richtig verstehe, heißt dynamisch nicht eine variable
Anzahl von Bytes, sondern nur Vielfache von 32 Byte.


Peter


P.S.:
Die Postings von Hagen bitte nur ihm zuordnen, ich habe mit ihm nichts
abgesprochen.

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.