AVR, Heap - Variablen jenseits RAM-Grenze?

OP #468857
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:
1
int     main(void)
2
{
3
uint16_t        cluster = 0;
4
int32_t         counter = 0;
5
uint8_t buf[60];
6

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

12
[... usw. usf. ...]
13
}


jetzt liefert mir dieses kleine Programmcodebeispiel ein
1
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):
1
ludwig@client14:~/uni/HS/studarb/fat$ make clean avrfat
2
rm -f *.o *.out *.map *.hex
3
avr-gcc -g -mmcu=atmega16 -O0 -Wall  -c avrfat.c
4
In file included from avrfat.c:43:
5
mmc.c: In function ‘MMC_Write’:
6
mmc.c:276: warning: passing argument 1 of ‘ltoa’ makes integer from pointer without a cast
7
avrfat.c: In function ‘getDirEntry’:
8
avrfat.c:289: warning: pointer targets in passing argument 1 of ‘uart_puts_R’ differ in signedness
9
avrfat.c: In function ‘getDataDir’:
10
avrfat.c:306: warning: pointer targets in passing argument 1 of ‘uart_puts_R’ differ in signedness
11
avrfat.c:313: warning: pointer targets in passing argument 1 of ‘uart_puts_R’ differ in signedness
12
avrfat.c: In function ‘writeDirEntry’:
13
avrfat.c:338: warning: pointer targets in passing argument 1 of ‘uart_puts_R’ differ in signedness
14
avrfat.c: In function ‘FatInit’:
15
avrfat.c:585: warning: unused variable ‘ch’
16
avrfat.c: In function ‘main’:
17
avrfat.c:658: warning: passing argument 1 of ‘ltoa’ makes integer from pointer without a cast
18
avrfat.c:658: warning: pointer targets in passing argument 2 of ‘ltoa’ differ in signedness
19
avrfat.c:670: warning: passing argument 1 of ‘ltoa’ makes integer from pointer without a cast
20
avrfat.c:670: warning: pointer targets in passing argument 2 of ‘ltoa’ differ in signedness
21
avrfat.c:675: warning: pointer targets in passing argument 1 of ‘strlen’ differ in signedness
22
avrfat.c:690: warning: pointer targets in passing argument 1 of ‘NewFile’ differ in signedness
23
avrfat.c:694: warning: pointer targets in passing argument 1 of ‘sprintf’ differ in signedness
24
avrfat.c:695: warning: pointer targets in passing argument 1 of ‘NewFile’ differ in signedness
25
avrfat.c:697: warning: pointer targets in passing argument 1 of ‘sprintf’ differ in signedness
26
avrfat.c:698: warning: pointer targets in passing argument 1 of ‘strlen’ differ in signedness
27
avr-gcc -g -mmcu=atmega16 -O0 -Wall -o avrfat.out -Wl,-Map,fat.map avrfat.o
28
avr-objcopy -j .text -O ihex avrfat.out rom.hex
29
ludwig@client14:~/uni/HS/studarb/fat$


Saluti!

Ludwig
OP #468901
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
#468977
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.