mikrocontroller.net

Forum: Compiler & IDEs Variable an fixer Flash-Adresse


Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich arbeite mit dem neuesten winavr mit dem ATmega32.

Ich würde gerne eine String Variable an eine fixe Adresse im Flash 
legen. Ziel soll sein, diese Variable aus dem dann erzeugtem *.hex file 
eindeutig auslesen zu können.(z.B. mit einem Windows Programm)
Dabei soll sich aber die .text section prinzipiell nicht ändern. Die 
.text section soll also um die Variable rumgebaut werden.
Bsp.: Der String "Testplatine V1.4" soll an der Flash-Adresse 0x0100 
landen.
Vorher und nacher soll wieder "normaler" Programmcode stehen.

Geht das überhaupt?

MfG Tobi

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Geht das überhaupt?

Da WinAVR nur ein vornehmer Name fuer ein gcc Derviat ist und du dazu
den Source hast geht natuerlich alles. Die Frage ist nur ob du es
kannst. :-)

Ohne es jetzt schonmal gemacht zu haben wuerde ich vermutlich das
Linkescript ueberarbeiten und dort eine neue Section mit dem Namen
Tobi an deiner Wunschadresse einfuegen.

Eine andere Vorgehensweise waere natuerlich wenn du eine MagicNumber in 
deinen Source einfuegst und dafuer sorgst das deine Daten immer danach 
stehen. Dann brauchst du nur das Hex danach zu durchsuchen.

Olaf

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
,,um die Variable ... herum'' ist als Konzept im Linker nicht
vorgesehen.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Danke für die Antworten.
Das Problem mit den neuen Sections ist halt, dass die dann mit .text 
kollidieren. Und ans Ende des Flashes will ich die Variable nich legen, 
da das ja bei jedem Prozessor anders ist.

Kann man denn dann die section .text aufteilen? Es gibt ja wohl eine 
section.vectors, die sich in .text verbirgt. Man könnte ja zwischen 
.vectors und den restlichem Code in .text eine Variable plazieren. Man 
hätte dann erst die Interruptvektoren, dann z.B. ein kleine Lücke, dann 
die Variable und nach wieder einen kleinen Lücke den restlichen .text 
Teil.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon probiert die fragliche Variable mit PROGMEM zu definieren? Für 
mich sieht der folgende Ausschnitt in dem Linkercontrolscript avr5.x so 
aus, als ob PROGMEM Variablen zwischen den Vektoren und dem Hauptcode 
stehen. Und das wäre ja berechenbar

...
  .text :
  {
    *(.vectors)
    KEEP(*(.vectors))
    /* For data that needs to reside in the lower 64k of progmem.  */
    *(.progmem.gcc*)
    *(.progmem*)
    . = ALIGN(2);
     __trampolines_start = . ;
    /* The jump trampolines for the 16-bit limited relocs will reside here.  */

...

Anderer IMHO sauberer Ansatz: Wie wäre es mit Ablage der Daten im 
EEPROM?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum solche Klimmzüge ?

Such im Hexfile einfach nach "Testplatine"
und lies die Version die dann folgt.
Ist doch völlig wurscht WO der String steht.
Dein Programm muss nur intelligent genug sein
das Hexfile zu durchsuchen. So schwer ist das nicht
zu programmieren.

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI!

Danke!

Nur:
Das Ganze soll für verschiedene AVR Prozessoren funktionieren. Und das 
ist im *.hex File ja nicht abgelegt. Also gibts Probleme mit PROGMEM. 
Wie soll das Windows Programm dann die Adresse berechnen?

Der String soll eine ID darstellen. Die ist für jedes Projekt anders. 
Also kann ich nicht nach einem bestimmten string suchen. Außer ich würde 
ein Identifizierungszeichen ala "ID:" einstetzen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Außer ich würde ein Identifizierungszeichen ala "ID:" einstetzen.

Genau das ist der richtige Weg. Ich würde statt "ID:" aber
was längeres nehmen: "Identifikation:" z.B.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht erklärst du mal genauer, was du machen willst bevor die 
Werkzeuge zusammengesucht werden ;-)

Ich dachte es geht um einen

> Ich arbeite mit dem neuesten winavr mit dem ATmega32.

Wie passt das mit

> Das Ganze soll für verschiedene AVR Prozessoren funktionieren.

zusammen?

Wenn du unterschiedliche AVRs hast, solltest du auch für jeden Typ das 
Programm neu kompilieren. Es gibt nicht aus Jux und Dollerei viele 
verschiedene Includefiles und Linkerskripte... Und wenn du das machst, 
erhälst du zwangsläufig neue HEX-Files.

Das Auseinanderhalten vieler Hex-Files für viele unterschiedliche AVRs 
und viele unterschiedliche Projekte kann man durch eine Ordnerstuktur 
bei der Ablage/"Lagerhaltung" oder durch intelligente, automatisierte 
Namensgebung z.B. im Makefile erledigen. Du hast doch z.B. den µC Namen 
als Variable MCU. Nutze die doch.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobi wrote:

> Das Problem mit den neuen Sections ist halt, dass die dann mit .text
> kollidieren. Und ans Ende des Flashes will ich die Variable nich legen,
> da das ja bei jedem Prozessor anders ist.

Es wäre aber zumindest einheitlich auf den höchsten Adressen des
Hexfiles dann.  Das sollte nicht so schwer zu finden sein.

Die Größe der Interruptvektortabelle differiert zwischen den einzelnen
AVRs noch viel mehr und in viel diffizilerer Weise als die des Flash,
es zwischen Vektoren und Code zu legen, wird dir also auch kaum was
bringen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger wrote:

>>Außer ich würde ein Identifizierungszeichen ala "ID:" einstetzen.
>
> Genau das ist der richtige Weg. Ich würde statt "ID:" aber
> was längeres nehmen: "Identifikation:" z.B.

Oder $Id: ... $, dann kann man das Tool "ident" auf die Binärversion
des ROM-Images loslassen...

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi nochmal!

Vielen Dank für die Hilfe!

Ich werde es mit einem Identifizierungsstring machen! Das scheint mir 
die sauberste Lösung zu sein!

MfG Tobi

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.