Absolute Speicheradressierung in C

Gast #125149
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
#125151
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
Gast #125153
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren