Forum: Mikrocontroller und Digitale Elektronik Programmende ermitteln ATmega


von Ronny Schulz (Gast)


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.

von Michael (Gast)


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.

von crazy horse (Gast)


Lesenswert?

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

von Ronny Schulz (Gast)


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?

von Jadeclaw (Gast)


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.

von Ronny Schulz (Gast)


Lesenswert?

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

von Μαtthias W. (matthias) Benutzerseite


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

von Ronny Schulz (Gast)


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.

von Läubi (Gast)


Lesenswert?

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

von Michael (Gast)


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 :-)

von Jadeclaw (Gast)


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.

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.