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.
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.
ja, sowas in der Art. Die einfachere Alternative: das 2. Programm von Hause aus ans Ende des Flashs legen mit fester Startadresse.
@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?
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.
Okay ... aber wie genau lege ich fest, dass das Label auch am Pogrammende steht?
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
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.
.org 0x123 (wenn 123 die größe des Programms ist und du bei .org 0x0 angefangen hast .db 0x00, 0x00
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.