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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.