Hallo, Ich möchte eine Konstante an einer bestimmten Adresse im Flash ablegen. Wie kann ich das definieren? Hintergrund: Ich habe ein Embedded-System mit einem DOS-Rechner welcher per Bootloader ein Mikrocontroller updatetet. Ziel ist es das der Bootloader die Softwareversion aus der Hex-Datei auslesen kann und dem Nutzer diese dann anzeigt. Momentan verfahr ich so, das ich nachträglich in mein Hex-File eine neue erste Zeile einfüge und in der die Softwareversion abspeichere. weitere Infos: AVR-Mikrocontroller Codevision selbstprogrammierter Bootloader (TPascal) Gruß Daniel PS: Bitte keine Kommentare wie z.B. nimm etwas anderes wie DOS-Rechner o.ä.
Manche Compiler haben dafür proprietäre Konstrukte, wie zum Beispiel das Schlüsselwort at des Keil Compilers, das man hinter eine Variablen- oder Konstantendeklaration setzen kann. Ansonsten ist es Sache des Linkers. Schau mal in dessen Manual. Du verwendest übrigens den Begriff Bootloader irreführend. Der Bootloader sitzt in deinem µC und ermöglicht das Herunterladen des Programms. Deine TP-Applikation ist allenfalls ein "Firmware Download Werkzeug".
@Daniel wie wäre es damit, die Versionsnummer im EEPROM zu speichern? MfG Mark
Wenn ich das richtig verstanden habe, dann hat der OP folgende Konstellation: PC mit DOS-Programm, welches für das Update eines Mikrocontrollers zuständig ist. Das DOS-Programm soll beim Öffnen des HEX-Files den Inhalt parsen und die in der Firmware enthaltene Programmversion als Info anzeigen. Der Lösungsansatz war, diese Version an eine feste Adresse zu linken, um sie dort aus dem HEX-File auslesen zu können. Soweit richtig?
@mork: Eprom wäre auch eine gute Idee, aber leider benötige ich den EPProm-Bereich bei meinen Anwendungen schon (bei einer sogar komplett). Zudem müssten mehr Dateien verwaltet werden, was wiederum zu Fehler führen könnte. Denn ich habe mehrere Typen von MC im Einsatz mit unterschiedlichen Anwendungen. Zudem sind die Personen die dann mal ein Update ausführen sollen nur Leihe und haben von MC keine Ahnung. @ARM-Fan: Es ist nicht ganz ein PC mit DOS-System sondern eher ein Embedded System mit einem 386 Prozessor http://www.taskit.de/produkte/micropc/index.htm Gruß
Also wie gesagt: Beschäftige dich entweder mal mit dem Linker, oder versuchs mal mit folgendem Vorschlag: Stelle den Daten, die du aus dem HEX-File auslesen willst in deiner Mikrocontrollerapplikation eine eindeutigen/einmaligen Code, eine MagicNumber oder ähnliches voran, und such z.B: nach deren Vorkommen innerhalb des HEX-Files. Dahinter liegen dann die von dir benötigten Daten. Beispiel: typedef struct { ULONG UniqueCode; ULONG FirmwareVersion; ULONG FirmwareDate; // usw. und so fort } T_VERSION_INFO;
Hallo, definiere einfach eine Stuktur und lege im makefile eine section an:
1 | LDFLAGS += --section-start=.version=$(BOOT_VERSION) |
dann initialsiere die Struktur :
1 | volatile const struct Tversion ver __attribute__ ((section (".version"))) ={ |
2 | VERSION, |
3 | SERIAL, |
4 | ...,
|
5 | }
|
in deinem Code Kannst du einfach auf die Variable zugreifen wenn du ab der Adresse .version liest.
Für AVR-Stuio Benützer: Project -> Configuration Option -> Memory Settings Dort eine neue Section hinzufügen (siehe Bild). Achtung: Flash-Adresse wird in Word angegeben. Dann im Program:
1 | typedef struct |
2 | {
|
3 | WORD vers; |
4 | } stru_prg_version; |
5 | |
6 | #define PRG_VERSION 0x0100
|
7 | |
8 | const stru_prg_version prg_version __attribute__ ((section (".prg_version"))) = { PRG_VERSION }; |
In diesem Beispiel wird im Flash auf der Adresse 0x7FFE der Wert 00 und auf 0x7FFF 01 abgelegt. MfG
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.