ATMEGA128 Texte im Bootsektor definieren

Gast #4713064
Lesenswert?

Im Bootcode des ATMEGA128 müssen für den Lesezugriff Befehle wie 
pgm_read_byte_far(cp) mit 32-Bit-Adressen verwendet werden.

Die für den unteren 64k-Bereich verwendeten Textdefinitionen wie z.B.

const prog_char bootmsg[] = "ATMEGA128 Bootloader";

funktionieren nicht, und der Compiler warnt auch wegen unpassender 
Datentypen:

 warning: cast from pointer to integer of different size

Wie müssen im oberen Flash solche Textstrings definiert werden?

Danke im Voraus für mögliche Hilfe!
Gast #4713125
Lesenswert?

nein,
der Befehl pgm_read_byte () für das Lesen von Flash-Bytes benutzt LPM 
und kann nur im Bytebereich bis 64k lesen.
Für den Bootloader, der ab Byteadresse 0x1F000 begint, muss der 
ELPM-Befehl bzw. pgm_read_byte_far() verwendet werden.
Gast #4713171
Lesenswert?

Arduinoquäler schrieb:
> Das ist jetzt aber nicht dein Ernst?

Dein Beispiel aber hoffen auch nicht, oder? Ich muss doch vorher wissen 
wo die Variable im Speicher landet. Das ist doch bei deinem Beispiel gar 
nicht sichergestellt wo die landet.

Die Variable die den Text enthält muss in die Bootloader Section. Beim 
avr-gcc geht das in dem man die Variable mit dem Zusatz "__attribute__ 
((section (".bootloader")))" definiert.

Genaue Syntax bitte selber nachschlagen.

Gruss,
Flo
Gast #4713172
Lesenswert?

Arduinoquäler schrieb:
> Das ist jetzt aber nicht dein Ernst?

Dein Beispiel aber hoffentlich auch nicht, oder? Ich muss doch vorher 
wissen wo die Variable im Speicher landet. Das ist doch bei deinem 
Beispiel gar nicht sichergestellt wo die landet.

Die Variable die den Text enthält muss in die Bootloader Section. Beim 
avr-gcc geht das in dem man die Variable mit dem Zusatz "__attribute__ 
((section (".bootloader")))" definiert.

Genaue Syntax bitte selber nachschlagen.

Gruss,
Flo
Gast #4713190
Lesenswert?

Flo schrieb:
> Dein Beispiel aber hoffen auch nicht, oder?

Es werde vier Blöcke angelegt und damit der Speicher möglichst
(fast) voll ausgefüllt. Ein Rest muss für main() übrigbleiben.
Nach der Map ist der Block 3 im obersten Speicherbereich, nämlich
da wo sonst der Bootloader sitzt ....
Gast #4715331
Lesenswert?

Ja,
die prinzipielle Anweisung ist im avr-libc-user-manual.pdf, Kapitel 22, 
nachzulesen. Soweit war ich auch schon.
Aber wenn man das nicht korrekt macht, akzeptiert es der Compiler nicht. 
Und da hänge ich fest.

Ein Beispiel wäre sehr hilfreich. Ich Wundere mich, dass anscheinend 
viele den Bootloader benutzen, aber niemand dabei ein Stück Text an eine 
Konsole o.ä. ausgibt.

Vielleicht findet sich doch ein entsprechendes Stück Code im 64k+ 
Flash-Bereich.

Danke im Voraus
Karli
Gast #4715430
Lesenswert?

Karli schrieb:
> Ich Wundere mich, dass anscheinend
> viele den Bootloader benutzen, aber niemand dabei ein Stück Text an eine
> Konsole o.ä. ausgibt.

... was auch nicht soviel Sinn macht.

Denn die "Konsole" ist das Teil das den Code zum Flashen
schickt, und die kann mit einer Message vom Bootloader
nun mal herzlich wenig anfangen. Denn die ist es ja die
was sendet, und auf eine Reaktion des Bootloaders wartet.
Gast #4715841
Lesenswert?

Es mag ja viele Möglichkeiten geben, auch extrem spartanische, wo der 
Bootloader vielleicht nur zur Adresse Null springt;
Ich benötige die Kommunikation zur Auswahl des zu ladenden Files via 
XMODEM, ich will eine Erfüllungsmeldung sehen und auch eine optionale 
Verifikation durchführen.
Dazu wird nun mal Text gebraucht...
Gast #4715855
Lesenswert?

Antwort 2:
Ich möchte nicht erklärt bekommen, wie ich meine Absicht, im Bootbereich 
bzw. im Bootloader (der dort residiert) Texte zu definieren, umschiffen 
kann.
Ich benötige schlicht ein Beispiel für eine Textdefinition in diesem 
Speicherbereich.

Im unteren Speicherbereich lauteten diese beispielhaft so:

const prog_char bootmsg[] = "ATMEGA324 Bootloader";
bootmsg wird als 16Bit-Adresse übersetzt.

Im 64k+-Bereich habe ich es noch nicht geschafft, die Bootmessage als 
32Bit-Adresse zu definieren.

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