Forum: Compiler & IDEs Constante an entsprechender Adresse im Flash ablegen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Daniel (Gast)


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.ä.

von ARM-Fan (Gast)


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".

von mork (Gast)


Lesenswert?

@Daniel

wie wäre es damit, die Versionsnummer im EEPROM zu speichern?

MfG Mark

von ARM-Fan (Gast)


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?

von Daniel (Gast)


Lesenswert?

@ARM-Fan: ja, richtig erkannt.

Gruß Daniel

von Daniel (Gast)


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ß

von ARM-Fan (Gast)


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;

von Sebastian____ (Gast)


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.

von Mehmet K. (mkmk)


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

von Mehmet K. (mkmk)


Angehängte Dateien:

Lesenswert?

Sorry, Bild vergessen

von ... .. (docean) Benutzerseite


Lesenswert?

nix bild :D

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
Noch kein Account? Hier anmelden.