mikrocontroller.net

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


Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: cazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: cazy horse (Gast)
Datum:

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

Autor: gion toji (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit gcc-klones geht das so:
du packst die Versionsvariable in eine extra Section:
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 ^_^

Autor: gion toji (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: TechInfo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?


Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: TechInfo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alois (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alois (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.