mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Absolute Speicheradressierung in C


Autor: Thomas_v2.1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte bei einem 8051 Controller (genauer: 89C51RD2 von Philips)
mit Flash-ROM einige Variablen an einem bestimmten Speicherplatz im
Flash ablegen.
Weil das Flash-ROM blockweise gelöscht werden kann, möchte ich bei
änderung an mehreren Konstanten nicht das ganze Programm neu einspielen
sondern nur die Variablen.
In C selber gibt es für diese Adressierung ja keine Funktionen, aber
der Keil C-Compiler bietet dafür ja das at Keyword.

Ich habe dann so eine Zeile:

code unsigned int max_drehzahl at 0x2000;

Jetzt möchte ich der max_drehzahl aber auch gleich einen Wert zuweisen
der an diese Stelle im Flash gespeichert wird. In den Keil Dokumenten
steht alles nur mit Adressierung im RAM.

Wer weiß wie's geht??

MfG
Thomas

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was passiert, wenn da folgendes hingeschrieben wird?

code unsigned int max_drehzahl at 0x2000 = 0x1234;

(wäre irgendwie naheliegend, oder?)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um Werte im Flash abzulegen, mußt Du sie als code deklarieren.

Um sie nun an eine bestimmete Stelle zu schreiben, mußt Du sie in einem
eigenen Sourcefile anlegen und dann dem Linker sagen, wo er es hinpacken
soll.

Z.B. wird hiermit das Datenfeld im Objekt VERSION.C nach 0x0100 gelinkt
 und alles andere nach 0x0000:

CO (0000H, ?CO?VERSION(0100H))


Ansonsten, die Keil Webseite enthält zu fast allen Fragen sehr gute
Antworten.


Peter

Autor: Blackmike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum denn ins flash?

hat der RD2 nicht eh 2K Eprom Speicher?
bin jetzt wohl nicht ganz sicher obs die von Atmel oder von Temic
sind....

Autor: Thomas_v2.1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die direkte Zuweisung funktioniert nicht wenn ein at davorsteht
(so habe ich mir das ja auch auch am einfachsten gedacht).
Aber der Tip von Peter war gut, die Lösung die ich jetzt habe ist recht
Keil-spezifisch:
-Die Variable mit:

const unsigned int code max_drehzahl = 2000;

definieren

-In den Linker-Optionen BL51Locate in die Zeile für Code:

?CO?programmname(0x2000)

Denn werden alle mit code definierten Variablen der Reihe nach ab
0x2000 abgelegt.
Aber ich hätte das gerne so gehabt, dass ich jeder Variablen explizit
den Speicherplatz zuweisen kann wie mit dem at.

PS: Die Keil-Webseite ist wirklich gut, allerdings ist die Suchfunktion
sehr grob wie ich finde.

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.