Forum: Compiler & IDEs AVR-STUDIO 6.2 - Section in umgekehrter Reihenfolge angelegt?


von AVRli (Gast)


Lesenswert?

Hi,

mein Frage geht an die Profis unter Euch. Ich komme nicht weiter.
Es geht in meinem Fall um eine CPU ATmega 644 welche ich mit einem JTAG 
MKII anspreche.

Ich habe vorher immer mit AVR Studio 4 programmiert, stelle nun meine 
Projekte auf AVR Studio 6.2 um weil ich keine XP Maschine mehr habe und 
ich die aktuelle Entwicklungsumgebung nutzen möchte.

Ich habe eine Section in den Memory Einstellungen angelegt:
.fconsection=0x77b8

Im Quelltext habe ich meine Konstanten auch definiert:
1
#define FCON_SECTION __attribute__ ((section (".fconsection")))
2
const char firmver[32]  FCON_SECTION  = "1.0";
3
const char firmdate[16] FCON_SECTION  = "01.01.2014";

Schaue ich nach dem compilieren in den Speicher, finde ich erst 
firmdate und dann danach firmver.

Nun frag ich mich ob man die Reihenfolge einstellen kann, also ob man 
festlegen kann wie die Konstanten abgelegt werden, denn ich würde es 
begrüßen wenn die Reihenfolge die ist, die ich definiert habe. ;-)

Unter AVR Studio 4 war das immer der Fall.

Danke für jeden Tip!!!
Grüße AVRli...

von g457 (Gast)


Lesenswert?

> denn ich würde es  begrüßen wenn die Reihenfolge die ist, die ich
> definiert habe. ;-)

Du hast keine Reihenfolge definiert.

Ein struct könnte helfen. Oder ein durchgängiges array machen.

von AVRli (Gast)


Lesenswert?

Danke für Deine Antwort.

Das ganze zieht sich wie ein roter Faden durch das Projekt, jegliche 
"Reservierung" egal von was ist nun Rückwärts.

Auch die Reservierung im EEMEM ohne Section...

Das ist natürlich ganz großer Käse, da im Gerät das Setup dort 
gespeichert ist und das nun nicht mehr passt.

Anordnung A,B,C,D    war immer: A,B,C,D
nun
Anordnung A,B,C,D    ist immer: D,C,B,A !! :-(

Wobei der Inhalt an sich wieder in der richtigen Reihenfolge steht. Nur 
die Position der einzelnen Reservierungen ist "von hinten nach vorn".

Ich hoffe es gibt eienn "Schalter" für diesen Irrsinn... Hilfe...

Grüße AVRli...

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


Lesenswert?

AVRli schrieb:
> Ich hoffe es gibt eienn "Schalter" für diesen Irrsinn.

Nein, es gab noch nie einen Anspruch für die Reihenfolge, in der der
Compiler die Variablen anlegt.

Wie schon geschrieben wurde: pack alles in eine struct, dann ist die
Reihenfolge garantiert.

von AVRli (Gast)


Lesenswert?

Vielen Dank,

Jörg Wunsch schrieb:
> Wie schon geschrieben wurde: pack alles in eine struct, dann ist die
> Reihenfolge garantiert.

Puhh hatte das anders in Erinnerung, keine Ahnung woher, doch irgendwie 
war mir als ob die Reihenfolge der Deklaration auch die Reihenfolge im 
Speicherbereich vorgibt. wenn ich das wieder finde, schreib ich das hier 
noch rein...

OK, wäre jemand so nett und würde mir das am obigen Beispiel zeigen?

Eine Struct mit Konstanten in einer eigenen Section?


Grüße AVRli...

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


Lesenswert?

AVRli schrieb:

> OK, wäre jemand so nett und würde mir das am obigen Beispiel zeigen?
1
#define FCON_SECTION __attribute__ ((section (".fconsection")))
2
const struct {
3
  char firmver[32];
4
  char firmdate[16];
5
} identifier FCON_SECTION = {
6
  "1.0",
7
  "01.01.2014"
8
};

von AVRli (Gast)


Lesenswert?

Danke Dir! Das sieht gut aus!!!

Wenn ich nun alle Deklarationen über ein struct laufen lasse, dann ist 
die Anordnung IMMER die gleiche?

Auch im EEMEM?

Grüße AVRli...

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


Lesenswert?

Ja, die Anordnung der Elemente innerhalb einer struct ist definiert
aufsteigend.  Es könnten lediglich architekturabhängig noch Füllbytes
eingefügt werden, aber das wäre dir hier ja sowieso egal.

von AVRli (Gast)


Lesenswert?

OK vielen Dank!

Morgen schau ich mir dann den Teil an, der im EEMEM abgelegt wird, da 
findet das Programm kein Setup Punkt wieder... das ist vollkommen 
verdreht. Hoffe das man ein Struct auch in ein weiteres "Main" Struct 
legen kann.

Werde ich morgen sehen... :-I


Für heute gute Nacht, schöne Grüße AVRli...

von AVRli (Gast)


Lesenswert?

Hallo,

bin nun dabei die Section für den EEPROM Bereich aufzubauen, doch da 
klemmt es nun doch noch... :-(

In den Memory Settings habe ich im EEPROM Segment folgendes eingegeben: 
.eep_setup_data=0x0000

Die Section im Quelltext dann wie folgt:
1
#define EEP_SETUP_DATA __attribute__ ((section (".eep_setup_data")))
2
const struct {
3
  uint8_t ver;
4
  char name[16];
5
} eep_setup_data EEP_SETUP_DATA = {
6
  SETUP_VERSION,    // Setup Versionsnummer
7
  "12345678"    // Text
8
};

Doch das wird nun mit einer wohl berechtigten Fehlermeldung "abgelehnt".
1
section .eeprom loaded at [00810000,00810169] overlaps section .eep_setup_data loaded at [00810000,00810010]

Was habe ich da nun übersehen oder ist der EEMEM nicht in Section 
aufzuteilen?

Grüße AVRli...

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


Lesenswert?

Naja, wenn du den EEPROM in mehrere Sections teilen willst, musst du
dem Linker schon sagen, welche der Sections er wohin platzieren soll,
entweder auf der Kommandozeile oder im (custom) Linkerscript.

Bliebe die Frage, warum du überhaupt mehrere Sections dort brauchst.
Warum kannst du nicht genau eine struct in den EEPROM packen, die
all deine EEPROM-Initialwerte komplett enthält?

von AVRli (Gast)


Lesenswert?

Danke für die Antwort.

Jörg Wunsch schrieb:
> Naja, wenn du den EEPROM in mehrere Sections teilen willst, musst du
> dem Linker schon sagen, welche der Sections er wohin platzieren soll

Ist das nicht getan mit dem Eintrag in den Memory Settings?


Jörg Wunsch schrieb:
> Bliebe die Frage, warum du überhaupt mehrere Sections dort brauchst.

Ja ich möchte nun einfach sicher gehen das sich der Aufbau, also die 
Anordnung, nicht wieder ändert. Momentan habe ich das Problem das in dem 
µC eben ein Setup drin ist und dieses nun völlig unbrauchbar ist, da die 
neue Firmware alles neu (von hinten nach vorn) anordnet.

Weiter habe ich mir die letzten 32 Byte im EEMEM Bereich für Daten 
reserviert, welche sowohl im Bootloader (in ASM geschrieben) als auch 
von dem eigentlichen Programm (in C) genutzt werden soll.

Wollte das nun mit Sektionen lösen um "sicher Kontrolle" über die 
Anordnung zu bekommen. Das ASM Programm liest den Bereich unter AVR 
Studio 6.2 immer noch in der Reihenfolge A,B,C,D das C Programm seit AVR 
Studio 6.2 D,C,B,A.


Grüße AVRli...

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


Lesenswert?

AVRli schrieb:

>> Naja, wenn du den EEPROM in mehrere Sections teilen willst, musst du
>> dem Linker schon sagen, welche der Sections er wohin platzieren soll

> Ist das nicht getan mit dem Eintrag in den Memory Settings?

Welcher Eintrag?

Auf jeden Fall versuchst du derzeit ganz offensichtlich, beide deine
EEPROM-Sections auf die Adresse 0x810000 (also den Anfang des EEPROM)
abzubilden.  Das geht logischerweise nicht.

> Jörg Wunsch schrieb:
>> Bliebe die Frage, warum du überhaupt mehrere Sections dort brauchst.
>
> Ja ich möchte nun einfach sicher gehen das sich der Aufbau, also die
> Anordnung, nicht wieder ändert.

Das wäre mit einer Section, die genau eine struct enthält, am
einfachsten zu erledigen.

> Weiter habe ich mir die letzten 32 Byte im EEMEM Bereich für Daten
> reserviert, welche sowohl im Bootloader (in ASM geschrieben) als auch
> von dem eigentlichen Programm (in C) genutzt werden soll.

OK, das wäre natürlich in der Tat ein Grund für eine zweite Section,
die man dann explizit ans Ende des EEPROM legt.  Das muss man sich
allerdings mit der Hand ermitteln, und dann mittels

-Wl,--section-start=.eeprom_shared=0x813e0

(oder was auch immer für deinen EEPROM passt) dem Linker mitteilen.

von AVRli (Gast)


Lesenswert?

Hi Jörg und danke das Du Dich meinem Problem annimmst. ;-)

Jörg Wunsch schrieb:
> Welcher Eintrag?

Ja im Compiler- Setup gibt es die Möglichkeit Memory Settings zu 
hinterlegen. Dort habe ich die PROGMEM Sektionen angelegt und unter 
EEMEM eben den folgenden Eintrag hinzugefügt: .eep_setup_data=0x0000

Jörg Wunsch schrieb:
> Auf jeden Fall versuchst du derzeit ganz offensichtlich, beide deine
> EEPROM-Sections auf die Adresse 0x810000 (also den Anfang des EEPROM)
> abzubilden.  Das geht logischerweise nicht.

Ja Du und der Compiler haben Recht. :-) Das geschah aber unbewusst. Ich 
habe meine Setup Sektion mal auf Adresse 0x0300 verschoben dann ging es. 
Fragte mich natürlich warum und siehe da, die Fehlermeldung hatte 
recht!!! puhh ;-)

Es gab noch weiter unten Variablen die ich nicht mehr auf dem Schirm 
hatte und die wurden in den EEMEM Bereich gespeichert. Die will der 
Compiler dann ab 0x0000 ablegen und meine Sektion die auch bei 0x0000 
beginnen sollte überschnitt sich damit.

Jetzt ist alles OK, es läuft!!! Alles was in den EEPROM an Setup Daten 
soll, ist nun in einer Struktur und in der Sektion ab 0x0000.

Bleibt zu hoffen das es nun die Dauerlösung ist. :-)
Was ich mich abschließend frage ist: Warum wurde die automatische 
Anordnung umgedreht, gibt es eine logische Erklärung dafür?

Grüße AVRli...

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


Lesenswert?

AVRli schrieb:
> Warum wurde die automatische Anordnung umgedreht

Da musst du die GCC-Entwickler fragen.

Das ist aber eigentlich schon viele Jahre her, dass das mal geändert
worden ist.

von AVRli (Gast)


Lesenswert?

OK, danke für die Unterstützung, ich habe bisher als Umgebung AVR Studio 
4 eingesetzt, 5 habe ich ganz ausgelassen und nun die 6.2... ist nen 
enormer Sprung, hoffentlich in die richtige Richtung. ;-)

Grüße AVRli...

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


Lesenswert?

AVRli schrieb:
> ich habe bisher als Umgebung AVR Studio 4 eingesetzt

Wobei das allein noch nichts über die benutzte Toolchain-Version sagt.

von AVRli (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Wobei das allein noch nichts über die benutzte Toolchain-Version sagt.

Ja das stimmt auch wieder... das weiß ich allerdings nicht mehr, die die 
da m it kam, sicher auch was in die Jahre gekommenes. hihihihi

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.