Forum: Compiler & IDEs wie platziert man eine Variable an eine bestimmte Stelle im EEPROM (Studio6)


von Marcel K. (viewer)


Lesenswert?

Hallo liebes Forum,

ich versuche eine Variable an eine bestimmte Stelle im EEPROM zu 
speicher, aber irgendetwas mache ich falsch.

In den Projekt- Properties habe ich unter:
AVR-GNU Linker/Memory Settings/EEPROM segment
die Definition ".eep_var2=0x10" erstellt.

Im Quellcode gibt es dann:
1
#define EEP_VAR1 __attribute__((section(".eeprom")))
2
3
#define EEP_VAR2 __attribute__((section(".eep_var2")))
4
5
typedef struct
6
{
7
   uint8    x;
8
   uint8    y;
9
   uint8    z;
10
}var_t;
11
12
var_t var1 EEP_VAR1 = {0x01, 0x02, 0x03, 0x04};
13
var_t var2 EEP_VAR2 = {0x05, 0x06, 0x07, 0x08};

Es wird dann beim Debuggen nur der Wert der ersten Variable im EEPROM 
angezeigt. von der 2. Variable ist keine Spur zu finden.

Im Mapfile steht dann:
1
...
2
3
4
.eeprom         0x00810000        0x3
5
 *(.eeprom*)
6
 .eeprom        0x00810000        0x3 main.o
7
                0x00810000                var1
8
                0x00810003                __eeprom_end = .
9
10
...
und zum Schluss dann noch:
1
.eep_var2       0x00810010        0x0

Das sieht also aus, dass es eine Variable ander Stelle 0x10 zwar gibt 
aber mit der Länge 0.

Hat jemand hier im Forum eine Erklärung dafür? Ich wäre für jede Hilfe 
sehr dankbar!

Viele Grüße,
Marcel (",)

von marixstorm (Gast)


Lesenswert?

Wie waere es mit einer grossen _packed_ Struktur, welche den ganzen 
EPROM ueberdeckt - un an den richtigen Positionen deine Variablen 
enthaelt.
Der Rest kann z.B. via uint8_t arrays "reserviert" bleiben.

MfG

von Marcel K. (viewer)


Lesenswert?

Hallo marixstorm,
erst mal Danke für Deine Antwort. Generell wäre das schon eine 
Möglichkeit. Ich würde aber gerne verstehen wiso meine Einstellungen zu 
keinem Ergebnis führt. Mit Deinem Vorschlag würde ich das Problem ja nur 
umgehen ;o) Ich würde aber schon gerne wissen wie man geziehlt eine 
Variable platziert.

Grüße,Mrcel

von Stephan B. (matrixstorm)


Lesenswert?

Hallo Marcel

Du kannst mit
1
__attribute__((section(".meinsektionname")))
 arbeiten, solltest dann aber darauf achten, das "meinsektionname" im 
default Linkerscript nicht bereits verwendet wird.

Wenn dem so ist, kannst du deinen (linkenden) Compileraufruf mittels 
"-Wl,--section-start=.meinsektionname=0xabcdef" ergaenzen.
Beachte dann aber bitte auch, das du diese Sektion beim "avr-objcopy" 
mit in die entsprechende Datei (hier eeprom) extrahieren musst:
1
avr-objcopy -j .eeprom -j .meinsektionname -O ihex projekt.elf eeprom.hex

MfG

von Marcel K. (viewer)


Lesenswert?

Hallo Stephan B.,
Du schreibst, dass ich darauf achten muss, dass "meinsektionname" nicht 
bereits im default Linkerscript definiert ist. Das default Linkerscript 
hat aber doch mit Sicherheit nicht die Definietion ".eep_var2". Also 
müsste ich nach Deinen Angaben auch nichts mehr machen, oder?
Mich wundet einfach wiso im MAP- File das Segment ".eep_var2" zwar 
angelegt wird aber es nur die Länge "0" hat.

von Stephan B. (matrixstorm)


Lesenswert?

static vergessen?

von Marcel K. (viewer)


Angehängte Dateien:

Lesenswert?

Also wenn ich static verwende, wird gar keine Variable angelegt.
(siehe Anhang)

von Stephan B. (matrixstorm)


Angehängte Dateien:

Lesenswert?

So hier mein Beispiel.

Bei mir funktioniert es.

Nachtrag 1: Natuerlich
1
 avr-objcopy -O binary -j .eep_var1 -j .eep_var2 main.elf eeprom.raw
 bzw.
1
 avr-objcopy -O ihex -j .eep_var1 -j .eep_var2 main.elf eeprom.hex
 nicht vergessen !


Nachtrag2:
Ich muss aber sagen, mir wuerde das mit dem grossen struct und den 
reservierten spaces besser gefallen.

MfG Stephan

von Marcel K. (viewer)


Lesenswert?

Hallo,

erst mal vielen Dank für Deine Mühe, das weiß ich sehr zu schätzen!

Ich denke ich mache bei meinem Linker etwas falsch oder es ist ein Bug 
im Studio6 (wäre ja nicht so ganz abwägig)

Ich habe jetzt ein neues Projekt mit Deinen Angaben erstellt:


//ifndef F_CPU
//#error please define F_CPU with the correct clock-frequency of your 
MCU
//#endif

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>


#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>

//#include <util/delay.h>

#define EEP_VAR1 __attribute__((section(".eep_var1"), used))
#define EEP_VAR2 __attribute__((section(".eep_var2"), used))

typedef struct {
   uint8_t    x;
   uint8_t    y;
   uint8_t    z;
}var_t;

static var_t var1 EEP_VAR1 = {0x01, 0x02, 0x03};
static var_t var2 EEP_VAR2 = {0x04, 0x05, 0x06};

int main(void) {
   return 0;
}


zusätzlich habe ich in den Projekt- Properties die zwei EEPROM-Segmente:

.eep_var1=0x01
.eep_var2=0x06

angelegt und es wird gar nichts ins EEPROM geschrieben.

Ich verwende kein eigenes Makefile so wie Du sondern verlasse mich da 
auf das Studio.  (das habe ich jetzt davon ;o) )

Das scheint also auf meinem Weg nicht richtig zu funktionieren.

Trtzdem recht herzlichen Dank für Deine aufwendige Hilfe.

Viele Grüße,
Marcel

von Stefan E. (sternst)


Lesenswert?

Marcel K. schrieb:
> Das scheint also auf meinem Weg nicht richtig zu funktionieren.

Ich habe das aus deinem letzten Post 1:1 im Studio6 ausprobiert, und 
folgendes steht dann in Test.eep:
1
:03000100010203F6
2
:03000600040506E8
3
:00000001FF
Funktioniert also.

von Marcel K. (viewer)


Lesenswert?

Hallo Stefan Ernst,

erst mal Danke für Deine Mühe das Du das so bei Dir ausprobiert hast. 
Ich bin gerade unterwegs werde es aber später noch mal ausprobieren. 
Könntest Du mir aber Bitte noch mal Deine Studio-Version mitteilen?

Ich werde später noch mal berichten...

Grüße...

von Stefan E. (sternst)


Lesenswert?

Marcel K. schrieb:
> Könntest Du mir aber Bitte noch mal Deine Studio-Version mitteilen?

Das Studio ist nicht gerade taufrisch: 6.0.1938
Die verwendete Toolchain ist allerdings nicht die mit dem Studio 
ausgelieferte, sondern etwas manuell installiertes auf avr-gcc-4.7.2 
Basis.

Um festzustellen, ob das Studio selber irgendwelchen Unsinn macht, 
solltest du mal den kompletten Output eines Rebuild posten.

von Marcel K. (viewer)


Angehängte Dateien:

Lesenswert?

Hallo Stefan,

also ich habe das ganze mal auf meinem Laptop mit der Studio 6.1.2440 
probiert. Da hat es auch nicht geklappt.
Kann es sein, dass ich vielleicht ein Flag in den Properties vergessen 
habe?

Im Anhang habe ich mal die Dateien aus meinem Rebuild.

Viele Grüße und eine gute Nacht,
Marcel(",)

von Marcel K. (viewer)


Angehängte Dateien:

Lesenswert?

Hallo Stefan,

ich habe meine Toolchain- Einstellungen mal in ein Dokument kopiert.

Es wäre schön, wenn Du Dir vielleicht irgendwann mal die Zeit nehmen 
könntest und Deine Einstellungen mal dagegen prüfen könntest. Dann kann 
ich "falsche Einstellungern in der Toolchain" als Fehlerquelle 
ausschließen.

Viele Grüße,
Marcel (",)

von Marcel K. (viewer)


Lesenswert?

Hallo zusammen,

ich habe den Fehler gefunden. Es lag wirklich an den Einstellungen in 
meiner Toolchain.

Der Parameter:

AVR-GCC Linker/Optimization --> Garbage collect unused sections

war bei mir gesetzt. Sobald ich den Parameter deaktiviert habe, steht 
auch in meinem EEPROM- File der richtige Wert.

Grüße,

Marcel (",)

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.