Hallo zusammen,
ich schon wieder. Dank der Hilfe der Guten Geister Dieses Forums habe
ich es geschafft, meinen ATMega644P zu programmieren. Ich bin von einem
ATMega32 auf den 644P umgestiegen, weil ich mehr Speicher benötige. Nun
zeigt sich aber, dass ich wahrscheinlich wieder in Speicherprobleme
(Überlauf) reinlaufe.
Mit meinem Makefile (siehe Anhang) und
Das sieht für mich immer noch gut aus, denn der 644p hat 64k Flash und
4k SRAM. Das ist alles noch weit von dem entfernt, was ich hier sehe.
Dennoch bleibt mein Programm hängen - was ich schon vom ATMega32 kenne.
Wie kann ich sicher erkennen, dass ich keine Speicherschreiber habe ?
Gibt es eine Magic Formula ?
Danke im Voraus für Hinweise!
Grüße
Frank
Leider läßt sich aus der Ausgabe von .data + .bss + .noinit der
wirkliche SRAM-Bedarf zur Laufzeit nicht ermitteln. Denn zur Laufzeit
kostet jede aufgerufene Funktion Platz auf dem Stack (lokale
Variablen!). Am besten mal den wahren Speicherverbrauch zur Laufzeit
bestimmen. Eine brauchbare Methode dazu findest Du hier:
http://www.rn-wissen.de/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc
Es kann natürlich leicht sein, daß Dein Code eigentlich mit dem SRAM
auskommen müßte, Du aber irgendwo ein Speicherleck hast, z.B. schreiben
über die Array-Grenzen hinaus. Das mußt Du natürlich ausschließen.
Servus
Michael
Auch wenn lokale Variable SRAM benötigen, sind da zunächst mal noch über
2k frei. Da passt schon eine Menge rein.
Hast du große Arrays lokal angelegt? Nutzt du malloc, oder rekursive
Funktionsaufrufe?
Wenn nicht, ist das sehr wahrscheinlich kein Speicherplatzproblem.
Oliver
Michael M. schrieb:
> Leider läßt sich aus der Ausgabe von .data + .bss + .noinit der> wirkliche SRAM-Bedarf zur Laufzeit nicht ermitteln. Denn zur Laufzeit> kostet jede aufgerufene Funktion Platz auf dem Stack (lokale> Variablen!). Am besten mal den wahren Speicherverbrauch zur Laufzeit> bestimmen. Eine brauchbare Methode dazu findest Du hier:> http://www.rn-wissen.de/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc
Danke für den Link !!
>> Es kann natürlich leicht sein, daß Dein Code eigentlich mit dem SRAM> auskommen müßte, Du aber irgendwo ein Speicherleck hast, z.B. schreiben> über die Array-Grenzen hinaus. Das mußt Du natürlich ausschließen.
Yep, ist klar. Da der Code (bis auf eine neue Funktion, die das
Speicher-Fass beim ATMega32 zum Überlaufen brachte) auf dem ATMega32
läuft, habe ich bisher nicht in dieser Richtung gesucht....
> Servus> Michael
Cheers
Frank
Hubert G. schrieb:
> Für welchen Kontroller wurde der Code denn ursprünglich geschrieben?> Wie sind die LCD- und sonstige Ausgabetexte gespeichert.
Für den ATMega32.
Als PSTRs. Überwiegend (zu ca. 90%). Mehr geht nicht - denn die
restlichen Strings sind Format-Strings.
Gruß,
Frank
Oliver schrieb:
> Auch wenn lokale Variable SRAM benötigen, sind da zunächst mal noch über> 2k frei. Da passt schon eine Menge rein.>> Hast du große Arrays lokal angelegt?
Nein.
> Nutzt du malloc,
Nein.
> oder rekursive Funktionsaufrufe?
Nein.
> Wenn nicht, ist das sehr wahrscheinlich kein Speicherplatzproblem.
Vermute ich inzwischen auch. Sieht nach UART Problem aus, weiss aber
nicht wieso. Denn: DAS LIEF ALLES SCHON MAL AUF EINEM ATMEGA32 ...
Schnief!
> Oliver
Frank
Dann würde ich das mal mit dem Code probieren der auf dem Mega32 lief,
der hat nur halb so viel SRAM.
Wenn das läuft dann die neue Funktion einfügen. Dann hast du zumindest
einen Anhaltspunkt zum suchen.
Hubert G. schrieb:
> Dann würde ich das mal mit dem Code probieren der auf dem Mega32 lief,> der hat nur halb so viel SRAM.> Wenn das läuft dann die neue Funktion einfügen. Dann hast du zumindest> einen Anhaltspunkt zum suchen.
Jau. gelesen, getan. Alles läuft, bis auf UART. Sobald ich den UART (ich
nutze die Lib von Peter Fleury) dazunehme, per Aufruf:
In darc.h:
1
#if !defined( DARC_BAUDRATE )
2
#define DARC_BAUDRATE 38400
3
#endif
In main():
1
...
2
darc_init(DARC_BAUDRATE);// Enable communication link "DARC" using USART0
3
...
4
}
In darc.c:
1
rc_tdarc_init(unsignedlongnBaudrate)
2
{
3
// Initialize UART of the controller board (uses Peter Fleury's
>Ich habe keine Hinweise in Sachen USART für die Portierung von ATMega32>auf ATMega644P gefunden ...
Da gibt es schon Unterschiede, aber die lib handelt das (hoffentlich
richtig).
Da hilft alles nichts, da ist jetzt intelligentes debugging angesagt.
Oliver
Oliver schrieb:
> Da hilft alles nichts, da ist jetzt intelligentes debugging angesagt.
;-) Yep - das ist wohl wahr. Und hält mich schon ein paar Stunden auf
Trab...
Danke nochmals.
Grüße
Frank
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.