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
Warum nimmst du dafür nicht den EEPROM? Den kann man bequem aus dem Programm heraus, wie auch per ISP-Programmer beschreiben. gruß cyblord
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.
Sry - vergessen zu sagen: Da mir das EEPROM vom Speicher her nicht reichen wird! Ich brauche vermutlich 1-2kByte Platz.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.