www.mikrocontroller.net

Forum: Compiler & IDEs AVR, Heap - Variablen jenseits RAM-Grenze?


Autor: Ludwig M. (laludelala)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich arbeite an einer MMC/FAT Implementierung, und beisse mir gerade die 
Zähne aus.

Ich habe einen Atmel ATMega16 laufen, der Debugmeldungen über die 
Serielle gibt.


Ich definiere einen Haufen globaler Variablen, die alle artig im 
Objektfile angelegt sind. Ihr Ende (_end in Symboltabelle) ist an 
Adresse 0x80028f. Von den 1kB SRAM, die ich zur Verfügung habe, bleiben 
also 0x400-0x28f = 369 Bytes für Heap und Stack zur Verfügung.


Jetzt definiere ich in main() einige Variablen, die ja eigentlich auf 
dem Heap, also ab Stelle 0x28f im RAM, angelegt werden sollten:
int     main(void)
{
uint16_t        cluster = 0;
int32_t         counter = 0;
uint8_t buf[60];

[... versch. Initialisierungsgeschichten, unwichtig ...]
uart_puts(PSTR("\n\rAdresse von cluster: "));
uart_puts_R(ltoa(&cluster, buf, 10));
uart_puts(PSTR("\n\r\n\r"));

[... usw. usf. ...]
}


jetzt liefert mir dieses kleine Programmcodebeispiel ein
Adresse von cluster: 1058



Lasse ich mir die Adresse von einer globalen Variable ausgeben, so 
stimmt diese mit der Adresse aus der Symboltabelle überein.





Ich frage mich, wieso denn die erste Variable von main, die eigentlich 
DIREKT hinter dem Stack kommen soll, an eine Adresse jenseits der 
Speichergrenze angelegt wird!




Zum Compilieren rufe ich auf (Zeile 658 ist die oben aufgeführte imt 
"ltoa" - wenn ich dort richtig caste, ändert sich am Ergebnis Nix - 
1058):
ludwig@client14:~/uni/HS/studarb/fat$ make clean avrfat
rm -f *.o *.out *.map *.hex
avr-gcc -g -mmcu=atmega16 -O0 -Wall  -c avrfat.c
In file included from avrfat.c:43:
mmc.c: In function MMC_Write:
mmc.c:276: warning: passing argument 1 of ltoa makes integer from pointer without a cast
avrfat.c: In function getDirEntry:
avrfat.c:289: warning: pointer targets in passing argument 1 of uart_puts_R differ in signedness
avrfat.c: In function getDataDir:
avrfat.c:306: warning: pointer targets in passing argument 1 of uart_puts_R differ in signedness
avrfat.c:313: warning: pointer targets in passing argument 1 of uart_puts_R differ in signedness
avrfat.c: In function writeDirEntry:
avrfat.c:338: warning: pointer targets in passing argument 1 of uart_puts_R differ in signedness
avrfat.c: In function FatInit:
avrfat.c:585: warning: unused variable ch
avrfat.c: In function main:
avrfat.c:658: warning: passing argument 1 of ltoa makes integer from pointer without a cast
avrfat.c:658: warning: pointer targets in passing argument 2 of ltoa differ in signedness
avrfat.c:670: warning: passing argument 1 of ltoa makes integer from pointer without a cast
avrfat.c:670: warning: pointer targets in passing argument 2 of ltoa differ in signedness
avrfat.c:675: warning: pointer targets in passing argument 1 of strlen differ in signedness
avrfat.c:690: warning: pointer targets in passing argument 1 of NewFile differ in signedness
avrfat.c:694: warning: pointer targets in passing argument 1 of sprintf differ in signedness
avrfat.c:695: warning: pointer targets in passing argument 1 of NewFile differ in signedness
avrfat.c:697: warning: pointer targets in passing argument 1 of sprintf differ in signedness
avrfat.c:698: warning: pointer targets in passing argument 1 of strlen differ in signedness
avr-gcc -g -mmcu=atmega16 -O0 -Wall -o avrfat.out -Wl,-Map,fat.map avrfat.o
avr-objcopy -j .text -O ihex avrfat.out rom.hex
ludwig@client14:~/uni/HS/studarb/fat$ 


Saluti!

Ludwig

Autor: Ludwig M. (laludelala)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Im Assemblerfile sehe ich, daß die parameterübergabe offensichtlich 
nicht über den Stack erfolgt (kein "push"), sondern rein über Register.

Kann es sein, daß die CPU-Register jenseits der RAM-Grenze gemappt 
werden, obwohl laut Datenblatt sie am Anfang gemappt werden?



Saluti!

Ludwig

Autor: Ludwig M. (laludelala)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

OK, OK, OK - fünf Seiten weiter im Datenblatt steht drin, daß der SRAM 
"versetzt" adressiert wird ...

Bleibt dann trotzdem die Frage, wieso denn die lokalen Variablen so weit 
am Ende liegen! Die werden ja wohl nicht auf dem Stack angelegt werden??



Saluti!

Ludwig

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die werden ja wohl nicht auf dem Stack angelegt werden??

Klar. Wo denn sonst? Ist doch am allereinfachsten.
Beim Funktionsaufruf kommt die Returnadresse auf den
Stack und der Stackpointer wird noch zusätzlich um
die Anzahl der Bytes die für lokale Variablen benötigt
werden dekrementiert. Die Adressierung der Variablen
erfolgt dann relativ zum Stackpointer. Dann funktionierts
auch wunderbar mit Rekursionen.


lokale Variablen : Stack
alles was mittels malloc und Konsorten allokiert wird: Heap

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ludwig M. wrote:

> Bleibt dann trotzdem die Frage, wieso denn die lokalen Variablen so weit
> am Ende liegen! Die werden ja wohl nicht auf dem Stack angelegt werden??
Je nach dem. Entweder sie bleiben in den Registern oder müssen auf den 
Stack.
Hier sieht man auch deutliche Unterschiede ob man mit -O0 oder -O2 
compiliert.

Autor: Ludwig M. (laludelala)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

OK, habt vielen Dank für die Antworten!
Persönlich nützte ich den Stack zwar nur für die Kommunikation zwischen 
Funktionen, aber das ist ja jetzt geklärt.


Saluti!

Ludwig

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.