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:
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 (",)
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
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
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:
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.
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
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:
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...
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.
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(",)
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 (",)
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 (",)