Hallo,
ich beschäftige mich gerade damit an einem ATMEGA2561 eine SD-Karte mit
FatFS anzusprechen. Das Programm selbst belegt aktuell 21% Flash und 73%
SRAM.
Wenn ich nun auf die SD-Karte ca 85 Zeichen Schreiben möchte, welche ich
vorher mit MEMSET, STRCPY, STRCAT vorbereite, damit ein Datensatz drauß
wird, dann funktioniert zwar das schreiben jedoch sind danach zum
Beispiel Interrupts deaktiviert oder vorher festgelegte Variablen auf
einmal genullt. Wenn ich das Schreiben auf die SD-karte weg lasse, dann
läuft alles normal durch. Also scheint das ganze String kopieren zu groß
zu werden?
Wer kann hier helfen?
Piere schrieb:> Wer kann hier helfen?
Hast du schon versucht alle festen Strings ins PROGMEM zu
verlegen? Bringt oft eine ganze Menge freien RAM.
Vielleicht hast du auch noch zu viele einzelne String-
Zwischenspeicher die zu zusammenfassen könntest ....
beo bachta schrieb:> Hast du schon versucht alle festen Strings ins PROGMEM zu> verlegen? Bringt oft eine ganze Menge freien RAM.>> Vielleicht hast du auch noch zu viele einzelne String-> Zwischenspeicher die zu zusammenfassen könntest ....
Nein. Also alle String mit PROGMEM festschreiben und dann über Pointer
verwenden?
Piere schrieb:> Also alle String mit PROGMEM festschreiben und dann über Pointer> verwenden?
Pointer zeigen normalerweise ins RAM. Die Adressen des Programmspeichers
überlappen sich mit dem RAM, deswegen musst du alle Zugriffe auf andere
befehle umschreiben. Zum Beispiel musst du puts() in puts_P() ändern.
Da steht alles, was man dazu wissen muss:
https://www.nongnu.org/avr-libc/user-manual/pgmspace.html
Dein aktuelles Problem ist mit Sicherheit ein Programmierfehler.
Du solltest aber wissen, dass Du bei Deinem AVR recht einfach externes
SRAM anschließen kannst, das Du dann genauso wie internes ansteuern
kannst. Du brauchst dafür die Ports A, C und G am AVR, einen 74HC573 und
ein paralleles SRAM von 32KByte oder mehr. Wie es geht, steht in Kapitel
9 des Datenblatts oder z.B. hier:
https://scienceprog.com/adding-external-memory-to-atmega128/
fchk
Frank K. schrieb:> Dein aktuelles Problem ist mit Sicherheit ein Programmierfehler.
Naja, er kann ja auch beim Hantieren mit den Strings mal die
rettende Null am Ende vergessen / überlaufen.
Bin jetzt dabei alles ins Flash zu legen was constant ist. Schade dass
beim compilieren nicht darauf eingegangen wird, was im Ablauf noch
benötigt wird.
Frank K. schrieb:> Dein aktuelles Problem ist mit Sicherheit ein Programmierfehler.
Ich habe schon mit Chans FATFs gearbeitet, dabei fällt auf dass
dieses System eine recht grosse Tiefe (Verschachtelung) in den
Funktionsaufrufen aufweist. Zudem sind die Funktionsaufrufe oft
mit vielen Parametern ausgestattet sodass hier für beide
Eigenschaften auch eine hohe Wahrscheinlichkeit besteht dass
es mal zu einem "grossen" Stack kommt. Zumindest was die
AVR-Familie betrifft ....
Peter schrieb:> Wenn ich es richtig verstehe, sollte man bei verwenden von FatFs bis zu> 2 - 4 KB SRAM freilassen?
Nein, da braucht man neben den ~1kB für die festen Puffer bestenfalls
500B Stack oder so.
Peter schrieb:>> Kommt ganz auf die Konfiguration an. Siehe>> http://elm-chan.org/fsw/ff/doc/appnote.html#memory>> Werde da nur nicht schlau wie viel SRAM nun gebraucht wird...
Das was dort dargestellt ist, ist der KONSTANTE RAM-Bedarf (globale bzw.
lokal-statische Variablen). Den zeigt dir der Compiler an. Was dort
NICHT steht, ist der DYNAMISCHE RAM-Bedarf auf dem Stack. Der hängt von
den Funktionen und der Verschachtelungstiefe ab. Aber mehr als 500B
sollte man nicht brauchen. Wirklich gemessen hab ich es aber auch nicht.
Die Wahrscheinlichkeit ist hoch, daß der Fehler in deinem Programm
steckt und nicht durch geringen verfügbaren RAM verursacht wird.
Danke Falk, habe die Abschnitte, wo der String für die SD-Karte gebaut
wird, geprüft aber finde nix was darauf hindeutet dass es zum Fehler
kommt. Die Datei auf der SD sieht auch top aus.
Was mir generell auffällt, vielleicht kann es jemand auflösen, wenn ich
ein puffer für einen String genau bestimme, String 10 Zeichen, Puffer
hat Platz für 10 Zeichen, läuft immer was schief. Lasse ich etwas
Reserve, passt es...
Peter schrieb:> Und wenn ich mit STRCPY und STRCAT arbeite, kommt das an jeden String> oder nur ganz zum Schluss?
Muss, sonst wäre das Ergebnis kein gültiger String. Ob diese Funktionen
das Null-Byte selbst anhängen oder es dir überlassen, kannst du ihrer
Doku entnehmen.
https://www.nongnu.org/avr-libc/user-manual/group__avr__string.html
Verlasse dich nicht darauf, dass sich da alle Funktionen gleich
verhalten, tun sie nämlich nicht. Lieber nachlesen.
Piere schrieb:> Hallo,> ich beschäftige mich gerade damit an einem ATMEGA2561 eine SD-Karte mit> FatFS anzusprechen. Das Programm selbst belegt aktuell 21% Flash und 73%> SRAM.> ....Wenn ich das Schreiben auf die SD-karte weg lasse, dann> läuft alles normal durch. Also scheint das ganze String kopieren zu groß> zu werden?>> Wer kann hier helfen?
nimm einen AVR mit mehr SRAM und weniger flash:
ATmega1284p 128K flash und 16K SRAM!
Joachim B. schrieb:> nimm einen AVR mit mehr SRAM und weniger flash:> ATmega1284p 128K flash und 16K SRAM!
Das ist leider nur dann ein Ausweg, wenn man mit max. 32 GPIOs auskommt.
Eine Alternative könnten vielleicht die AVR128Dx sein. Die haben
ebenfalls 16k SRAM und 128k Flash, aber bis zu 54,5 GPIOs. Leider
ziemlich andere Peripherie, da gibt es viel Neues zu lernen, wenn man
von den "klassischen" AVR8 kommt. Hat man hingegen schon mit XMegas
hantiert, ist der Schock nicht gar so groß.
c-hater schrieb:> Das ist leider nur dann ein Ausweg, wenn man mit max. 32 GPIOs auskommt.
na die Anwendung will ich sehen die unbedingt Ports an der MPU benötigt!
Porterweiterung ist ja nun kein Neuland!
c-hater schrieb:> AVR128Dx
3,3V oder 5V?
Die MCU tauschen wäre der letzte Auswwg, ich versuche den Puffer zum
Zwischenspeichern zu erweitern und wenn das nicht klappt alle String in
den Flash legen um SRAM zu sparen
Joachim B. schrieb:> na die Anwendung will ich sehen die unbedingt Ports an der MPU benötigt!> Porterweiterung ist ja nun kein Neuland!
Nur langsam. Und eben gelegentlich langsamer als für die Anwendung gut
ist. Es gibt nämlich Anwendungen, die auch noch was anderes tun, als ein
GUI aus Tastern und LEDs und ein paar Relais anzusteuern...
> c-hater schrieb:>> AVR128Dx>> 3,3V oder 5V?
Egal. die laufen von 1,8 bis 5,5V mit vollem Takt von 24MHz. Das ist
anders als bei den klassischen AVR8 und auch anders als bei den XMega.
Joachim B. schrieb:> nimm einen AVR mit mehr SRAM und weniger flash:> ATmega1284p 128K flash und 16K SRAM!
Klar, ein ganz tolles Mittel gegen Programmierfehler und
Pufferüberläufe! TOP-EXPERTEN-TIP!
Peter schrieb:> Wie wirkt sich eigentlich das \0 auf die SD-Karte aus? Wird es als Bit> gezählt und ist im Editor am PC nicht sichtbar?
Kommt erstens drauf an an welcher Stelle das auftaucht und zweitens
darauf, welchen Editor man verwendet...
Peter schrieb:> Wie wirkt sich eigentlich das \0 auf die SD-Karte aus?
Gar nicht.
> Wird es als Bit> gezählt
Byte.
> und ist im Editor am PC nicht sichtbar?
Es wird nur im C-Program zu Erkennung des Stringendes benutzt, aber
nicht in die Datei geschrieben.