www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C: Speicher des AT91SAM7P256 als char Array ansprechen


Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo NG,

wie mache ich denn sowas in der Art:

unsigned char memory[0x10000] @ 0x202000;

So dass wenn ich z.B.

memory[1] = 0xff;

im Programm schreibe dann effektiv an 0x202001 der Wert 255 geschrieben 
wird?

Vielen Dank für jeden Tip!
Peter

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz einfach:
unsigned char *memory = 0x202000;

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas B.,

kannst Du mir bitte noch sagen, ob es auch möglich ist, bestimmte Daten 
schon beim Compilieren an die richtige Stelle zu legen

z.B.

unsigned char* = "hallo welt" @ 0x203000;

so dass der Compiler den Text automatisch in der Binärdatei an Offset 
0x1000 hängt, falls der Programmstart bei 0x202000. Also wenn ich die 
bin-Datei nach 0x202000 lade automatisch bei 0x203000 "hallo welt" 
steht.

Danke schon mal.
Peter

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ob es auch möglich ist, bestimmte Daten
> schon beim Compilieren an die richtige Stelle zu legen

Das ist möglich, wird aber in der Regel über ein Linkerskript 
erledigt. Näheres steht in der Dokumentation des C-Compilers.

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wird dann schon komplizierter, das muss man im Linker Script 
einstellen. Der Compiler allein kann das nicht, wenn mehrere 
Quelldateien gelinkt werden bzw. nur, wenn die Datei mit der speziellen 
Variable an erster Stelle gelinkt wird. Und dann ist RAM-Start bis 
Adresse der Variablen verschwendet.

Also: Ist das überhaupt nötig und den Aufwand wert?


Kurz zusammengefasst wäre es nötig, die Variable in eine spezielle 
Sektion zu legen — etwa mit __attribute__((section(".data.helloworld"))) 
im Fall gcc/binutils — und im Script dieser Sektion die richtige Adresse 
zuzuweisen. Dann bleibt noch die Frage, ob ins .data integrieren (dann 
wird der Abstand aufgefüllt, Startup-Code bleibt gleich) oder nicht 
(Startup muss modifiziert werden, dafür braucht man im ROM keinen Platz 
für Füllbytes). In beiden Fällen bleibt das Problem, dass es nicht passt 
wenn das restliche .data nicht zwischen Anfang und Variable passt…

Also doch etwas komplizierter.

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.