Hallo, ich habe ein Problem mit einem modifizierten Startup-Code für einen ATMEGA644PA. Ich möchte unmittelbar nach einem Reset ein paar Assembler Befehle ausführen, also bevor der Prozessor und die Laufzeitbibliothek initialisiert werden. Folgendes habe ich probiert: 1.) Den zunächst noch unveränderten Original Startup-Code gcrt1.S in das Projekt eingefügt und "-nostarfiles" bei den Linkeroptionen angegeben. Schon das funktioniert leider nicht. Das Mapfile zeigt, daß er falsche Startadressen und falsche Längen für die Speicherbereiche nimmt (text: Origin 0x00000000 lenght: 0x00020000, data: Origin 0x00800000 lenght: 0x0000ffa0, eeprom: Origin 0x00810000 lenght: 0x00010000 statt: text: Origin 0x00000000 lenght: 0x00010000, data: Origin 0x00800100 lenght: 0x00001000, eeprom: Origin 0x00810000 lenght: 0x00000800). Woher nimmt er diese Werte überhaupt und wie kann ich die überschreiben? 2.) Der elegantere Weg wäre wohl, die Originalkonfiguration zu behalten und stattdessen einen eigenen Code mit dem globalen Label __init zu versehen. Der ist im Startup-Code als weak definiert und kann vom User-Code gekapert werden. Das funktioniert gut und wäre wirklich elegant, wenn ich nach meinen eigenen Zeilen wieder zum Original-__init im Startup-Code springen könnte. Aber den habe ich ja gerade gekapert. Was kann ich denn da machen? Hintergrund der Änderung: Ich möchte als allererste Aktion erkennen, wer den Reset ausgelöst hat und entsprechend verzweigen. Der Grund ist folgender: ab der Adresse 0 im Flash steht meine Applikation, ab Word-Adresse 0x7000 der Bootloader. Die Fuses sind so programmiert, daß er nach einem Reset in den Bootloader springt. Das soll er aber nur bei einem echten Kaltstart, also einem Power-on Reset. Ein Watchdog-Reset soll von der Applikation behandelt werden. Wenn ich den Startup-Code des Bootloaders durchlaufe und erst in main() verzweige, werden aber einige meiner Ram Inhalte gelöscht, die in der ".noinit"-Section der Applikation stehen. Ich weiß, es gäbe den ein oder anderen Workaround, aber es muß doch auch so gehen, oder nicht? Vielen Dank vorab für jeden hilfreichen Vorschlag. Michael
Code vor Main kannst Du in .initN legen: https://www.nongnu.org/avr-libc/user-manual/mem_sections.html
Michael K. schrieb: > Ich möchte als allererste Aktion erkennen, wer den Reset ausgelöst hat Hier ist ein Beispiel, um MCUSR zu sichern: https://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html
Michael K. schrieb: > ich habe ein Problem mit einem modifizierten Startup-Code für einen > ATMEGA644PA. Ich möchte unmittelbar nach einem Reset ein paar Assembler > Befehle ausführen, also bevor der Prozessor und die Laufzeitbibliothek > initialisiert werden. LOL. Ist immer wieder erheiternd, etwas über Probleme zu lesen, die man in pure ASM einfach nicht hat...
Peter D. schrieb: >> Ich möchte als allererste Aktion erkennen, wer den Reset ausgelöst hat > > Hier ist ein Beispiel, um MCUSR zu sichern: > > https://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html Bingo, das ist es. Vielen Dank Peter, es funktioniert! An genau der Stelle war ich gestern im Manual, "Weakly bound to __init()". Dann hat's aber nicht mehr gereicht, von dem Label __init auf die section zu abstrahieren. Sorry, war wohl zu spät am Abend.
c-hater schrieb: > Ist immer wieder erheiternd, etwas über Probleme zu lesen, die man in > pure ASM einfach nicht hat... Ja, Mobby, ist immer wieder lustig, wie schnell du überfordert bist.
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.