Daten im Flash per Bootloader überschreiben

OP #2846537
Lesenswert?

Hallo zusammen,

habe jetzt wirklich sehr lange gesucht aber komischerweise nichts zu 
diesem Thema gefunden.
Das ganze bezieht sich im Übrigen auf einen ATMega8 oder 16 geschrieben 
in C im AVR-Studio 4 und avr-gcc als Compiler.

Problemstellung: Ich möchte bei einer Servosteuerung gewisse konstanten 
im Flash speicher (Anschläge, Geschwindigkeit, Figuren, usw.). Diese 
konstanten möchte ich im späteren Betrieb über den Bootloader seperat 
ändern (also ohne das eigentliche Programm zu ändern!)

Der Bootloader an sich ist kein Problem (also den ganzen Flash 
schreiben)

Was mir fehlt ist die möglichkeit nur die Daten zu überschreiben.
Hierzu fehlt mir eine möglichkeit dem Linker zu sagen er soll doch bitte 
meine Konstanten an eine gewisse Stelle im Flash schreiben und auch in 
einer bestimmten Reihenfolge, sodass ich später vom Bootloader aus 
gezielt diese Daten überschreiben kann.

Gibt es da eine Möglichkeit und wenn ja wie geht das ;)

Vielen Dank mal im Voraus für eure Hilfe ;)

Gruß
Tobi
#2846546
Lesenswert?

Tobias B. schrieb:
> Hierzu fehlt mir eine möglichkeit dem Linker zu sagen er soll doch bitte
> meine Konstanten an eine gewisse Stelle im Flash schreiben und auch in
> einer bestimmten Reihenfolge, sodass ich später vom Bootloader aus
> gezielt diese Daten überschreiben kann.

Alle Konstanten in eine Struktur packen, diese in einer eigenen Section 
(statt PROGMEM) platzieren, und diese Section in der 
Linker-Kommandozeile an eine feste Adresse setzen.
OP #2846550
Lesenswert?

Stefan Ernst schrieb:
> Alle Konstanten in eine Struktur packen, diese in einer eigenen Section
> (statt PROGMEM) platzieren, und diese Section in der
> Linker-Kommandozeile an eine feste Adresse setzen.

Hast du mir evtl einen Link dazu wie man das genau macht. Von den 
Sections hab ich schon gelesen nur wie ich da wo was einstellen muss hab 
ich bisher nicht wirklich verstanden.
OP #2846663
Lesenswert?

Ok warum auch immer ich es bisher nicht selber verstanden hab. Aber 
soweit ist es ja sehr einfach.
Damit die Nachwelt die das hier findet auch etwas hiervon hat:

Erzeugen einer Section in AVR-Studio 4:

Unter Project -> Configuration Options -> MemorySettings ein neues 
"Memory Segment" hinzufügen. Typ: Flash. Und unter Adresse die Adresse 
bezogen auf Daten*worte* ( 1 Wort = 2 Byte ).

Anlegen einer Variablen in dieser Section z.B.:
1
const uint16_t __attribute__ ((section (".Test"))) _ServoMin[8] = {1,2,3,4,5,6,7};
2
const uint16_t __attribute__ ((section (".Test"))) _ServoMaxSpeed[8] = {1,2,3,4,5,6,7};
3
const uint16_t __attribute__ ((section (".Test"))) _ServoMax[8] = {1,2,3,4,5,6,7};

Hierbei ist .Test die Section in der die Konstante angelegt wird.

Im .map-File steht dann:

1
.Test          0x00001600       0x30
2
.Test          0x00001600       0x30 main.o
3
               0x00001600                _ServoMin
4
               0x00001620                _ServoMaxSpeed
5
               0x00001610                _ServoMax
Danke nochmals für die schnelle Hilfe und das herunterheben vom 
Schlauch!

Gruß Tobi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren