Hallo,
ich suche eine Möglichkeit, dem AVR Studio 4.18 einen Teil des Flashs
"abzuzwicken", d.h. dieser Bereich wird beim Flashen nicht mehr mit
überschrieben. Hintergrund: ich will diesen Bereich zur Laufzeit mit
Daten füllen und diese nicht nach jedem SW-Update neu schreiben
müssen...
... außerdem sollte ein Linkererror kommen, falls mein Programmcode
irgendwann doch nicht mehr in den verbleibenden Flashbereich passen
sollte.
In Beitrag "Memory Sections im AVR Studio" und anderswo ist
zwar beschrieben wie eine Section eingerichtet wird. Dazu muß ich aber
einen Code- oder Datenbereich im Sourcecode definieren und diesen dann
in die zuvor erstellte Section verlinken. Die Größe einer Section ist
auch nicht einstellbar, lediglich ihre Startadresse.
Wenn ich jetzt aber im Sourcecode (C) einen Datenbereich definiere, der
meinem freizuhaltenden Bereich entspricht, dann überschreibt Studio bei
jedem Flash-Befehl meine Userdaten mit ebendiesen Dummy-Daten...
Bitte um Hilfe!
Toni
>Hintergrund: ich will diesen Bereich zur Laufzeit mit>Daten füllen und diese nicht nach jedem SW-Update neu schreiben>müssen...
Das geht nur, wenn du einen Bootloader benutzt.
Was du beim Compilieren/Linken an Sections definierst (oder reservierst,
oder was auch immer), interessiert den Programmer im AVR-Studio nicht
die Bohne. Der löscht beim Programmieren als erstes mal den ganzen
Flash. Es würde mich wundern, wenn das beim XMega anders wäre.
Genau das ist mein Problem: wie ich den Studio-Programmer davon abhalte,
das ganze Flash erst mal zu löschen sondern z.B. nur den tatsächlich vom
Programmcode benötigten Teil...
Ich hab auch keine Stelle gefunden, wo ich die Flashgröße selbst
definieren könnte. Sobald ich den XMEGA128A1 auswähle, übernimmt Studio
automatisch alle dessen Speichergrößen (macht ja auch Sinn). Einen
XMEGA64A1 kann ich übrigens auch auswählen und fehlerfrei übersetzen,
die 108% Data Belegung stören da offenbar genausowenig wie eine selbst
definierte Bootsektor-Adresse von 0x20000...
Toni schrieb:> Genau das ist mein Problem: wie ich den Studio-Programmer davon abhalte,> das ganze Flash erst mal zu löschen sondern z.B. nur den tatsächlich vom> Programmcode benötigten Teil...
Wie soll der Programmer auch etwas machen, was der Chip gar nicht kann?
Man kann über die ISP-Schnittstelle nicht nur Teile des Flash löschen.
Jedenfalls ist das bei den "normalen" AVRs so. Du musst halt mal ins
Datenblatt schauen, ob das bei den XMegas anders ist.
Der XMEGA hat keine ISP, sondern eine PDI-Schnittstelle. Zitat aus dem
DB:
"The PDI supports high-speed programming of all Non-Volatile Memory
(NVM) spaces; Flash,
EEPOM, Fuses, Lockbits and the User Signature Row. This is done by
accessing the NVM Controller,
and executing NVM Controller commands as described in Memory
Programming."
und weiter dort:
"The NVM commands that can be used for accessing the NVM memories from
external programming
are listed in Table 30-5. This is a super-set of the commands available
for selfprogramming."
Dass der NVM controller einzelne Flashpages löschen und schreiben kann,
hat er schon bewiesen (siehe Code oben). Table 30-5 enthält auch die
Zeilen:
"Flash
0x2B Erase Flash Page PDI Write N Y
0x02E Flash Page Write PDI Write N Y
0x2F Erase & Write Flash Page PDI Write N Y
0x78 Flash CRC CMDEX Y Y"
Ich sehe keinen Grund, warum man über PDI keine einzelnen Flashpages
löschen/schreiben können sollte.
hmmm...
warum nicht den gewünschten flash-inhalt VOR dem Neuprogrammieren
1. in eine Datei auslesen -> alt.hex
2. chip löschen
3. neu app programmieren
4. alt.hex programmieren
sollte relativ fix gehen und du hast deinen flash-datenbereich wieder
zur verfügung.
hab ich jetzt auch probiert:
1. Hex mit Applikationsdaten auslesen
2. ausgelesene Datei beschneiden (nur Applikationsdaten bleiben übrig)
3. neue SW programmieren
4. beschnittene applikationsdaten.hex drüber programmieren
5. Ergebnis in out.hex auslesen
Im Ergebnis stehen zwar brav meine Applikationsdaten, die SW ist aber
mit FF überschrieben worden, obwohl das beschnittene Hex diese Adressen
gar nicht enthielt :-(
Ich glaub ich lass es einfach dabei.
Vielen Dank für eure Anregungen!
Toni
Toni schrieb:> Ich glaub ich lass es einfach dabei.
Gibst du immer so schnell auf?
Mein Vorschlag wäre
1. Hex mit Applikationsdaten auslesen
2. ausgelesene Datei beschneiden (nur Applikationsdaten bleiben übrig)
3. Programm.hex und Applikationsdaten.hex in eine Datei kombinieren
(z.B. mit hextools)
4. Kombinierte Datei flashen
Oliver
Hallo Oliver,
danke für die Idee, das sollte auch funktionieren. Allerdings wollte ich
die Arbeitsschritte beim Neuflashen vereinfachen. und mir das neuerliche
herunterladen über Rs232 sparen. Wenn ich jetzt schon 2x flashen muss
(oder 2 HEX files zusammenmergen), dann ist es doch einfacher, jedesmal
die Applikationsdaten neu über RS232 runterzuladen. Trotzdem vielen Dank
für die Anregung.
Toni