Forum: Mikrocontroller und Digitale Elektronik ATMEGA128 Texte im Bootsektor definieren


von Karli (Gast)


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!

von Arduinoquäler (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Arduinoquäler (Gast)


Lesenswert?

... oh shit (Frau Schmidt) ....

von Karli (Gast)


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.

von Karli (Gast)


Lesenswert?

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.

von Arduinoquäler (Gast)


Angehängte Dateien:

Lesenswert?

Karli schrieb:
> wie man denn einen solchen Text (für den GNU-Compiler)
> definiert.

So etwa wie im angehängten Beispiel-Programm.

von Karli (Gast)


Lesenswert?

Was bedeutet die Zahl "32767" im ersten Beispiel?
const char PROGMEM bigblock0[32767] =

von Arduinoquäler (Gast)


Lesenswert?

Karli schrieb:
> Was bedeutet die Zahl "32767" im ersten Beispiel?

Das ist jetzt aber nicht dein Ernst?

von Karli (Gast)


Lesenswert?

Leider ja;
32767 kommt mir ja bekannt vor.
Bei 65k hätte ich einen Offset vermutet, aber bei der Hälfte?

von Karli (Gast)


Lesenswert?

An Arduinoquäler:
Ich probier's aus. Muss heute leider Schluss machen.
Danke für die Hilfe!

von Flo (Gast)


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

von Flo (Gast)


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

von Arduinoquäler (Gast)


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 ....

von Arduinoquäler (Gast)


Lesenswert?

... 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.

von Arduinoquäler (Gast)


Lesenswert?

Karli schrieb:
> aber bei der Hälfte?

Grössere Blöcke lässt der GCC in meiner Version nicht zu.

von Karli (Gast)


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

von Arduinoquäler (Gast)


Lesenswert?

Karli schrieb:
> Und da hänge ich fest.

Dann zeig doch mal wo du hängst.

von Arduinoquäler (Gast)


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.

von Karli (Gast)


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...

von Karli (Gast)


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.

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
Noch kein Account? Hier anmelden.