Forum: Mikrocontroller und Digitale Elektronik Daten im Flash per Bootloader überschreiben


von Tobias B. (sessl3r)


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

von Cyblord -. (cyblord)


Lesenswert?

Warum nimmst du dafür nicht den EEPROM? Den kann man bequem aus dem 
Programm heraus, wie auch per ISP-Programmer beschreiben.

gruß cyblord

von Stefan E. (sternst)


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.

von Tobias B. (sessl3r)


Lesenswert?

Sry - vergessen zu sagen: Da mir das EEPROM vom Speicher her nicht 
reichen wird! Ich brauche vermutlich 1-2kByte Platz.

von Tobias B. (sessl3r)


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.

von Tobias B. (sessl3r)


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

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.