Forum: Mikrocontroller und Digitale Elektronik Absolute Speicheradressierung in C


von Thomas_v2.1 (Gast)


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

von Rufus T. Firefly (Gast)


Lesenswert?

Was passiert, wenn da folgendes hingeschrieben wird?

code unsigned int max_drehzahl at 0x2000 = 0x1234;

(wäre irgendwie naheliegend, oder?)

von Peter D. (peda)


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

von Blackmike (Gast)


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

von Thomas_v2.1 (Gast)


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.

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.