www.mikrocontroller.net

Forum: Compiler & IDEs Daten im Flash an bestimmter Adresse speichern


Autor: Stefan Tschiggerl (stefan90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich programmiere gerade einen Bootloader für einen ATmega128 und 
verwende zusätzlich ein Statusbyte, das im Flash abgespeichert wird. 
Dieses soll wenn möglich an letzter Stelle im Flash - beim mega128 also 
an 0x1FFFF - stehen.

Doch wie kann ich das dem GCC sagen?
Wenn ich
uint8_t PROGMEM status = 0x10;
schreibe, dann weiß ich ja nicht exakt wo das Byte abgelegt wird. Da ich 
dieses Byte wieder verändern muss (nach jedem neuem Flashen der 
Hauptapplikation), weiß ich jetzt nicht welche Page in der 
Bootloadersection selbst ich neu beschreiben muss. Bei der letzten 
Adresse im Flash hab ich das Problem nicht, da lies ich einfach immer 
die letzte Page aus, verändere mein Statusbyte und schreibe die Page 
neu.

In Assembler würde ich das Statusbyte einfach so ablegen:
.org FLASHSIZE/2
status: .db 0x10
Geht das auch irgendwie in C? Was passiert wenn ich das so in Inline 
Assembler hinschreibe?

Was allgemeines: in der pgmspace.h wird empfohlen, Daten im Flash 
generell in unteren 64k abzulegen. Kann mir jemand sagen warum? Ich kann 
es ja nicht beeinflussen, wenn ich
uint8_t PROGMEM status = 0x10;
schreibe, wo der GCC dieses Byte ablegt oder?

mfg Stefan

Autor: Stefan Tschiggerl (stefan90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Thema Byte an konstanter Adresse abspeichern hab ich leider zuvor 
folgenden Beitrag übersehen Beitrag "[AVRGCC] Konstante an fest definierte Adresse im Flash"

Kann mir jemand sagen wie ich das aber genau nutze?

mfg Stefan

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was passiert wenn ich das so in Inline
>Assembler hinschreibe?

hmm... ausprobieren geht wahrscheinlich am schnellsten ;)

Lesende Zugriffe auf's Flash werden mit LPM oder ELPM durchgeführt. Per 
LPM ist's minimal schneller, da RAMPZ nicht initialisiert werden muss.
Siehe ELPM-Code-Beispiel (Seite 68):
http://www.atmel.com/dyn/resources/prod_documents/...
Gegenüber dem LPM-Beispiel auf Seite 91. LPM kann halt nur die unteren 
64 k adressieren.

Ein anderer Unterschied fällt mir gerade nicht ein.

Autor: Stefan Tschiggerl (stefan90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok was ich bisher herausgefunden habe ist, dass ich eine eigene Section 
für meine Variable definieren kann. Nur wie und wo sage ich dem gcc, bei 
welcher Adresse diese Section beginnt?

Ich hoffe dass mir da jemand helfen kann

mfg Stefan

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da GCC sowieso nicht direkt aufs Flash zugreifen kann, sondern 
entsprechende Zugriffsfunktionen explizit verwendet werden müssen, ist 
der Zirkus mit dem Sections bei AVR wenig ergiebig, und man kann 
genausogut direkt mit den Funktionen arbeiten:
 #define read_status()   pgm_read_byte((PGM_P)(FLASHSIZE-1))
 #define write_status(v) pgm_write_byte((PGM_P)(FLASHSIZE-1), v)

Edit: Bei Flash > 64KB müssen die "far" Versionen verwendet werden.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Tschiggerl wrote:

> Was allgemeines: in der pgmspace.h wird empfohlen, Daten im Flash
> generell in unteren 64k abzulegen. Kann mir jemand sagen warum?

Pointer sind 16 Bits breit. Mehr als 64KB können die folglich nicht 
adressieren. Für Daten jenseits von 64KB Flash müssen also 32 Bit 
Adressen explizit programmiert werden.

Autor: Stefan Tschiggerl (stefan90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define read_status()   pgm_read_byte_far((PGM_P)(FLASHSIZE-1))

kann ich damit halt das byte auslesen? wenn das Byte ja im Bereich >64k 
ist, dann geht das mit dem pointer ja nicht mehr oder?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So geht's auch oberhalb von 64KB:
  #define read_status() pgm_read_byte_far(FLASHSIZE-1)

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Stefan,

wie wär's mit der schmutzigen Methode?
Du ergänzt die .hex-Datei des Linkers händisch um einen Intelhex-Record, 
der die speicherstelle wie gewünscht beschreibt.

Etwa so, wie ich die .hex-Dateien zu Firmware und Bootloader zu einer 
gemeinsamen Datei verschmelze.
Studio progrmmiert das schnell.

ciao
Wolfgang Horn

Autor: Stefan Tschiggerl (stefan90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre sicher möglich, das jedesmal händisch zu machen, aber wenn möglich 
soll das immer bei jedem compilieren automatisch erfolgen.

Um nochmal auf Sections zurückzukommen. Ich verwende WinAVR, kann ich da 
im makefile die Startadresse einer Section definieren? nur wie schaut 
die Zeile hierfür aus?

mfg Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.