Organisation des Flash-Speichers in C

Gast #266289
Lesenswert?

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 #266290
Lesenswert?

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 #266291
Lesenswert?

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 #266292
Lesenswert?

@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
#266293
Lesenswert?

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 #266295
Lesenswert?

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 #266296
Lesenswert?

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 #576138
Lesenswert?

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 #576502
Lesenswert?

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 #576505
Lesenswert?

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 #576515
Lesenswert?

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

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