Forum: Mikrocontroller und Digitale Elektronik ATMEGA: modifizierter Startup-code unter Microchip Studio 7


von Michael K. (mikr)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Code vor Main kannst Du in .initN legen:

https://www.nongnu.org/avr-libc/user-manual/mem_sections.html

von Peter D. (peda)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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...

von Michael K. (mikr)


Lesenswert?

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.

von EAF (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.