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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.