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:
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...
> 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.
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...
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.
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...
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...
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.
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...
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:
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?
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...
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.
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...
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.
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...
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