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
ok, dann macht es Sinn. Wie man es macht, weiss ich aber auch nicht.
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 ^_^
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?
Weder noch. "Variablen" im Flash-ROM sind immer konstant, sie werden nicht beschrieben.
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.