Forum: Compiler & IDEs EEMEM landet aber im RAM


von Eprom (Gast)


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?

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

soweit ich weiß ist das ein Fehler bei der Speicherberechnung. Landet 
aber trotzdem nichts davon im RAM

von Eprom (Gast)


Lesenswert?

chris schrieb:
> Soweit ich weiß ist das ein Fehler bei der Speicherberechnung. Landet
> aber trotzdem nichts davon im RAM

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.

von Sitterbüss (Gast)


Lesenswert?

uint8_t  t[1024]  EEMEM  ;

Check mal das aus!

von TriHexagon (Gast)


Lesenswert?

Natürlich landet das im RAM. Es ist keine Konstante, also veränderbar. 
Wie willst du das Array im ROM ändern?

von Eprom (Gast)


Lesenswert?

Sitterbüss schrieb:
> uint8_t  t[1024]  EEMEM  ;
>
> Check mal das aus!

Habe ich gemacht:

RunOutputFileVerifyTask-Aufgabe
        Program Memory Usage   :  192 bytes   0,3 % Full
        Data Memory Usage     :  1024 bytes   25,0 % Full
        EEPROM Memory Usage   :  1024 bytes   50,0 % Full



Verflucht!

von TriHexagon (Gast)


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.

von Eprom (Gast)


Lesenswert?

TriHexagon schrieb:
> Natürlich landet das im RAM. Es ist keine Konstante, also veränderbar.
> Wie willst du das Array im ROM ändern?

Ich möchte ein uint8_t Array[512] im EEPROM haben.

von TriHexagon (Gast)


Lesenswert?

Sehe erst jetzt, dass die Variable t heißt. Mit EEMEM erzwingst du 
natürlich das Verhalten.

von TriHexagon (Gast)


Lesenswert?

Müsste eigentlich so passen (gehört EEMEM nicht auf die rechte Seite vom 
Namen?). Kann natürlich ein Bug sein, wie chris schon ansprach. Welche 
Version hat den das AVR Studio oder die AVR Toochain?

von Karl H. (kbuchegg)


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.

von Thomas E. (thomase)


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.

von Jim M. (turboj)


Lesenswert?

Wenn man im Linkerskript die Memory Sections ordentlich setzt, sollte 
der meckern wenn es ihm zu voll wird.

von Eprom (Gast)


Lesenswert?

Keine Ahnung, ob es jetzt am Studio 6.0, am WinAVR/GCC liegt, ich mache 
es jetzt so:
1
EEMEM uint8_t  static t[1024];
Der Speicherverbrauch fürs EEPROM wird zwar jetzt nicht mehr angegeben, 
ist mir aber auch wurscht.

von Eprom (Gast)


Lesenswert?

Mist, geht auch nicht.

von Stephan B. (matrixstorm)


Lesenswert?

Eprom schrieb:
> Mist, geht auch nicht.

Nehm mal bitte eine neue Toolchain (z.B. von):
http://matrixstorm.com/avr/tinyusbboard/#asmorc

oder direkt von Atmel.

MfG

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.