www.mikrocontroller.net

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


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.ä.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Daniel

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

MfG Mark

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ARM-Fan: ja, richtig erkannt.

Gruß Daniel

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Sebastian____ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
definiere einfach eine Stuktur  und lege im makefile eine section an:
LDFLAGS += --section-start=.version=$(BOOT_VERSION)

dann initialsiere die Struktur :
volatile const struct Tversion ver __attribute__ ((section (".version"))) ={
  VERSION,
  SERIAL,
  ...,
}

in deinem Code Kannst du einfach auf die Variable zugreifen wenn du ab 
der Adresse .version liest.

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef struct 
{
  WORD vers; 
} stru_prg_version;

#define PRG_VERSION 0x0100

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

Autor: Mehmet Kendi (mkmk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, Bild vergessen

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nix bild :D

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.