Organisation des Flash-Speichers in C

Gast #266289
Hallo,
weiß jmd., wie ich in C einen Flash-Speicher organisiere? Ich benutze
einen AT89C5131A-L (ATMEL)-Mikrocontroller und programmiere diesen zur
Zeit mit der Keil-Entwicklungsumgebung. Mein Plan ist es, Daten im
hinteren Teil des Speichers (32k)zu hinterlegen. Zur Zeit wird das
komplette Programm einfach an den Anfang des Speichers geschrieben...
Wie kann ich also in C bestimmen wohin welcher Teil des Programms
geschrieben wird, bzw. gibt es da überhaupt Befehle für?

Vielen Dank,

Timo
Gast
einer der Vorteile eines Compilers ist doch, die Verwaltung von Adressen
diesem auch zu überlassen, sprich sich nicht drum kümmern müssen. Dir
kann es doch völlig egal sein, wo die Daten stehen - Hauptsache, das
Programm findet sie. Sobald du anfängst, darin herumzuwurschteln, kann
es nur schlechter werden.
Gast
Derartige Funktionen oder konstante Daten müssen als ein separates
Object geschrieben werden und dann kannst Du dem Linker sagen, wo er
dieses Object plazieren soll.

Z.B. plaziere ich einen Versionstext (version.c) immer an die Adresse
0x100:

?CO?VERSION(0100H))


Peter
Gast
@crazy horse:
so einfach ist das leider nicht. die Tabelle wird, auch nachdem der
Controller Programmiert ist verändert. Sie kann z.B. auch ihre Größe
ändern. Dazu versetze ich den Controller in einen "Programmiermodus"
und schreibe die Tabelle über einen selbstgebastelten Bus neu. In der
Tabelle sind Befehle hinterlegt, die anschließend durch bestimmte
Ereignisse ausgeführt werden.
@Peter:
kannst du deinen Vorschlag evtl. nochmal konkretisieren? bzw. ist das
ein C-Befehl, der mir den Versionstext dann an 100h schreibt?
Danke
Das ist ein Linker-Schalter, der muß also bei den Linker-Optionen mit
eingetragen werden.

Anstelle "VERSION" kommt dann eben der Name Deines Objectes und Du
kannst natürlich auch mehrere davon angeben.

Der Compiler hat damit nichts am Hut, der compiliert alles variabel.


Peter
Gast
Mit gcc-klones geht das so:
du packst die Versionsvariable in eine extra Section:
1
int version __attribute__ ((section (".mySection"))) = 12;
jetzt musst du nur dem Linker sagen, wo diese Sektion anfängt:
-Xlinker -section-start=.mySection=0x42

ist ganz praktisch, wenn man einen Bootloader verwendet, dann kann er
nämlich dem Benutzer vorher sagen, welche Version der SW schon drin
ist

viel Spass ^_^
Gast
aaargh, diese code-tags sind wohl auch noch nicht ausgereift :(
was ich meinte ist:
int version _attribute_ ((section (".mySection"))) = 12;
zwei Unterstriche vorne und hinten, keine <u>-dinger!
Gast
Sorry dass ich dieses alte Thema nochmal aufgreife.

Aber ich verstehe nicht ganz, wie man eine Variable in Flash-ROM 
deklarieren kann. Bei externen Flash-Bausteinen benötigt man doch 
bestimmte Code-Sequenzen, um auf dieses schreibend zugreifen zu können. 
Es ist also kein Umgang wie bei RAM-Variablen möglich. Wie kann dann der 
Compiler dort Speicherplatz reservieren?

Oder wird hier vom internen Flash des AVR gesprochen, und der kann 
einfach so angesprochen werden?

Gast
@Rufus

Sie werden aber initialisiert. Wie soll der Compiler dass bei einem 
Flash-ROM  bewerkstelligen, wenn er nicht die Kommando-Sequenzen zum 
Programmieren des selben kennt?
Persönliche Seite
Die Initialisierung erfolgt dadurch, daß ein Codeblock generiert wird, 
der bereits die korrekten Werte enthält. Der wird dann genauso wie der 
eigentliche Programmcode zum ins Flash zu ladende Programm gelinkt.
Damit sind die "Variablen" bereits initialisiert, bevor der Prozessor 
auch nur eine einzige Maschineninstruktion ausgeführt hat.
Gast
Verstehe ich nicht. Wenn die Daten im externen Flash stehen sollen, 
müssen Kommando-Sequenzen ausgeführt werden. Wenn die der Compiler nicht 
kennt, kann er auch keine Daten in das Flash schreiben.
Gast
Anscheinend redest Du hier vom Flash eines AVR, ich spreche aber von 
einem externen Flash-Baustein den der Compiler nicht einfach 
programmieren kann.

Auch um das Programm in den Flash zu schreiben, muss eine externe 
Routine bemüht werden.
Persönliche Seite
Es ist vollkommen wurscht, ob das Programm in einem externen Flash-ROM, 
in einem maskenprogrammierten ROM, einem EPROM oder dem µC-internen 
Flash-ROM steht - für das Übertragen des Programmes in das ROM ist nicht 
der Compiler zuständig. Und auch kein vom Compiler erzeugter Code.
Aber bereits mit dem Übertragen des Programmes in das ROM sind die darin 
stehenden (unveränderlichen) Variablen bereits initialisiert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.