Constante an entsprechender Adresse im Flash ablegen

Gast #1318579
Lesenswert?

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.ä.
Gast #1319049
Lesenswert?

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".
Gast #1319651
Lesenswert?

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?
Gast #1319819
Lesenswert?

@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ß
Gast #1319870
Lesenswert?

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;
Gast #1323544
Lesenswert?

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.
#1453079
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren