Forum: Mikrocontroller und Digitale Elektronik Organisation des Flash-Speichers in C


von Timo (Gast)


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

von cazy horse (Gast)


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.

von Peter Dannegger (Gast)


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

von Timo (Gast)


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

von Peter D. (peda)


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

von cazy horse (Gast)


Lesenswert?

ok, dann macht es Sinn.
Wie man es macht, weiss ich aber auch nicht.

von gion toji (Gast)


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 ^_^

von gion toji (Gast)


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!

von TechInfo (Gast)


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?


von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Weder noch. "Variablen" im Flash-ROM sind immer konstant, sie werden 
nicht beschrieben.

von TechInfo (Gast)


Lesenswert?

@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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Alois (Gast)


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.

von Alois (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

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.