ATMEGA2561 SRAM wird knapp

Gast #6658992
Lesenswert?

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?
Gast #6659003
Lesenswert?

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?
Gast #6659008
Lesenswert?

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
#6659052
Lesenswert?

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
Gast #6659089
Lesenswert?

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 ....
#6659299
Lesenswert?

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.
Gast #6659327
Lesenswert?

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...
Gast #6659335
Lesenswert?

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.
#6659341
Lesenswert?

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!
Gast #6659359
Lesenswert?

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ß.
Gast #6659384
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren