mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programmende ermitteln ATmega


Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wollte mal fragen, wie es möglich ist das Ende des Programs im Flash im
Programm zu ermitteln. Brauche das, weil ich an dem Bin-File noch ein
zweites ranhängen will und das an den anderen Controller im laufenden
Betrieb übertragen will. Auch wenn ich noch nicht weiß, wie ich das
genau anstelle.

Gibt sicher mehrere Lösungsansätze. Irgendwie eine Variable oder was im
Makefile ... irgendwas, womit ich es im Programm auslesen kann.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das muß im Linker passieren, indem Du z.B. einen Zeiger auf das Ende des
Codes an konstanter Adresse ablegts wie z.B. einen INT-Vector.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, sowas in der Art.
Die einfachere Alternative: das 2. Programm von Hause aus ans Ende des
Flashs legen mit fester Startadresse.

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@crazy horse:
Die Idee ist sehr gut. Darauf wäre ich nicht gekommen. Dann muss ich
allerdings immer 2 Image Dateien mit dem Bootloader transportieren.
Eine an Adresse 0 und eine an die feste Adresse.

@Michael:
Wie kann das funktionieren? Grundsätzlich muss ich die Adresse ja
irgendwo ermitteln. Ich müsste also dem Linker sagen. Diese Variable
beispielsweise soll ans FLASH-Ende beim linken. Somit könnte ich davon
die Adresse auslesen. Aber wie definiere ich das Ende? z.B.: Mit einem
einzelnen objektfile, was nur eine Variable enthält und als letztes
gelinkt wird?

Autor: Jadeclaw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quote:""Grundsätzlich muss ich die Adresse ja irgendwo ermitteln.""
Idee: Als letztes Statement im ersten Programm ein Label samt einem .db
setzen, in etwa:
Progend: .db 0x00, 0x00
Über dieses Label bekommt man dann die Adresse, die dann vom SPM
genutzt wird.
Den Einsprungpunkt bekommt man dann gleich mitgeliefert.

Gruss
Jadeclaw.

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay ... aber wie genau lege ich fest, dass das Label auch am
Pogrammende steht?

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

@Ronny
Warum mußt du zwei Imagedateien "transportieren". Du baust deine zwei
Programme, erzeugst die zwei HEX-Dateien und baust diese beiden dann zu
einer HEX-Datei zusammen. Ich verwende für sowas dazu ein kleines
Perl-Script.

Matthias

Autor: Ronny Schulz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil ich keine Hex-Dateien nutze. Bei dem Projekt möchte ich binäre
Daten übertragen. Aber ich werde das vermutlich wirklich über feste
Bereiche machen, so wie crazy horse schon schrieb. Ich bin gerade dabei
meinen bootloader zu erweitern, sodass ich als Parameter einfach
übergebe, dass es der zweite flash ist. Die Adresse ist dann fix.

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.org 0x123 (wenn 123 die größe des Programms ist und du bei .org 0x0
angefangen hast
.db 0x00, 0x00

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei GCC ist der '.' in der Sektion 'text' der aktuelle Adresszeiger.
Wenn man als letzte Zuweisung in 'text' z.B. einfügt:
__speicher_ende = .
dann kann man auch vom C-Programm den Wert von __speicher_ende lesen.

Bei IAR kann man z.B. als letztes Code-Segment -Z(CODE)SPEICHER_ENDE
angeben und den Wert über SFE(SPEICHER_ENDE) erhalten.

Wenn Du nur binäre Dateien hast, könnte man u.U. mit einer
Holzhammermethode auf lauter FF, FF, FF,... suchen - vom Flash-Ende
beginnend. Wer wagt gewinnt :-)

Autor: Jadeclaw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ronny Schulz schrieb: ""Okay ... aber wie genau lege ich fest, dass
das Label auch am Pogrammende steht?""
Wenn man nicht innerhalb des Quelltextes mittels .org die einzelnen
Programmteile umsortiert, dann landet beim Atmel-Assembler alles in der
Reihenfolge im Binärfile, in der es auch im Quelltext steht.
(gerade noch mal probiert).
Nur kommt man nicht umhin, sich das Listfile mal anzusehen,
wo es wirklich endet, dann auf die nächste Flashrom-Seite aufzurunden
und dieses Ergebnis dann als .org-Anweisung in den Quelltext der
zweiten Datei einzusetzen, da sonst die Adressen von .db und anderer
Anweisungen nicht mehr stimmen.
Seitengrösse beim z.B. ATMega8 ist 32Words(64Bytes).

Gruss
Jadeclaw.

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.