www.mikrocontroller.net

Forum: Compiler & IDEs Symbole für Adressen im externen EEPROM


Autor: willy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

es soll sowohl das AVR-interne als auch ein externes EEPROM verwendet 
werden.

Wie kann dem Compiler beigebracht werden, dass er für z.B. EEEXT 
anstelle von EEMEM einen neuen Adressblock verwalten soll?

Dankeschön!

Autor: willy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die Lösung fast gefunden:

http://www.mail-archive.com/avr-gcc-list@nongnu.or...

Eine Frage bleibt jedoch. Welche Adresse kann ich für die neue section 
festlegen (64 kB Speicher)?

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus einem Makefile extrahiert
...
  --change-section-address .data-0x800000 \
  --change-section-address .bss-0x800000 \
  --change-section-address .noinit-0x800000 \
  --change-section-address .eeprom-0x810000 
...
Es ist also alles jenseits von 0x810000 verfügbar.

Vorschlag: 0x820000

Werner

Edit: Ich sehe gerade dass bis 840000 belegt ist, also 0x850000,
oder gleich 0xA00000.

;)

Autor: willy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Werner, danke fuer deine Hilfe!
Was ich an der Sache nicht verstehe: wie wird in diesem Fall denn aus 
einer Variable die Adresse 0? Also, in welchem Speicher ist die section 
0xA00000 und was steht an dieser Adresse? Wuerde mich freuen, wenn du 
mir mit einer Erklaerung den Linker etwas naeherbringen koenntest :-)

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist im Link aus dem zweiten Beitrag erklärt.

Ein Pointer ist beim AVR 16 Bit, kann also Werte von 0x0000 bis 0xFFFF 
annehmen. Der Compiler/Linker verwendet längere (vermute mal 32 oder 64 
Bit). Hier werden 24 Bit benötigt (0xA00000). Durch den avr-objcopy wird 
dieser Bereich aus dem erzeugten elf-Binärfile extrahiert und 
(üblicherweise) in ein hex File umgewandelt. Da hierbei nur 16 Bit 
Adressen benötigt werden (bzw. verwendet werden können), werden die 
überzähligen Bits einfach abgeschnitten.


Original:  uint32_t orgptr = 0xA01234;
Ziel:      uint16_t targptr = orgptr;   // Ergebnis = 0x1234;

Automagically ;-)

Autor: willy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!

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.