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!
Karli schrieb: > Im Bootcode des ATMEGA128 müssen für den Lesezugriff Befehle wie > pgm_read_byte_far(cp) mit 32-Bit-Adressen verwendet werden. Die Pointer-Arithmetik reicht doch für 64K Worte = 128 KBytes. Far bräuchte man erst für den ATMega256 etc.
Hi
>Die Pointer-Arithmetik reicht doch für 64K Worte = 128 KBytes.
Auf Strings wird aber byteweise mit ELPM zugegriffen. Und ELPM benötigt
bei 64..128K 17Bits als Zeiger.
MfG Spess
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.
Ja, die Entsprechung für ELPM ist pgm_read_byte_far(), und mich interessiert brennend, wie man denn einen solchen Text (für den GNU-Compiler) definiert.
Karli schrieb: > wie man denn einen solchen Text (für den GNU-Compiler) > definiert. So etwa wie im angehängten Beispiel-Programm.
Was bedeutet die Zahl "32767" im ersten Beispiel? const char PROGMEM bigblock0[32767] =
Karli schrieb: > Was bedeutet die Zahl "32767" im ersten Beispiel? Das ist jetzt aber nicht dein Ernst?
Leider ja; 32767 kommt mir ja bekannt vor. Bei 65k hätte ich einen Offset vermutet, aber bei der Hälfte?
An Arduinoquäler: Ich probier's aus. Muss heute leider Schluss machen. Danke für die Hilfe!
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
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
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 ....
... das genügt um nachzuweisen dass die Pointer-Arithmetik funktioniert. Flo schrieb: > in dem man die Variable mit dem Zusatz "__attribute__ > ((section (".bootloader")))" definiert. Das muss man für den übrigen Code ja sowieso tun.
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
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.
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...
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.
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.