Forum: Mikrocontroller und Digitale Elektronik Geschwindigkeitsfrage AVR auf SD


von Rico S. (donricone)


Lesenswert?

Hallo Zusammen,

Ich arbeite im Moment an einem Datenlogger und habe noch einige Fragen 
zum optimalen Programmieren in C.

Der Dattenlogger ist bereits ferig und schreibt auch schön Daten auf die 
SD.
Allerdings nur testweise einzelne Datensätze. Das ganze soll jetzt 
schneller besser usw. werden.

1. Optimale Speicherform

Größtenteils sollen 8bit Datensätze aus dem ADC gespeichert werden, und 
2 Drehzahlsignale die über Interrupts aufgenommen werden.

Ich benutze die Lib von Elm Chan, und da ich später am PC zum auslesen 
eine .txt Datei brauchte, dachte ich mir die 8bit Daten in ASCII zu 
formatieren und als String in die .txt zu schreiben.

Gibt es eine Funktion die integer in das zugehörige ASCII Zeichen 
wandelt? Idealerweise schneller wie wenn ich den Integer in einen String 
wandle und diesen auf die SD schreibe.
Mit wie vielen Taktzyklen ist grob zu rechnen? ( Für Wandeln von Integer 
in ASCII Char bzw. Strings.
ibt es allgemein irgendwo Übersichten Erfahrungswerte wie viele Zyklen 
welche Funktion braucht?

Wenn ich mir die Benchmarks von Elm Chan ansehe, und ich sie richtig 
verstehe, wäre es am besten möglichst lange Strings zu schreiben, 
anstatt immer nur einzelne Datensätze hinzuzufügen?

2. Menü?! Einstellmöglichkeiten

Im Moment habe ich 2 Variablen anhand denen die Daten die auf dem 
Display angezeigt werden sollen,ausgewählt werden. Diesen werden von 
if-else abgefragt , aber ich denke das ist nicht die beste Option, gibt 
es evtl einen Thread wo ähnliches Besprochen wurde? Bzw wonach muss ich 
suchen?

Grüße Rico

Im Moment benutze ich einen AtMega168A aber ich will mich da nicht 
festlegen.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@ Rico S. (donricone)

>eine .txt Datei brauchte, dachte ich mir die 8bit Daten in ASCII zu
>formatieren und als String in die .txt zu schreiben.

Kann man machen.

>Gibt es eine Funktion die integer in das zugehörige ASCII Zeichen
>wandelt?

itoa

>Idealerweise schneller wie wenn ich den Integer in einen String
>wandle und diesen auf die SD schreibe.

Warum? Wieviele Millionen Zeichen willst du denn pro Sekunde wandeln?

>Mit wie vielen Taktzyklen ist grob zu rechnen? ( Für Wandeln von Integer
>in ASCII Char bzw. Strings.
>ibt es allgemein irgendwo Übersichten Erfahrungswerte wie viele Zyklen
>welche Funktion braucht?

Frag den Simulator.

Und viel wichtiger. Sag erstmal, was dein ZIEL ist.
Einfach nur schnell, schnell ist Unsinn.

>Wenn ich mir die Benchmarks von Elm Chan ansehe, und ich sie richtig
>verstehe, wäre es am besten möglichst lange Strings zu schreiben,
>anstatt immer nur einzelne Datensätze hinzuzufügen?

Man schreibst lange BLÖCKE, aber das ist durch die Pufferung im FatFs 
nicht sooo kritisch. Ich hab es auch mal gemessen, siehe Anhang. Selbst 
mit 100 Byte Blöcken schafft man noch 100kB/s ! der Test lief mit 8 MHz 
SPI-Takt.

>Im Moment habe ich 2 Variablen anhand denen die Daten die auf dem
>Display angezeigt werden sollen,ausgewählt werden. Diesen werden von
>if-else abgefragt , aber ich denke das ist nicht die beste Option,

Muss es immer die BESTE sein? Reicht nicht auch mal ein "gut"?

von holger (Gast)


Lesenswert?

>Gibt es eine Funktion die integer in das zugehörige ASCII Zeichen
>wandelt? Idealerweise schneller wie wenn ich den Integer in einen String
>wandle und diesen auf die SD schreibe.

Das ist doch das gleiche.

Am schnellsten geht es wenn der schlappe AVR die Daten
einfach roh auf die SD Karte schreibt und die Auswertung
auf dem PC erfolgt.

von Ernst B. (puravida)


Lesenswert?

Falk Brunner schrieb:
> Man schreibst lange BLÖCKE, aber das ist durch die Pufferung im FatFs
> nicht sooo kritisch. Ich hab es auch mal gemessen, siehe Anhang. Selbst
> mit 100 Byte Blöcken schafft man noch 100kB/s ! der Test lief mit 8 MHz
> SPI-Takt.

Hi Falk,

(und sorry Rico falls meine Fragen nicht zu Deinen Überlegungen passt.)

Ich habe mir den FatFS Code angeschaut - noch nicht im Detail aber doch 
- und so wie ich das sehe puffert FatFS nicht komplette 512 KB Blöcke 
bevor geschrieben wird? Oder?

Wäre es nicht besser - auch in Hinblick auf die Lebensdauer der SD-Card 
- die Daten solange im SRAM zu speichern bis man einen kompletten 512 KB 
Block beinander hat und erst dann auf die SD speichert?

Und zu guter letzt, wie viel SRAM braucht alleine die FatFS vom Chen? 
Oder anders gefragt, wie viel SRAM braucht man mindestens um noch einen 
kompletten Block zwischenzuspeichern wenn man die FatFS verwendet?

LG
Ernst

von Marian (phiarc) Benutzerseite


Lesenswert?

Ernst B. schrieb:
> 512 KB Blöcke

512 Byte, nicht kilobyte. Welche Buffer benutzt werden, hängt von der 
FatFS-Konfiguration ab (FS_TINY etc.), es gibt aber mindestens einen 
Sektorbuffer (>= 512 Bytes).

von Marius S. (lupin) Benutzerseite


Lesenswert?

Nimm einen ARM mit SDIO Interface und alle deine Probleme sind gelöst :)

von Ernst B. (puravida)


Lesenswert?

Marian B. schrieb:
> es gibt aber mindestens einen
> Sektorbuffer (>= 512 Bytes).

Hi Marian!

Danke für den Hinweis auf einen kleinen Faktor 1024 Fehler! :-)

Wenn man sich das Foolproof Beispiel ansieht da werden aber weniger als 
512 Bytes auf die SD-Karte geschrieben?

Irgendwie habe ich den Puffer noch nicht gecheckt... oder gefunden.

Wenn man eine Datei auf der SD öffnet, dann ein paar Bytes Daten drauf 
schreibt und dann wieder die Datei schließt dann werden die doch gleich 
geschrieben?

Wie gesagt, ich checke es nicht wann gepuffert wird oder nicht...

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Ernst B. (puravida)

>- und so wie ich das sehe puffert FatFS nicht komplette 512 KB Blöcke
>bevor geschrieben wird? Oder?

Es puffer 512 Bytes = 1 Sektor.

>Wäre es nicht besser - auch in Hinblick auf die Lebensdauer der SD-Card
>- die Daten solange im SRAM zu speichern bis man einen kompletten 512 KB
>Block beinander hat und erst dann auf die SD speichert?

Nein, nicht nötig, darum kümmert sich FatFs und die SD-Karte.

>Und zu guter letzt, wie viel SRAM braucht alleine die FatFS vom Chen?
>Oder anders gefragt, wie viel SRAM braucht man mindestens um noch einen
>kompletten Block zwischenzuspeichern wenn man die FatFS verwendet?

Ich glaube etwas mehr als 1 kB. Also verkraftbar, wenn man einen 4kB 
SRAM AVR hat.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Die Variante, die am wenigsten Rechenzeit frisst:

Die SD-Karte so vorbereiten, dass sie bereits eine (sehr große) Datei 
enthält. Dann kann man ohne Dateisystem schreiben, nämlich direkt an die 
Speicheradressen der Blocks.

Zu den 512-Bytes-Blöcken:

Wenn man direkt schreibt - wie gerade von mir vorgeschlagen - kann man 
so langsam schreiben wie man will. Gespeichert wird immer erst dann, 
wenn 512 Bytes fertig sind. Man braucht also gar keinen Puffer im SRAM.

Zu itoa():

Das Thema hatte ich grad in einem anderen Thread. Wie lange braucht 
itoa() auf dem genannten ATmega168A für eine 5-Stellige Zahl? Wie lange 
für eine 10-stellige (wahrscheinlich dann ultoa oder so)? Gibt es da 
Erfahrungen?

von holger (Gast)


Lesenswert?

>Die SD-Karte so vorbereiten, dass sie bereits eine (sehr große) Datei
>enthält. Dann kann man ohne Dateisystem schreiben, nämlich direkt an die
>Speicheradressen der Blocks.

Ja, den Schwachsinn liest man immer wieder mal.
Was ist wenn die Karte fragmentiert ist? Dann gehts in die Hose.
Karte mal neu formatiert, Anfangsadresse des ersten Sektors
der Datei muss neu bestimmt werden. Super klasse Idee so ein Müll.

Wenn man schnell auf eine SD Karte schreiben will nimmt
man halt keinen uralten AVR sondern einen ARM mit SDIO.
Der hat dann auch genug RAM für Multiblock Writes.
Erst diese Multiblock Writes machen das schreiben auf eine
SD wirklich schnell.

Womit wir dann wieder bei dem Thema sind warum alte 8 Bitter
heute nur noch scheisse sind;)

von Ernst B. (puravida)


Lesenswert?

Markus Weber schrieb:
> Wenn man direkt schreibt - wie gerade von mir vorgeschlagen - kann man
> so langsam schreiben wie man will. Gespeichert wird immer erst dann,
> wenn 512 Bytes fertig sind. Man braucht also gar keinen Puffer im SRAM.

Dann geht die SD Karte aber nie in Standby, oder?

von Marian (phiarc) Benutzerseite


Lesenswert?

Ernst B. schrieb:
> Und zu guter letzt, wie viel SRAM braucht alleine die FatFS vom Chen?
> Oder anders gefragt, wie viel SRAM braucht man mindestens um noch einen
> kompletten Block zwischenzuspeichern wenn man die FatFS verwendet?

http://elm-chan.org/fsw/ff/en/appnote.html

Ohne _FS_TINY: 560 Bytes plus 544 Bytes pro offener Datei. D.h. ein 
Sektorbuffer fürs Volume plus ein Sektorbuffer pro Datei
Mit _FS_TINY: 560 Bytes plus 32 Bytes pro offener Datei. Also ein 
gemeinsamer Sektorbuffer für alles.

Wenn die SD-Karte nur unter z.B. Linux gelesen werden muss, kann man 
auch ein einfacheres Dateisystem als FAT nehmen. Minix 3 z.B.

> The file I/O buffer is a sector buffer to read/write a partial
> data on the sector. The sector buffer is either file private
> sector buffer on each file object or shared sector buffer in the
> file system object. The buffer configuration option _FS_TINY
> determins which sector buffer is used for the file data
> transfer. When tiny buffer (1) is selected, data memory
> consumption is reduced 512 bytes each file object. In this case,
> FatFs module uses only a sector buffer in the file system object
> for file data transfer and FAT/directory access. The disadvantage
> of the tiny buffer configuration is: the FAT data cached in the
> sector buffer will be lost by file data transfer and it must be
> reloaded at every cluster boundary.  However it will be suitable
> for most application from view point of the decent performance
> and low memory comsumption.

: Bearbeitet durch User
von Ernst B. (puravida)


Lesenswert?

holger schrieb:
> Womit wir dann wieder bei dem Thema sind warum alte 8 Bitter
> heute nur noch scheisse sind;)

Da kann schon was dran sein. Aber wenn man keine Ahnung von den Cortexen 
hat... :-)

Und anders als der TE habe ich kein Zeitproblem, zumindest beim 
Speichern.

Es wäre aber cool wenn jemand das mit dem Puffern erklären könnte in 
Zusammenhang mit FatFS und/oder SD-Karten. Oder einen Link hat wo man 
das nachlesen könnte.

von Marian (phiarc) Benutzerseite


Lesenswert?

Ernst B. schrieb:
> Es wäre aber cool wenn jemand das mit dem Puffern erklären könnte in
> Zusammenhang mit FatFS und/oder SD-Karten. Oder einen Link hat wo man
> das nachlesen könnte.

http://elm-chan.org/fsw/ff/en/appnote.html
http://elm-chan.org/docs/mmc/mmc_e.html
Beitrag "Re: Geschwindigkeitsfrage AVR auf SD"

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Markus Weber (Firma: guloshop.de) (m-w)

>Die SD-Karte so vorbereiten, dass sie bereits eine (sehr große) Datei
>enthält. Dann kann man ohne Dateisystem schreiben, nämlich direkt an die
>Speicheradressen der Blocks.

Bastelmurks! Wenn man sich mal HALBWEGS mit dem Thema und z.B. dem 
VORZÜGLICHEN FatFs (sowohl die Software als auch Doku!) beschäftigt, 
wird man merken, dass eben genau DAS schon direkt möglich ist! Man kann 
beim Öffnen einer Datei erstmal die Maximalänge festlegen, dann wird 
schon mal der gesamte Speicher auf der Karte reserviert und der 
Schreibzugriff passiert mit minimalem Overhead!

http://elm-chan.org/fsw/ff/en/lseek.html
1
/* Cluster pre-allocation (to prevent buffer overrun on streaming write) */
2
3
    res = f_open(fp, recfile, FA_CREATE_NEW | FA_WRITE);   /* Create a file */
4
5
    res = f_lseek(fp, PRE_SIZE);             /* Expand file size (cluster pre-allocation) */
6
    if (res || f_tell(fp) != PRE_SIZE) ...   /* Check if the file has been expanded */
7
8
    res = f_lseek(fp, DATA_START);           /* Record data stream WITHOUT cluster allocation delay */
9
    ...                                      /* DATA_START and write block size should be aligned to sector boundary */
10
11
    res = f_truncate(fp);                    /* Truncate unused area */
12
    res = f_lseek(fp, 0);                    /* Put file header */
13
    ...
14
15
    res = f_close(fp);

Ohne FAT auf ne SD-Karte zu schreiben ist einfach nur Bastelmurks. Wer 
mal einen Blick auf meine Messung wirft wird leicht merken, dass das 
mehr als schnell genug für einen AVR als Logger ist!

Beitrag "Re: Geschwindigkeitsfrage AVR auf SD"

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

holger & Falk:

Ich respektiere natürlich eure Sichtweise. :-)
Trotzdem halte ich meinen Vorschlag, mit einem Pseudo-FAT zu arbeiten 
weder für "Schwachsinn" noch für Bastelmurks.

Vielleicht hab ich es aber auch nicht klar genug beschrieben:

Ich gehe davon aus, dass nur der Logger auf die Karte schreibt, alle 
anderen nur lesend drauf zugreifen. Dann liegt es doch nahe, dass die 
Karte (meinetwegen vom Logger) mit einem konstanten Header so 
vorbereitet wird, dass die zu schreibenden Daten in fortlaufenden 
Blöcken ab einer bestimmten Adresse geschrieben werden können. Der 
Logger braucht sich dann nicht um eine Allocation Table zu kümmern, er 
kann sich alleine aufs Schreiben konzentrieren.

Vorteile:
- man braucht keine FAT-Bibliotheken
- Echtzeitbetrieb leichter möglich, weil der Logger nicht zwischendurch 
immer wieder lesend auf die SD-Karte (bzw. auf die gecachete FAT) 
zugreifen muss
--> das Programm auf dem Logger läuft schneller und ist kleiner

von Marian (phiarc) Benutzerseite


Lesenswert?

Markus Weber schrieb:
> Ich gehe davon aus, dass nur der Logger auf die Karte schreibt, alle
> anderen nur lesend drauf zugreifen. Dann liegt es doch nahe, dass die
> Karte (meinetwegen vom Logger) mit einem konstanten Header so
> vorbereitet wird, dass die zu schreibenden Daten in fortlaufenden
> Blöcken ab einer bestimmten Adresse geschrieben werden können.

Und das findest du nicht Bastelmurks?

Markus Weber schrieb:
> - Echtzeitbetrieb leichter möglich, weil der Logger nicht zwischendurch
> immer wieder lesend auf die SD-Karte (bzw. auf die gecachete FAT)
> zugreifen muss

Das ist in der Praxis falsch. Spätestens wenn der SD-Controller bei 
einem Write erstmal das Wear Leveling anwirft und das Schreiben 
vierhundert mal länger benötigt als normalerweise. Da du bei SD-Karten 
keinerlei Garantien hast, was wie lange dauert, sind sie als Medium für 
Echtzeit ( das Schreiben dieser Daten darf maximal 81 ms dauern ) 
denkbar schlecht geeignet.

: Bearbeitet durch User
von Ernst B. (puravida)


Lesenswert?

Hi Marian!

Danke für die Links und die Mühe.

Marian B. schrieb:
> Beitrag "Re: Geschwindigkeitsfrage AVR auf SD"

Diese Antwort hatte ich gar nicht gesehen, hat sich wohl überschnitten 
gehabt.

LG
Ernst

von Rico (Gast)


Lesenswert?

Nochmal zurück zu meiner Frage, bzw ich muss sie wohl nochmal genauer 
stellen, itao wandelt ja mein integer einfach um, aber das will ich 
nicht.

Der 8 Bit Wandler liefert Werte zwischen 0 und 255 jeder dieser Werte 
hat ein zugeordnetes Zeichen in ASCII,  43 wird "+" 75 wird "K"  usw.

So hatte ich mir das vorgestellt,  jedes Zeichen der  Log Datei enthält 
nun einen Messwert.

von Falk B. (falk)


Lesenswert?

@ Markus Weber (Firma: guloshop.de) (m-w)

>Logger braucht sich dann nicht um eine Allocation Table zu kümmern, er
>kann sich alleine aufs Schreiben konzentrieren.

Das interessiert nicht, denn es funktioniert auch so sehr schnell. Der 
Beweis wurde mehrfach erbracht.

>- man braucht keine FAT-Bibliotheken

Die gibt es von vielen Leuten komplett fix und fertig und kostenlos. Die 
10-15kB Flash interessieren keinen, schon gar nicht bei Hobbyprojekten.

>- Echtzeitbetrieb leichter möglich, weil der Logger nicht zwischendurch
>immer wieder lesend auf die SD-Karte (bzw. auf die gecachete FAT)
>zugreifen muss

Ebenfalls falsch, wie bereits mehrfach geschrieben. Erstens ist der 
Overhead mit FAT und Know How (Preallocation) nahe Null und zweitens 
spuckt dir Wear Leveling so oder so dazwischen. Ein ausreichend großer 
FIFO ist in JEDEM Fall nötig.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Marian B. schrieb:
> Und das findest du nicht Bastelmurks?

Nein. Warum sollte ich auch? Die Leute, die so eine FAT-Library 
programmieren, schreiben auch ihre Bits direkt auf die SD-Karte. Einer 
muss das am Ende ja machen. :-)

Falk Brunner schrieb:
> Das interessiert nicht, denn es funktioniert auch so sehr schnell. Der
> Beweis wurde mehrfach erbracht.

Ja, sehr schnell, aber in meinem Fall nicht schnell genug, weil der 
Mikrocontroller noch andere Aufgaben hatte, die er mit garantierten 
Reaktionszeiten erledigen musste. In solchen Fällen verbieten sich 
Aufrufe von Lib-Funktionen.

Klar, das ist kein Standardfall, aber es gibt eben auch 
Nicht-Standard-Fälle. Pauschale Urteile helfen da nicht immer...

> Die gibt es von vielen Leuten komplett fix und fertig und kostenlos. Die
> 10-15kB Flash interessieren keinen, schon gar nicht bei Hobbyprojekten.

Auch hier gilt: Stimmt meistens – aber eben nicht immer. Eine meiner 
Zielplattformen war ein ATtiny85.

> Ebenfalls falsch, wie bereits mehrfach geschrieben. Erstens ist der
> Overhead mit FAT und Know How (Preallocation) nahe Null und zweitens
> spuckt dir Wear Leveling so oder so dazwischen. Ein ausreichend großer
> FIFO ist in JEDEM Fall nötig.

Hier hast du Recht, ich habs blöd ausgedrückt. Besser so: Bei Nutzung 
einer FAT-Lib lassen sich geringe Reaktionszeiten für andere Ereignisse 
schlecht garantieren. Damit meine ich Zeiten unter 1 µs.
Dadurch schied die Lib-Lösung in meinem Fall aus.

Für mich brachte der Lösungsansatz mit einer FAT-Library also viel mehr 
Nachteile als Vorteile. Es gab sogar K.O.-Kriterien.

Für 99 % der Fälle ist die Lösung mit einer Lib natürlich besser und 
bequemer, das seh ich genauso. Aber unterschlage bitte nicht das 
verbleibende eine Prozent. :-)

von Falk B. (falk)


Lesenswert?

@ Markus Weber (Firma: guloshop.de) (m-w)

>Ja, sehr schnell, aber in meinem Fall nicht schnell genug, weil der
>Mikrocontroller noch andere Aufgaben hatte, die er mit garantierten
>Reaktionszeiten erledigen musste. In solchen Fällen verbieten sich
>Aufrufe von Lib-Funktionen.

Blödsinn. erzähl doch mal, was du da angeblich soooo kritisches machen 
willst?

>Auch hier gilt: Stimmt meistens – aber eben nicht immer. Eine meiner
>Zielplattformen war ein ATtiny85.

Aha, weil ein AVR mit mehr Flash nicht dort reinpasst?


>Hier hast du Recht, ich habs blöd ausgedrückt. Besser so: Bei Nutzung
>einer FAT-Lib lassen sich geringe Reaktionszeiten für andere Ereignisse
>schlecht garantieren. Damit meine ich Zeiten unter 1 µs.
>Dadurch schied die Lib-Lösung in meinem Fall aus.

Dann stimmt dein Konzept so oder so nicht. Auch ohne FAT schreibst du 
keine SD-Karte und hast nebenbei 1us Reaktionszeiten.
btw, ein FAT heißt ja nicht, dass man keine Interrupts nutzen kann.

>Für mich brachte der Lösungsansatz mit einer FAT-Library also viel mehr
>Nachteile als Vorteile. Es gab sogar K.O.-Kriterien.

Wollen wir wetten, dass das nur deine einseitige Sichtweise war/ist und 
das Problem auch MIT FAT lösbar wäre?

>Für 99 % der Fälle ist die Lösung mit einer Lib natürlich besser und
>bequemer, das seh ich genauso.

Ach, auf einmal?

> Aber unterschlage bitte nicht das
>verbleibende eine Prozent. :-)

Beschreibe DEIN verbleibendes Prozent?

von holger (Gast)


Lesenswert?

>Nochmal zurück zu meiner Frage, bzw ich muss sie wohl nochmal genauer
>stellen, itao wandelt ja mein integer einfach um, aber das will ich
>nicht.

Du musst gar nichts umwandeln.

>Der 8 Bit Wandler liefert Werte zwischen 0 und 255 jeder dieser Werte
>hat ein zugeordnetes Zeichen in ASCII,  43 wird "+" 75 wird "K"  usw.

Warum willst du da dann was umwandeln?

43 = '+' = 0x2B = 0b01000011

Ein Byte ist ein Byte ist ein Byte.

>So hatte ich mir das vorgestellt,  jedes Zeichen der  Log Datei enthält
>nun einen Messwert.

Falsch, jedes Byte der Log Datei enthält einen Messwert.
Ob du dieses Byte als ASCII Zeichen, Hex, oder Binär interpretierst
ist deine Sache. Es ist für den uC oder den PC immer derselbe
Wert.

Du musst nichts anderes tun als dein Byte zu speichern.
Eine Umwandlung ist nicht notwendig.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Falk Brunner schrieb:
> @ Markus Weber (Firma: guloshop.de) (m-w)
>
>>Ja, sehr schnell, aber in meinem Fall nicht schnell genug, weil der
>>Mikrocontroller noch andere Aufgaben hatte, die er mit garantierten
>>Reaktionszeiten erledigen musste. In solchen Fällen verbieten sich
>>Aufrufe von Lib-Funktionen.
>
> Blödsinn. erzähl doch mal, was du da angeblich soooo kritisches machen
> willst?

Frank, ich weiß, wovon ich rede, das kannst du mir glauben. Musst es 
aber natürlich nicht, das steht dir völlig frei. :-)
Ich persönlich finde es auch nicht schlimm, wenn du mir nicht glaubst. 
Du hast deine eigenen Erfahrungen, andere Ansichten, das respektiere 
ich. Das wiederholte "Schwachsinn" und "Blödsinn" finde ich trotzdem 
irgednwie nicht passend.

> Aha, weil ein AVR mit mehr Flash nicht dort reinpasst?

Größe war eines von mehreren Kriterien, das ist richtig. Man kann aber 
auch sagen: "weil ein AVR mit mehr Flash nicht notwendig ist".

> Dann stimmt dein Konzept so oder so nicht. Auch ohne FAT schreibst du
> keine SD-Karte und hast nebenbei 1us Reaktionszeiten.

Ich glaube, hier irrst du. Das ist durchaus möglich, sogar mit einem 
popeligen AVR. Wie du sicher weißt:
Ein AVR macht bei 20 MHz Takt 20 Befehle je µs (in der Praxis eher 15, 
weil manche Befehle 2 Takte brauchen). Der angesprochene ATtiny85 läuft 
mit internem RC-Oszillator mit 16 MHz.
Da kannst du sogar durch aktives Klappern der IO-Leitungen auf die 
SD-Karte schreiben.

> btw, ein FAT heißt ja nicht, dass man keine Interrupts nutzen kann.

Stimmt sicher. Dazu müsste ich aber den Quellcode der 
Bibliotheksfunktionen durchsehen, ob dort irgendwo vorübergehend die 
Interrupts blockiert werden. Hier wahrscheinlich nicht entscheidend, 
aber es gibt auch Fälle, in denen Interrupts zu langsam sind und man 
eben pollt.

> Wollen wir wetten, dass das nur deine einseitige Sichtweise war/ist und
> das Problem auch MIT FAT lösbar wäre?

Du meinst "mit FAT-Library", oder? Weil FAT an sich verwende ich ja, nur 
eben ohne Bibliothek.
Aber wenn du einen Weg mit Bibliothek und so geringen Reaktionszeiten 
findest, der dann auch noch mit einem billigen µC läuft, habe ich ein 
offenes Ohr.

>>Für 99 % der Fälle ist die Lösung mit einer Lib natürlich besser und
>>bequemer, das seh ich genauso.
>
> Ach, auf einmal?

Klar. Sorry, wenn es vielleicht anders rübergekommen ist, ich bin nicht 
so verbohrt, dass ich meinen Ansatz für den einzig möglichen halte. Es 
hängt immer von den übrigen Unständen ab, welcher Weg für einen ganz 
bestimmten Anwendungsfall der "richtige" ist.

von Falk B. (falk)


Lesenswert?

@ Markus Weber (Firma: guloshop.de) (m-w)

>Frank, ich weiß, wovon ich rede, das kannst du mir glauben.

Glauben kann man in der Kirche, hier geht es um technische FAKTEN!

>Größe war eines von mehreren Kriterien, das ist richtig. Man kann aber
>auch sagen: "weil ein AVR mit mehr Flash nicht notwendig ist".

Schwaches Argument.

>Da kannst du sogar durch aktives Klappern der IO-Leitungen auf die
>SD-Karte schreiben.

Das ist gar nicht der Punkt.

>Aber wenn du einen Weg mit Bibliothek und so geringen Reaktionszeiten
>findest, der dann auch noch mit einem billigen µC läuft, habe ich ein
>offenes Ohr.

Wenn du deine Applikation nicht beschreibst und immer nur gemeinnisvoll 
und selbstsicher tust, geht das wohl kaum.

Beschreibe deine Anwendung und wir können drüber reden.

von Marian (phiarc) Benutzerseite


Lesenswert?

Wieso sollte eine Bibliothek einen signifikanten Unterschied in den 
Reaktionszeiten erzeugen? Das finde ich kein überzeugendes Argument — 
erst recht nicht ohne Untermauerung.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Falk Brunner schrieb:
> Glauben kann man in der Kirche, hier geht es um technische FAKTEN!

Ich habe das Gefühl, du gehst davon aus, ich müsse dir beweisen, dass 
meine konzeptionellen Entscheidungen in dem von mir betreuten Projekt 
richtig sind. Sogar darüber hinaus, dass sie in deinen Augen richtig 
sind.
Hier muss ich dich enttäuschen.

>>Größe war eines von mehreren Kriterien, das ist richtig. Man kann aber
>>auch sagen: "weil ein AVR mit mehr Flash nicht notwendig ist".
>
> Schwaches Argument.

Wie ebenfalls schon geschrieben: Du musst diese Ansicht nicht teilen. Es 
herrscht Meinungsfreiheit. :-)

Du denkst, ich soll einen größeren Mikrocontroller verwenden, obwohl es 
gar nicht notwendig ist? Nunja, kann man freilich machen, das ist aber 
nicht mein Weg.

> Wenn du deine Applikation nicht beschreibst und immer nur gemeinnisvoll
> und selbstsicher tust, geht das wohl kaum.

Ich bringe mich in diese Diskussion (in diesen Thread) ein, um zum Thema 
etwas beizutragen, nicht um das Pflichtenheft eines meiner Projekte zu 
veröffentlichen. Auf die Gefahr mich zu wiederholen: ich bin hier in 
keiner Beweispflicht.

> Beschreibe deine Anwendung und wir können drüber reden.

Dazu habe ich aber doch keinen Anlass. Sie funktioniert prima.

Marian B. schrieb:
> Wieso sollte eine Bibliothek einen signifikanten Unterschied in den
> Reaktionszeiten erzeugen? Das finde ich kein überzeugendes Argument —
> erst recht nicht ohne Untermauerung.

Ich schlage vor, dass du das selbst ausprobierst und vergleichst. :-)

Auf der einen Seite: ein Funktionsaufruf in der Bibliothek.
Auf der anderen Seite: lineare Programmierung ohne Unterprogrammaufruf, 
die ohne Rückgriff auf die FA-Table einen Datenblock an eine absolute 
Adresse der SD-Karte schreibt.

Bei der zweiten Methode hast du die Möglichkeit, jedes Byte des 512 
Bytes großen Datenblocks einzeln zur SD-Karte rüberzuschieben und dich 
zwischen diesen Bytes um eine andere (hochpriore) Aufgabe zu kümmern. 
Das geht bei einer Bibliotheksfunktion natürlich nicht. Außer, du 
verwendest eine ISR – mit entsprechender negativer Auswirkung auf die 
Performance und dem Verlust der vollen Kontrolle, weil du normalerweise 
nicht sichergehen kannst, dass eine Bibliotheksfunktion die Interrupts 
nicht für kurze Zeit abschaltet um selbst irgendetwas Wichtiges zu 
erledigen.

von Falk B. (falk)


Lesenswert?

@ Markus Weber (Firma: guloshop.de) (m-w)

>Ich habe das Gefühl, du gehst davon aus, ich müsse dir beweisen, dass
>meine konzeptionellen Entscheidungen in dem von mir betreuten Projekt
>richtig sind.

Das musst du, wenn du deine Aussage begründen willst. SOnst beleibt es 
nicht als eine Behauptung, die einfach so im Raum steht. Davon gibt es 
in diesem Forum schon genug.

>Sogar darüber hinaus, dass sie in deinen Augen richtig
>sind.

Das ist der Sinn eines Forums! Technische Probleme und deren Lösungen 
diskutirerne, nicht einfach nur Meinungen und basta.

>Wie ebenfalls schon geschrieben: Du musst diese Ansicht nicht teilen. Es
>herrscht Meinungsfreiheit. :-)

Sicher. Meinen kann man alles! Aber ohne sachliche Begründung darfst du 
auch keine Sekunde erwarten, ernst genommen zu werden.

>Du denkst, ich soll einen größeren Mikrocontroller verwenden, obwohl es
>gar nicht notwendig ist? Nunja, kann man freilich machen, das ist aber
>nicht mein Weg.

Hat kein Mensch gesagt.

>Ich bringe mich in diese Diskussion (in diesen Thread) ein, um zum Thema
>etwas beizutragen,

Nein! Du kannst deine Aussage INHALTLICH nicht begründen, nur nebulös 
"ich weiß schon warum das so ist". Das ist keine technische Diskussion, 
das ist Voodoo.

> nicht um das Pflichtenheft eines meiner Projekte zu
>veröffentlichen. Auf die Gefahr mich zu wiederholen: ich bin hier in
>keiner Beweispflicht.

Doch! Für deine Aussage, warum eben die Lösung in diesem Fall so sein 
muss.
Klar musst du nicht jedes (kommerzielle) Detail offenlegen, aber die 
Grundaussage muss erkennbar sein.

>Dazu habe ich aber doch keinen Anlass. Sie funktioniert prima.

Und ist geheim und somit indiskutabel.

>Bei der zweiten Methode hast du die Möglichkeit, jedes Byte des 512
>Bytes großen Datenblocks einzeln zur SD-Karte rüberzuschieben und dich
>zwischen diesen Bytes um eine andere (hochpriore) Aufgabe zu kümmern.

Prinzipiell ja. Wenn es aber soweit kommt, hat man meist ein 
konzeptionelles Problem.

von Marian (phiarc) Benutzerseite


Lesenswert?

Markus Weber schrieb:
> Bei der zweiten Methode hast du die Möglichkeit, jedes Byte des 512
> Bytes großen Datenblocks einzeln zur SD-Karte rüberzuschieben und dich
> zwischen diesen Bytes um eine andere (hochpriore) Aufgabe zu kümmern.

Ja eben nicht. Kann sein, dass das bei dir gut geht zeitlich, aber ich 
gehe davon aus, dass du — sofern du Busy korrekt auswertest — immer 
wieder Glitches hast, weil die Karte länger braucht, in deinem 
"Realtime".

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Marian B. schrieb:
> Ja eben nicht. Kann sein, dass das bei dir gut geht zeitlich, aber ich
> gehe davon aus, dass du — sofern du Busy korrekt auswertest — immer
> wieder Glitches hast, weil die Karte länger braucht, in deinem
> "Realtime".

Genau richtig, ich schreibe nicht, solange die SD-Karte "busy" anzeigt, 
das ist schon klar. Auf das Ende des Busy-Signals wartet das Programm 
aber nicht in einer leeren Dauerschleife; das Signal wird immer nur dann 
gepollt, wenn es die übrigen Aufgaben zulassen.
Deswegen gibt es keine zeitlichen Lücken bei diesen anderen Aufgaben des 
Controllers.

von Falk B. (falk)


Lesenswert?

@ Markus Weber (Firma: guloshop.de) (m-w)

>Genau richtig, ich schreibe nicht, solange die SD-Karte "busy" anzeigt,
>das ist schon klar. Auf das Ende des Busy-Signals wartet das Programm
>aber nicht in einer leeren Dauerschleife; das Signal wird immer nur dann
>gepollt, wenn es die übrigen Aufgaben zulassen.

>Deswegen gibt es keine zeitlichen Lücken bei diesen anderen Aufgaben des
>Controllers.

OK, eine extreme Variante von Multitasking. Ist das in ASM oder C 
gemacht? Weil wenn es denn WIRKLICH SOO zeitkritisch ist, muss es ja 
fast ASM sein.

Aber auch hier kann man mit ganz normalem FAT arbeiten, wenn gleich 
natürlich die Scheibfunktion derartig extrem gestaltet sein muss. Aber 
die Verwaltung und Sektoradressierung braucht keine Tricks. Der einzige 
Trick heißt Preallocation und cluster link map table, wie sie auch bei 
FatFs vom ELM CHAN benutzt wird.

Wenn gleich sowas machbar ist, würde ich solche Stunts eher nicht machen 
sondern durch ein passendes Konzept ggf. mit etwas Vorverarbeitung in 
Hardware (CPLD & Co) den AVR soweit zeitlich entlasten, dass es mit dem 
Standardansatz und einer normalen FAT- Lib geht. Weil so einen Krampf 
würde ich mir nicht antun wollen, auch wenn es möglich ist.

Aber was machst du, wenn die SD-Karte gerade ihr Wear Leveling macht? 
Dann KANNST du multitasken wie du willst, du KANNST KEINE Daten 
absetzen. Also MUSST du per FIFO puffern oder Daten wegwerfen! Und dann 
nützt dir auch der beste Multitaskingansatz NICHTS!

Welche Datenraten schreibst du auf die Karte?

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Falk Brunner schrieb:
> OK, eine extreme Variante von Multitasking. Ist das in ASM oder C
> gemacht? Weil wenn es denn WIRKLICH SOO zeitkritisch ist, muss es ja
> fast ASM sein.

100 Punkte! :-) Ist natürlich Assembler. In C wäre das zu umständlich, 
weil z.B. das SRAM komplett für den Puffer verwendet wird und deswegen 
als Stack nicht zur Verfügung steht. Unterprogrammaufrufe gibt es 
trotzdem, die Rücksprungadresse landet aber nicht im Stack, sondern in 
einem Rücksprung-Register (Makros ZCALL und ZRET; läuft übrigens 
schneller als normale RCALLs/RETs).

Ich kann aber gut verstehen, wenn dir das zu kryptisch ist und du diese 
Tricks selbst nicht verwenden würdest. Mag ja nicht jeder.

> Aber was machst du, wenn die SD-Karte gerade ihr Wear Leveling macht?
> Dann KANNST du multitasken wie du willst, du KANNST KEINE Daten
> absetzen. Also MUSST du per FIFO puffern oder Daten wegwerfen!

Puffern (siehe oben). Und im Extremfall einen Datensatz wegwerfen.

> Welche Datenraten schreibst du auf die Karte?

Die Daten kommen spontan und schnell, aber immer nur in kleinen 
Portionen, so dass Verlust nicht zu erwarten ist. Die 512 Bytes Puffer 
reichen aus.

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.