EEMEM landet aber im RAM

Gast #3552289
Lesenswert?

Ich habe diesen Code:
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
#include <stdint.h>
4

5
uint8_t EEMEM  t[1024];
6
int main(void)
7
{
8
    while(1)
9
    {
10
       
11
    }
12
}

Die Build-Ausgabe ist:
1
Program Memory Usage   :  192 bytes   0,3 % Full
2
Data Memory Usage     :  1024 bytes   25,0 % Full
3
EEPROM Memory Usage   :  1024 bytes   50,0 % Full


Warum landet der EEPROM-Teil im RAM?
Gast #3552357
Lesenswert?

Eprom schrieb:
> Warum landet der EEPROM-Teil im RAM?

Wenn du so fragst: da der Inhalt von EEMEM im ROM landet und beim Start 
vom versteckten init-code ins RAM kopiert wird. Ist die Optimierung 
nicht angeschaltet oder hat das Array einen vorgeladenen Wert, den du 
uns nicht zeigst? Den so muss er den Inhalt eigentl. nicht kopiert, 
sondern nur mit 0 initialisiert werden.
#3552375
Lesenswert?

Eprom schrieb:
> Ok.
> Wie stelle ich den Fehler ab? Der oben dargestellte Code ist naürlich
> nur ein Beispiel, das Original bekomme ich nicht kompiliert, da die
> RAM-Nutzung über 100% ist.

Das kann ich mir eigentlich nicht vorstellen.
Denn der Compiler weiß überhaupt nichts von irgendwelchem kompletten 
Speicherverbrauch. Das kann frühestens der Linker feststellen. Aber auch 
dem ist das egal.
Der Dump kommt ja von einem eigenen Tool. Maximal kann dir das einen 
Fehler an make zurückgeben. Zu diesem Zeitpunkt ist aber bereits alles 
fertig und das Hex-File sollte eigentlich vorhanden sein.
#3552520
Lesenswert?

Bei mir geht das.
In ein beliebiges Projekt reingesetzt:
1
uint8_t EEMEM  t[1024];
2

3
AVR Memory Usage
4
----------------
5
Device: atmega328p
6

7
Program:    3198 bytes (9.8% Full)
8
(.text + .data + .bootloader)
9

10
Data:        288 bytes (14.1% Full)
11
(.data + .bss + .noinit)
12

13
EEPROM:     1024 bytes (100.0% Full)
14
(.eeprom)


Und den Compiler, Linker oder sonstwen interessiert es einen Sch... ob 
das da reinpasst.
1
uint8_t EEMEM  t[2048];
2

3
AVR Memory Usage
4
----------------
5
Device: atmega328p
6

7
Program:    3198 bytes (9.8% Full)
8
(.text + .data + .bootloader)
9

10
Data:        288 bytes (14.1% Full)
11
(.data + .bss + .noinit)
12

13
EEPROM:     2048 bytes (200.0% Full)
14
(.eeprom)
15

16

17
Build succeeded with 0 Warnings...

mfg.
Moderator Persönliche Seite #3553082
Lesenswert?

1
$ cat > ee.c
2
#include <avr/io.h>
3
#include <avr/eeprom.h>
4
#include <stdint.h>
5

6
uint8_t EEMEM  t[1024];
7
int main(void)
8
{
9
    while(1)
10
    {
11
       
12
    }
13
}
14
^D
15
$ avr-gcc -Os -mmcu=atmega88 -o ee.elf ee.c
16
$ avr-objdump -h ee.elf
17

18
ee.elf:     file format elf32-avr
19

20
Sections:
21
Idx Name          Size      VMA       LMA       File off  Algn
22
  0 .text         0000004c  00000000  00000000  00000074  2**1
23
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
24
  1 .eeprom       00000400  00810000  00810000  000000c0  2**0
25
                  CONTENTS, ALLOC, LOAD, DATA
26
  2 .stab         00000738  00000000  00000000  000004c0  2**2
27
                  CONTENTS, READONLY, DEBUGGING
28
  3 .stabstr      00000097  00000000  00000000  00000bf8  2**0
29
                  CONTENTS, READONLY, DEBUGGING
30
  4 .comment      00000011  00000000  00000000  00000c8f  2**0
31
                  CONTENTS, READONLY

Keine .data-Section dabei, also gar kein statischer RAM-Verbrauch.

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