Programmende ermitteln ATmega

Gast #270045
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.
Gast #270048
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?
Gast #270049
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.
Gast #270052
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.
Gast #270054
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 :-)
Gast #270055
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.