Forum: Mikrocontroller und Digitale Elektronik Wo finde ich Low-Level-Initialisierungscode bei AVR-MCUs?


von Obs (Gast)


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.

von Georg G. (df2au)


Lesenswert?

<Vermutung: Du meinst ATMega oder ATtiny, wenn du "AVR-MCU" schreibst>
Falls du mit GCC und AVR-Studio arbeitest, sieh dir das .lss File an.
</Vermutung>

von Nicolas S. (Gast)


Lesenswert?

Obs schrieb:
> unter anderem die PLLs

Ich habe noch keinen Hinweis darauf gefunden, daß ein AVR überhaupt eine 
PLL hat- ich weiß nur von einem Taktteiler und von einem RC-Oszillator.

von ORB (Gast)


Lesenswert?

Was muß den bei den Megas und Tinys initialisiert werden?
Alles was Du nicht im Programm festlegst (Clocksource, BOD, ...) steht 
in den Fuses.

von Obs (Gast)


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?

von Kindergärtner (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von Stephan B. (matrixstorm)


Lesenswert?


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von spess53 (Gast)


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

von amateur (Gast)


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.

von Soul E. (Gast)


Lesenswert?

Obs schrieb:

> wo finde ich bei meiner AVR-MCU den Low-Level-Initialisierungscode, der
> gleich nach dem Systemstart, also nach der ResetException, ausgeführt
> wird?

Die Datei heisst üblicherweise Cstartup.s oder Cstartup.asm -- je nach 
Compiler.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

soul eye schrieb:
> Die Datei heisst üblicherweise Cstartup.s oder Cstartup.asm -- je nach
> Compiler.

Nein, sie heißt hier eben gcrt1.S, und sie wird üblicherweise
erstmal nicht als Sourcecode mit ausgeliefert.

von Peter D. (peda)


Lesenswert?

Obs schrieb:
> Auch wenn er keine PLL hat, wird ja
> vermutlich auch der RC-Oszillator eine Art Initialisierung brauchen.

Nein, beim AVR lassen sich die Taktquellen nicht zur Laufzeit auswählen.
Das geht nur beim Programmieren über die berüchtigten Fuse-Bits 
(versehentliches Aussperren möglich!).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Peter II (Gast)


Lesenswert?

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

dann muss mein Tiny kein AVR sein, denn dort schalte ich zu laufzeit von 
den Quarz um.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter II 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.).

von Peter II (Gast)


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.

von Obs (Gast)


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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Obs schrieb:
> Ich vermute mal dabei handelt es sich dann um den konkrete Umsetzung für
> meinen ATmega1281, richtig?

Genau so ist es.

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.