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
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.
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
@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
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 ^_^
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!
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?
@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?
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.
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.
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.
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.