Wo finde ich Low-Level-Initialisierungscode bei AVR-MCUs?

Gast #3296681
Lesenswert?

Hi Community,

wo finde ich bei meiner AVR-MCU den Low-Level-Initialisierungscode, der 
gleich nach dem Systemstart, also nach der ResetException, ausgeführt 
wird? D.h. der Code, der beispielsweise .data mit den entsprechenden 
Werten initialisiert und .bss mit 0, der die PLLs initialisiert und so 
weiter. Bisher habe ich mir da noch keine großen Gedanken gemacht, da es 
immer funktioniert hat. Aber jetzt verwende ich zusätzlich eine 
ARM-basierte Plattform (ATSAM3S4) und da gibt es von Atmel extra eine 
board_cstartup_gnu.c, in der die ResetException implementiert ist. Dort 
wird dann zunächst eine LowLevelInit-Funktion aufgerufen, in der unter 
anderem die PLLs initialisiert werden, dann werden .data und .bss 
initialisiert und schließlich wird explizit die main-Funktion 
aufgerufen. Ich nehme mal an der Ablauf beim AVR wird ähnlich sein. Aber 
wo finde ich die entsprechende Implementierung? Vielen Dank schon mal.
Gast #3296739
Lesenswert?

Jo, es ist ein ATmega1281. Auch wenn er keine PLL hat, wird ja 
vermutlich auch der RC-Oszillator eine Art Initialisierung brauchen. In 
dem erwähnten LowLevelInit-Code des ATSAM3S4 steht beispielsweise auch 
so etwas:

"Switch to 3-20MHz Xtal oscillator".

Sowas muss doch bei meinem ATmega1281 auch passieren? Auf jeden Fall 
müssen aber .data und .bss initialisiert werden, oder nicht?
Gast #3296743
Lesenswert?

ORB schrieb:
> Was muß den bei den Megas und Tinys initialisiert werden?
Stackpointer, globale Variablen?

Vermutlich gibt es in der libc o.ä. irgendwo einen Startupcode, das mit 
der .lss ist da schon eine gute Idee. Ansonsten in die Doku des 
Compilers gucken...
Moderator Persönliche Seite #3296758
Lesenswert?

spess53 schrieb:
>> Jo, es ist ein ATmega1281. Auch wenn er keine PLL hat, wird ja
>> vermutlich auch der RC-Oszillator eine Art Initialisierung brauchen.
>
> Nein, braucht er nicht.

Wenn überhaupt, dann würde man höchstens den clock prescaler in
CLKPR passend einstellen, dafür gibt's aber in <avr/power.h> die
passenden Funktionen (die sich auch um die timing constraints
kümmern), und es reicht in aller Regel völlig aus, wenn man dies
einfach am Anfang von main() erledigt.

Der Startup-Code steht in der avr-libc in crt1/gcrt1.S.  Diese
Datei wird für jeden unterstützten Controllertyp einmal assembliert
und dann als Bestandteil der binären Bibliotheks-Distribution mit
ausgeliefert.
Gast #3296792
Lesenswert?

Hi

>Wenn überhaupt, dann würde man höchstens den clock prescaler in
>CLKPR passend einstellen,...

CLKPR gehört zum gesamten Clocksystem und nicht speziell zum 
RC-Oszillator.

Wenn du an dem rumfummeln willst ist OSCCAL die richtige Adresse.

MfG Spess
Gast #3296816
Lesenswert?

So weit mir bekannt, fummelt der C-Compiler nicht am Prozessor rum.
Der C-Compiler hat zwar etwas versteckten Code, der beim Start 
automatisch eingefügt und ausgeführt wird, aber da geht es um 
Initialisierung der C-Umgebung und des Stacks. An den 
Prozessoreinstellungen, einschließlich der Fuses, darfst nur Du 
rumfummeln.
Nach einem Reset oder dem Einschalten hat jeder Prozessor defaults, mit 
denen er laufen kann - ist ja auch logisch.
Sollten diese Dir nicht passen, so kannst Du sie ja ändern - ist ja 
sogar üblich. Der Compiler darf das aber nicht.

Anders sieht es bei einer komplexen Laufzeitumgebung aus. Der Arduino 
zum Bleistift, klaut Dir am Anfang glatt 'nen ganzen Timer für seine 
Millisekundenmessung und was sonst noch so benötigt wird.
Moderator Persönliche Seite #3296851
Lesenswert?

Peter Dannegger schrieb:
> Nein, beim AVR lassen sich die Taktquellen nicht zur Laufzeit auswählen.

Beim Xmega schon (ist ja letztlich auch ein AVR).

Aber auch dort erledigt man das in aller Regel am Anfang von main().
Wer es ganz dringend schon vorher braucht, kann halt die .initN-Hooks
nehmen, auf die weiter oben bereits verwiesen worden ist.
Gast #3296880
Lesenswert?

Jörg Wunsch schrieb:
>> dann muss mein Tiny kein AVR sein, denn dort schalte ich zu laufzeit von
>> den Quarz um.
>
> Eine der ganz wenigen Ausnahmen.  Fast alle können das nicht.  Du
> müsstest also schon genauer sagen, welcher das ist … habe ich bei
> Nicht-Xmegas bislang nur bein den kleinen USB-Controllern gesehen
> (ATmega16U2 etc.).

müsste der sein ATtiny1634 - er schein wirklich ein exot zu sein weil er 
du pull-ups auch anders einschaltet. Aber ich finde das PinOut sehr gut.
Gast #3296884
Lesenswert?

Erst mal danke für die vielen Antworten. Ich habe die Datei crt1/gcrt1.S 
in der avr-libc gefunden, die genau solche Dinge wie die 
Interrupt-Vektoren und die Initialisierung von .data und .bss enthält. 
Nach einem Blick in mein map-File habe ich jetzt gesehen, dass für die 
in gcrt1.S implementierten Funktionen gegen das Object-File 
avr/lib/avr51/crtm1281.o gelinkt wird. Ich vermute mal dabei handelt es 
sich dann um den konkrete Umsetzung für meinen ATmega1281, richtig?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren