mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA128 Texte im Bootsektor definieren


Autor: Karli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oh shit (Frau Schmidt) ....

Autor: Karli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arduinoquäler (Gast)
Datum:
Angehängte Dateien:

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

So etwa wie im angehängten Beispiel-Programm.

Autor: Karli (Gast)
Datum:

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

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karli schrieb:
> Was bedeutet die Zahl "32767" im ersten Beispiel?

Das ist jetzt aber nicht dein Ernst?

Autor: Karli (Gast)
Datum:

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

Autor: Karli (Gast)
Datum:

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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ....

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karli schrieb:
> aber bei der Hälfte?

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

Autor: Karli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karli schrieb:
> Und da hänge ich fest.

Dann zeig doch mal wo du hängst.

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.